Skip to main content

Suapy — biblioteca Python para a API do SUAP

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

suapy-1.4.0.tar.gz (964.7 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

suapy-1.4.0-py3-none-any.whl (14.7 kB view details)

Uploaded Python 3

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

Hashes for suapy-1.4.0.tar.gz
Algorithm Hash digest
SHA256 adf09517b43f34e9552ea746c69ca5a8b4b05a486213823869af799ac0d0cc7e
MD5 d857c7eeb3d55b1f05f6e88a78b82981
BLAKE2b-256 827bc6d09496d8a14edcc72e6351646851562ea71551aed74b79bd09dbb136d0

See more details on using hashes here.

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

Hashes for suapy-1.4.0-py3-none-any.whl
Algorithm Hash digest
SHA256 be6d2225fa2b0c1e75a21f88f15f229bd03901bb16334cdba3850ac344952d7a
MD5 67c657a41f6ef705caac48f0fbc6fcce
BLAKE2b-256 05c8504ee6536b41964d2ed5c7933e60d0b58dc671a221c7585362753a5d5f86

See more details on using hashes here.

Release history Release notifications | RSS feed

This release

1.4.0 This release

2 files

1.3.0

2 files

1.2.0

2 files

1.1.0

2 files

1.0.0

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page