📚 Criando uma API open-source para questões do ENEM
Olá turma do TabNews! Hoje gostaria de compartilhar com vocês um pouco sobre a origem e processo de criação do projeto enem.dev, uma API pública e open-source para listagem de provas e questões do ENEM.
Atualmente a API conta com 2700+ questões, dos anos de 2009 a 2023. Mas também planejo mantê-la atualizada com os dados dos anos subsequentes.
Como o projeto surgiu
A cerca de 6 meses atrás, recebi uma demanda na empresa onde eu trabalho, na qual seria necessário montar alguns quizzes utilizando os dados de questões do ENEM. Para minha surpresa, não havia nenhum lugar onde esses dados estivessem disponíveis de forma simples, e que pudessem ser acessados de forma programática, como uma API ou mesmo alguns arquivos JSON.
O que eu encontrei como fonte de dados foram alguns PDFs disponibilizados pelo INEP, da aplicação de cada prova em seu respectivo ano. Com isso, inicializou-se um longo e cansativo processo de tratamento de dados, com a finalidade de transformá-los em algo “utilizável”, programaticamente falando.
Ao fim deste processo, surgiu a ideia de criar uma API, com a intenção de facilitar o acesso a esses dados, para que outros desenvolvedores no futuro não precisassem gastar a mesma energia que eu gastei.
Os desafios e o que aprendi com eles
Visto que meus inputs seriam alguns PDFs, a ideia central era transformá-los em arquivos JSON, nos quais eu pudesse usar de forma mais simples na hora da criação dos quizzes. No entanto, esse processo é mais fácil na teoria do que na pratica.
Minha primeira tentativa foi transformar esses PDFs em texto e extrair os dados utilizando algumas RegEx. Apesar de ter sucesso em separar as questões e quais seriam as alternativas de cada questão, eu logo esbarrei no meu primeiro desafio: obter as imagens da questão e as alternativas corretas.
Além disso, a conversão de PDF para texto não era confiável e frequentemente trazia alguns caracteres especiais. Foi então que passei a transformar cada página do PDF em uma imagem, e editá-la de forma programática, transformando-as no que eu denominei de “stripes”.
Isso tornou a extração de texto um pouco mais assertiva, e permitiu a extração das imagens através de uma fórmula, que julgava se havia ou não uma imagem na questão baseado no espaçamento entre as linhas.
Ainda assim, havia outros desafios a serem enfrentados, como a formatação e layout de cada prova, que mudava conforme o ano em que a prova era aplicada. Mas o principal problema ainda era o fato de que eu não tinha confiança na assertividade do script, o que me fez mudar para a próxima (e última) estratégia: um bom e velho web scraper.
Apesar de trabalhoso, essa foi uma oportunidade de aprender sobre (ou aprofundar em) vários assuntos: como OCR, RegEx e manipulação de imagens utilizando sharp.
O que eu gostaria de deixar como recado aqui é: não tenha medo de embarcar nessas “aventuras”, apesar do código das primeiras tentativas não ter sido utilizado para a task final, há muito conhecimento valioso a ser absorvido ao longo do caminho.
Ideias de projetos
Afinal, agora que temos essa API, o que podemos construir com isso? Bom, aqui estão algumas ideias de projetos:
- Flashcards — Uma ideia para treinar um pouco de UI/UX e aprofundar seus conhecimentos em front-end. A frente do card pode conter a questão e o verso a alternativa correta.
- SDK para a linguagem X — Pra quem nunca criou e/ou publicou uma biblioteca em um package manager, essa pode ser uma oportunidade de aprender mais sobre esse processo. Além é claro, de lidar com CI/CD e os desafios de manter um projeto open-source.
- Análise de dados — Se você tem interesse em aprender sobre machine learning e possivelmente tornar-se um analista de dados, sinta-se livre para fazer um estudo em cima dos dados brutos, quem sabe encontrar algum padrão nas questões, identificar os assuntos que são cobrados com mais frequência e até mesmo sugerir uma rotina de estudo mais otimizada.
- Inteligência Artificial — Que tal embarcar no hype da IA e treinar um modelo em cima desses dados? Imagine os prompts que o usuário poderia fazer nesse modelo, como por exemplo, pedir uma questão sobre geometria plana e a explicação de como resolvê-la.
Se você não planeja construir algo, mas tem alguma ideia interessante, considere compartilhar ela nos comentários, pois algum desenvolvedor motivado pode transformá-la em realidade.
Caso você venha a construir algo, considere compartilhar no repositório do GitHub através de uma issue. Dependendo da quantidade de submissões, posso criar uma seção no site para divulgá-los.
Conclusão
Por fim, agradeço por terem lido até aqui e espero que essa API possa mexer um pouquinho no ponteiro da educação brasileira. Para isso, gostaria muito de contar com a sua colaboração, seja através de um projeto que utilize da API, feedback nos comentários, compartilhando o projeto com amigos, ou deixando uma estrelinha no GitHub :)
Resumo do Pull Request:
Este pull request adiciona uma nova funcionalidade à API para permitir a recuperação de questões do ENEM com base em disciplinas e ano. As principais alterações incluem:
- Criação do endpoint
getQuestionByDisciplines
: Adiciona um novo endpoint para buscar questões filtradas por disciplinas específicas e ano. - Implementação da função
getQuestionByDisciplines
: Função responsável por recuperar as questões do banco de dados com base nos parâmetros fornecidos (disciplina e ano). - Adição da rota: Implementa a rota correspondente no servidor para a nova funcionalidade.
- Definição do schema
GetQuestionByDisciplinesQuerySchema
: Adiciona o schema para validar os parâmetros de consulta usados na nova API.
Essas alterações permitem aos usuários obter questões específicas de acordo com a disciplina e o ano desejados, melhorando a flexibilidade e a usabilidade da aplicação.
Caraca man, que projeto incrível! Meus parabéns, com essa API que você fez, me deu ideias grandes de como fazer alguns projetos que já havia em mente durante um tempo.
Cara, meus parabéns! Tu trouxe pra nossa realidade de dev algo muito comum e super necessário pro cotidiano dos estudantes BR. Sinceramente fiquei super no hype com essa api e espero poder usar e contribuir muito.
Sensacional! Obrigado por isso!
Um tempo atrás eu procurei por algo assim pra uma ideia de projeto, acho que agora posso retomar hehe
Incrivel!!!
Há um tempo atrás tinha um projeto que envolvia o enem e suas questões, e ele foi descontinuado justamente pela dificuldade de obter as questões.
Se precisar de alguma ajuda com o projeto pode me chamar que vou adorar contribuir.
Sugestão: disponibilizar também os dados dos parâmetros do modelo de TRI usado nos itens (quando disponíveis, mas a tendência atual é que sejam divulgados antes do período de 5 anos, que era padrão). Isso tornaria a API totalmente única e diferenciada. Parabéns pelo projeto!
eu consigo replicar essa mesma logica para outros concursos, como provas militares e etc ?! sou iniciante e nao sei como fazer um app de questões para um projeto freelancer que peguei
Extremamente interessante, vou dar uma lida pois tenho um projeto na faculdade para questões ENADE para ser usado em sala de aula, e devem ser poucas alterações da sua API
Pô cara, que trabalho incrível! E que massa você ter compartilhado os desafios e as soluções encontradaas.
Cara que trabalho incrível! Já tinha pensando em fazer algo que utilizasse questões do ENEM, mas esbarrei nesse mesmo problema. Fico feliz que você tenha conseguido resolver e ainda deixou open-source, existem muitas possibilidades de projetos interessantes com essa API.
Ótimo trabalho e grande aprendizado, tudo é uma questão de experiência e querer torna-lo possível mesmo com as barreiras do conhecimento. Recomendo colocar um Botão para doação do seu ☕ cafézinho!
Ficou sensacional demais, meu cabra! A gente podia fazer um portalzinho com isso ein, que que acha? :eyes:
Muito bom, parabens.
Isso com certeza ajudara muitos devs a ter uma base para projetos open source.
Parabén pela iniciativa, esse é um conteúdo que realmente é difícil de conseguir, ter uma api open source disso pode abrir portar para vários projetos interessantes que vão ajudar estudantes para o enem, dei uma olhada na documentação e achei excelente, imagino o trabalho que deve ter dado todo esse processo, além das frustrações que ocorreram durante o caminho. Mas acredito que o mais importante é o aprendizado adquirido com isso.
Parabéns pela inciativa e obrigado por contribuir com a comunidade open source.
Cara, que legal e inspirador!! Ver esse seu post me motivou agora a embarcar em uma idéia que eu tenho. Eu gosto muito de assistir provas de ciclismo de estrada europeu e nacional, além disso gosto de acompanhar os resultados das corridas. Porém tirando as grandes provas, muitas eu não sei quando ocorrem ou não consigo ver o resulto sem que veja por algum acaso um post nas redes sociais que acompanho. Então vou tentar fazer um scrapping que me retorne os resultados das corridas em um numero x de dias, assim como um ranking atualizado contendo a pontuação dos ciclistas no ranking mundial. Nunca fiz nada desse tipo pois sou um iniciante, mas estou motivado e creio que isso vai me ajudar a aprender!! (Aceito conselhos, dicas, o que for!!)
Belíssima iniciativa! Parabéns!