Python wrapper e CLI para a API v2 do SUAP — compatível com qualquer instituição que utilize o SUAP (IFPI, IFRN, IFCE, etc.)
Project description
suap-api-wrapper
CLI e biblioteca Python para interagir com a API v2 do SUAP. Funciona com qualquer instituição que utilize o SUAP (IFPI, IFRN, IFCE, etc.), basta informar a URL da sua instância no login.
Requisitos
- Python 3.8+
- pip
Instalação
Clone o repositório e instale o pacote:
git clone https://github.com/Junio-Alves/suap-api-wrapper.git
cd suap-api-wrapper
pip install .
Para instalar também as dependências de desenvolvimento (testes, mypy):
pip install ".[dev]"
Após a instalação, o comando suap estará disponível no terminal.
Uso da CLI
Login
suap login
Você será solicitado a informar:
- URL da instância — a URL completa do seu SUAP. Formatos aceitos:
https://suap.ifpi.edu.brsuap.ifpi.edu.br(ohttps://é adicionado automaticamente)
- Matrícula
- Senha — ocultada durante a digitação
Os tokens JWT são salvos em ~/.suap/tokens.json com permissão restrita (600). A URL e a matrícula são salvas em ~/.suap/config.json, também com permissão 600.
Logout
suap logout
Remove os tokens do keyring e apaga o arquivo de configuração.
Dados pessoais
suap meus-dados
Períodos letivos
suap periodos
Diários de um semestre
suap diarios <semestre>
Exemplo:
suap diarios 2024.1
Professores de um diário
suap professores <id_diario>
Aulas de um diário
suap aulas <id_diario>
Materiais de um diário
suap materiais <id_diario>
Detalhes de um material
suap material <id_material>
Baixar PDF de um material
suap material-pdf <id_diario> <id_material>
Salva o PDF em um arquivo temporário e imprime o caminho. Exemplo:
suap material-pdf 42 10
# /tmp/suap_material_10_abc123.pdf
Trabalhos de um diário
suap trabalhos <id_diario>
Disciplinas de um semestre
suap disciplinas <semestre>
Exemplo:
suap disciplinas 2024.1
Dados acadêmicos do aluno
suap dados-aluno
Requisitos de conclusão do curso
suap conclusao
Fluxo típico de uso
# 1. Login
suap login
# 2. Ver os semestres disponíveis
suap periodos
# 3. Listar os diários de um semestre
suap diarios 2024.1
# 4. Com o ID de um diário, ver aulas, materiais e trabalhos
suap aulas 42
suap materiais 42
suap trabalhos 42
# 5. Baixar o PDF de um material
suap material-pdf 42 10 -o aula1.pdf
Uso como biblioteca
from suap_api import SuapClient
with SuapClient() as client:
dados = client.get_my_data()
periodos = client.get_periods()
diarios = client.get_diaries("2024.1")
if diarios:
id_diario = diarios[0]["id"]
aulas = client.get_diary_classes(id_diario)
materiais = client.get_diary_materials(id_diario)
trabalhos = client.get_diary_assignments(id_diario)
# Baixar PDF de um material (retorna bytes)
if materiais:
pdf_bytes = client.get_material_pdf(id_diario, materiais[0]["id"])
# use os bytes como quiser: salvar, exibir, enviar, etc.
dados_aluno = client.get_student_data()
conclusao = client.get_graduation_requirements()
Para uso sem sessão salva (passando credenciais diretamente no código):
from suap_api import SuapClient
with SuapClient(
base_url="https://suap.ifpi.edu.br",
username="20221234",
password="sua_senha",
) as client:
dados = client.comum.get_my_data()
Tratamento de erros
Todas as exceções herdam de SuapError:
| Exceção | Quando ocorre |
|---|---|
SuapAuthError |
Matrícula ou senha incorretos |
SuapConnectionError |
Falha de rede, URL errada, timeout, SSL |
SuapTokenExpiredError |
Sessão expirada (refresh falhou) |
SuapNotLoggedInError |
Nenhuma sessão encontrada |
SuapValidationError |
Parâmetro inválido enviado à API (HTTP 422) |
SuapNotFoundError |
Recurso não encontrado (HTTP 404) |
SuapForbiddenError |
Sem permissão de acesso (HTTP 403) |
SuapServerError |
Erro interno do servidor SUAP (HTTP 5xx) |
SuapRequestError |
Outros erros HTTP |
from suap_api import SuapClient, SuapNotFoundError, SuapValidationError
try:
with SuapClient() as client:
aulas = client.get_diary_classes(99999)
except SuapNotFoundError:
print("Diário não encontrado.")
except SuapValidationError as e:
print(f"Parâmetro inválido: {e}")
Desenvolvimento
Rodando os testes
pytest tests/ -v
Checagem de tipos
mypy suap_api/
Estrutura do projeto
suap-api-wrapper/
├── suap_api/
│ ├── __init__.py # exports públicos
│ ├── client.py # SuapClient
│ ├── cli.py # comandos Click
│ ├── config.py # gestão de configuração (~/.suap/)
│ └── exceptions.py # exceções customizadas
├── tests/
│ ├── test_client.py
│ ├── test_cli.py
│ └── test_config.py
├── docs/
│ └── plan.md
└── pyproject.toml
Segurança
- Os tokens JWT são armazenados em
~/.suap/tokens.jsoncom permissão600(somente o dono pode ler/escrever). - O arquivo
~/.suap/config.jsoné criado com permissão600(somente o dono pode ler/escrever). - SSL é sempre verificado. Não há opção para desativá-lo.
- Todas as requisições têm timeout de 10 segundos.
Licença
Distribuído sob a licença MIT. Veja o arquivo LICENSE para mais detalhes.
Autor
Junio Alves — frjunioalves@hotmail.com
Contribuições, issues e pull requests são bem-vindos!
Project details
Release history Release notifications | RSS feed
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 suap_api_wrapper-0.1.0.tar.gz.
File metadata
- Download URL: suap_api_wrapper-0.1.0.tar.gz
- Upload date:
- Size: 15.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
355e142cbd83f95e7300988f429f0b4652fa161f415ac872992d5dfd5e5ac765
|
|
| MD5 |
e0c87e5380dcb9235402c95c75fdf6b3
|
|
| BLAKE2b-256 |
1d80d86691e66ab22c9d65a55e673bba87479601478a8dfb766d9087fa600abf
|
File details
Details for the file suap_api_wrapper-0.1.0-py3-none-any.whl.
File metadata
- Download URL: suap_api_wrapper-0.1.0-py3-none-any.whl
- Upload date:
- Size: 20.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
378fcb81ca834458f1bb7ff14ef45775ed17ba1d2fd065bf6d0c7dd9772bfcd3
|
|
| MD5 |
7a582beb106256846473d5a253f75489
|
|
| BLAKE2b-256 |
75668d4a1034281a9ed27497438f027d71cd3cd1e36cbf67260a7b187e5ae3a9
|