Suapy
Consulte boletim, faltas, horários e avaliações do SUAP com Python ou pelo terminal. Os métodos são em português e usam a API do IFRN por padrão. Outras instituições podem ter endpoints ou permissões diferentes; a compatibilidade não é garantida.
PyPI · Código-fonte · Relatar problema
Instalação
Requer Python 3.10 ou superior. A versão 1.4 passa a exigir esse mínimo.
python -m pip install suapy
Para usar a conversão de dados com Pandas:
python -m pip install "suapy[pandas]"
Pelo terminal
suapy
Informe sua matrícula e senha. O menu permite consultar boletim e faltas, horário do dia, progresso do curso e eventos. A senha não aparece enquanto você digita.
O terminal guarda um refresh token em ~/.suapy/session.json para restaurar o
acesso. Esse arquivo contém uma credencial em texto simples, embora não contenha
sua senha. Em sistemas POSIX, a pasta tem permissão 700 e o arquivo 600;
em outros sistemas, o acesso depende das permissões da conta e do diretório.
A opção Sair mantém a sessão. Para removê-la deste computador, use a opção Encerrar sessão e sair ou execute:
suapy --logout
Isso remove o token local; não o revoga no servidor.
Em Python
O exemplo consulta os períodos disponíveis e busca o boletim do mais recente. A senha é solicitada no terminal, sem ficar escrita no código.
from getpass import getpass
from suapy import Suap, SuapError
try:
with Suap() as suap:
suap.login(input("Matrícula: "), getpass("Senha: "))
periodos = list(suap.iterar_resultados(
suap.ensino.obter_periodos_letivos()
))
if periodos:
atual = max(periodos, key=lambda p: (
int(p["ano_letivo"]), int(p["periodo_letivo"])
))
resposta = suap.ensino.obter_boletim(
atual["ano_letivo"], atual["periodo_letivo"]
)
for disciplina in suap.iterar_resultados(resposta):
print(
disciplina.get("disciplina", "Sem nome"),
"— faltas:", disciplina.get("numero_faltas", "—"),
"— média:", disciplina.get("media_final_disciplina", "—"),
)
else:
print("Nenhum período letivo disponível.")
except SuapError as erro:
print(f"Não foi possível consultar o SUAP: {erro}")
O bloco with fecha as conexões ao terminar. Sem ele, chame suap.fechar().
A biblioteca mantém tokens somente em memória; a gravação em disco é uma função do CLI.
Consultas disponíveis
Os retornos dependem do perfil da conta e dos dados cadastrados na instituição.
Método de suap.ensino |
Consulta |
|---|---|
obter_dados_aluno() |
Dados institucionais do aluno |
obter_periodos_letivos() |
Períodos disponíveis para consulta |
obter_boletim(ano, periodo) |
Notas, faltas e situação por disciplina |
obter_proximas_avaliacoes() |
Avaliações cadastradas |
obter_turmas_virtuais(ano, periodo) |
Turmas, horários e locais de aula |
obter_turma_virtual(pk) |
Detalhes de uma turma |
obter_mensagens_aluno(status="nao_lidas") |
Mensagens: nao_lidas, lidas ou todas |
obter_requisitos_conclusao() |
Progresso e carga horária do curso |
obter_eventos() |
Eventos institucionais |
obter_diarios(ano=None, periodo=None) |
Diários; pode exigir perfil de professor |
Para faltas e notas de alunos, use obter_boletim(). A biblioteca também expõe
os módulos usuario, infraestrutura e pesquisa_extensao; consulte os
métodos no código.
Respostas e paginação
Os métodos devolvem o JSON da API sem alterar sua estrutura. Uma consulta pode
retornar uma lista, um objeto ou uma página com results e next.
Para uma consulta de listagem, suap.iterar_resultados(resposta) aceita tanto
listas quanto páginas e busca as páginas seguintes conforme você itera.
Objetos de detalhe, como os dados do aluno, devem ser usados diretamente.
# Com suap já autenticado:
resposta = suap.ensino.obter_proximas_avaliacoes()
for avaliacao in suap.iterar_resultados(resposta):
print(avaliacao.get("disciplina"), avaliacao.get("data_avaliacao"))
O iterador rejeita links de outra origem e ciclos de paginação. Ele não ordena os registros; a primeira avaliação recebida não é necessariamente a próxima por data.
Análise com Pandas
import pandas as pd
from suapy import para_dataframe
# Com suap autenticado e ano/periodo escolhidos:
resposta = suap.ensino.obter_boletim(ano, periodo)
df = para_dataframe(list(suap.iterar_resultados(resposta)))
if "media_final_disciplina" in df.columns:
notas = pd.to_numeric(df["media_final_disciplina"], errors="coerce")
if notas.notna().any():
print(f"Média simples das notas disponíveis: {notas.mean():.2f}")
Essa média não representa necessariamente o índice acadêmico da instituição.
Para converter apenas uma página envelopada, use
para_dataframe(resposta, chave="results"). A conversão não busca outras páginas.
O Pandas só é importado quando essa função é chamada.
Horários
from suapy import parse_horario
for aula in parse_horario("2V34 / 4V56"):
print(aula["dia_semana"], aula["turno"], aula["horarios"])
# Segunda Tarde [3, 4]
# Quarta Tarde [5, 6]
Os números indicam tempos de aula, não horas do relógio. Os horários exatos dependem do campus. Trechos que não correspondem ao formato são ignorados.
Conexão e erros
from suapy import Suap
suap = Suap(
url_base="https://suap.ifrn.edu.br",
timeout=(5, 30), # conexão e espera de leitura, em segundos
)
suap.fechar()
A verificação TLS fica habilitada. Redirecionamentos HTTP não são seguidos.
Ao receber 401, o cliente tenta renovar o token e repetir a chamada uma vez,
se houver refresh token. Não há repetição automática para falhas de rede.
| Exceção | Situação |
|---|---|
SuapAuthError |
Autenticação inválida, token ausente ou acesso negado (401/403) |
SuapApiError |
Outros erros HTTP, JSON inválido ou paginação inválida |
SuapError |
Classe base; também cobre timeout e falha de conexão |
Capture as exceções específicas antes de SuapError quando precisar distinguir
as causas. SuapApiError disponibiliza status_code e response quando aplicáveis.
Desenvolvimento
Veja o guia de contribuição para instalar o projeto, executar os testes e preparar uma distribuição. As mudanças estão no changelog.
Projeto independente, sem afiliação oficial ao IFRN ou ao SUAP. Distribuído sob a licença MIT.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file suapy-1.4.0.tar.gz.
File metadata
- Download URL: suapy-1.4.0.tar.gz
- Upload date:
- Size: 964.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/7.0.0 CPython/3.13.15
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
adf09517b43f34e9552ea746c69ca5a8b4b05a486213823869af799ac0d0cc7e
|
|
| MD5 |
d857c7eeb3d55b1f05f6e88a78b82981
|
|
| BLAKE2b-256 |
827bc6d09496d8a14edcc72e6351646851562ea71551aed74b79bd09dbb136d0
|
File details
Details for the file suapy-1.4.0-py3-none-any.whl.
File metadata
- Download URL: suapy-1.4.0-py3-none-any.whl
- Upload date:
- Size: 14.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/7.0.0 CPython/3.13.15
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
be6d2225fa2b0c1e75a21f88f15f229bd03901bb16334cdba3850ac344952d7a
|
|
| MD5 |
67c657a41f6ef705caac48f0fbc6fcce
|
|
| BLAKE2b-256 |
05c8504ee6536b41964d2ed5c7933e60d0b58dc671a221c7585362753a5d5f86
|