geovaneschmitz / sigaa-api Goto Github PK
View Code? Open in Web Editor NEWUnofficial high performance API for SIGAA (Sistema Integrado de Gestão de Atividades Acadêmicas) using web scraping.
License: MIT License
Unofficial high performance API for SIGAA (Sistema Integrado de Gestão de Atividades Acadêmicas) using web scraping.
License: MIT License
Ao clonar, instalar o repositório diretamente do GitHub e iniciar a suite de teste com npm test
, todos os testes passam, exceto o da teacher.spec.ts
com esta mensagem:
FAIL src/tests/search/teacher.spec.ts
● Test suite failed to run
SIGAA: SharedReturn is only supported on methods.
14 | ): void {
15 | if (target.kind !== 'method')
> 16 | throw new Error('SIGAA: SharedReturn is only supported on methods.');
| ^
17 |
18 | const originalMethod = target.descriptor.value; // save a reference to the original method
19 | const store = '__sharedReturn' + target.key;
at src/helpers/sigaa-shared-return-decorator-factory.ts:16:13
at Object.<anonymous>.__decorate (src/courses/sigaa-course-student-factory.ts:5:110)
at Object.<anonymous> (src/courses/sigaa-course-student-factory.ts:34:3)
at Object.<anonymous> (src/sigaa-main.ts:25:1)
Aventurando-me um pouco mais no erro, percebi que a falha vem diretamente da instância da classe Sigaa, que importamos da sigaa-main
. A stack de erros mostra outro erro vindo da src/courses/sigaa-course-student-factory.ts
, onde um erro se mostra na importação da interface CourseStudentData. À princípio, o meu VSCode detalha que a seguinte mensagem na interface:
Um tipo referenciado em uma assinatura decorada deve ser importado com 'tipo de importação' ou uma importação de namespace quando 'isolatedModules' e 'emitDecoratorMetadata' estão habilitados.ts(1272)
sigaa-course-student-factory.ts(9, 3): 'CourseStudentData' foi importado aqui.
Eu nunca vi esse erro na minha vida, então fui tentando modificar algumas características do código, mas nada retirou este erro. Mudei o import para import type e a sugestão do VSCode desapareceu, mas o erro continuou.
Se alguém tiver alguma ideia de como arrumar isso, ficarei grato, porque queria fazer testes tbm para a issue #39 e #40 .
O sigaa da ufrb tem url: https://sistemas.ufrb.edu.br.
Ao tentar apenas efetuar o login, aparece o seguinte erro:
C:\Users\nessa\Desktop\coding\reactjs\sigaa\ok\node_modules\sigaa-api\src\session\login\sigaa-login-ifsc.ts:93 throw new Error(this.errorInvalidCredentials); ^ Error: SIGAA: Invalid credentials. at SigaaLoginIFSC.parseDesktopLoginResult (C:\Users\nessa\Desktop\coding\reactjs\sigaa\ok\node_modules\sigaa-api\src\session\login\sigaa-login-ifsc.ts:93:15) at processTicksAndRejections (node:internal/process/task_queues:95:5) at SigaaLoginIFSC.desktopLogin (C:\Users\nessa\Desktop\coding\reactjs\sigaa\ok\node_modules\sigaa-api\src\session\login\sigaa-login-ifsc.ts:65:12) at SigaaLoginIFSC.login (C:\Users\nessa\Desktop\coding\reactjs\sigaa\ok\node_modules\sigaa-api\src\session\login\sigaa-login-ifsc.ts:77:20) at Sigaa.login (C:\Users\nessa\Desktop\coding\reactjs\sigaa\ok\node_modules\sigaa-api\src\sigaa-main.ts:309:18) at main (C:\Users\nessa\Desktop\coding\reactjs\sigaa\ok\node_modules\sigaa-api\src\sigaa-main.ts:353:19) [nodemon] app crashed - waiting for file changes before starting...
Quando instalo a api no meu projeto e passo minhas credenciais, recebo esse erro:
.../sigaa-login-ifsc.ts:93
throw new Error(this.errorInvalidCredentials);
^
Error: SIGAA: Invalid credentials.
Pontos importantes:
Decidi clonar o repositório para testar os examples
importando a class Sigaa
diretamente dos arquivos do projeto:
//examples/get-account-info.js
const { Sigaa } = require('../dist/sigaa-main.js');
const sigaa = new Sigaa({
url: 'https://sigaa.unb.br'
});
Dessa maneira colocando minhas credenciais, funcionou perfeitamente e meus dados foram trazidos.
Ao rodar o examples/search-teachers.js
, só que dessa vez utilizando const { Sigaa } = require('sigaa-api');
, chega a me retornar o resultado da pesquisa de professores com todos os dados, mas ao fim ainda joga o mesmo erro de SIGAA: Invalid credentials
, o que é interessante porque nesse sample e no método de search
em si as credenciais de login não são requeridas.
Não sei se ajuda, mas ao entrar no portal essas são as requisições feitas e os status retornados:
Não consegui identificar a solução, mas eu espero que esses debugs ajudem a descobrir
Olá, estou recebendo o seguinte erro:
Error: SIGAA_UNKNOWN_USER_TYPE
at SigaaLogin._parseLogin (C:\Users\Duarte\Desktop\SIGAA-node-interface-master\libs\common\sigaa-login.js:140:17)
at SigaaLogin.login (C:\Users\Duarte\Desktop\SIGAA-node-interface-master\libs\common\sigaa-login.js:106:25)
at processTicksAndRejections (node:internal/process/task_queues:93:5)
at async Sigaa.login (C:\Users\Duarte\Desktop\SIGAA-node-interface-master\index.js:65:7)
Creio que seja por causa de quando é feito o login, é redirecionado para uma página de seleção de vínculos, algum jeito de resolver isso? teremos que mudar o codigo?
Estou desenvolvendo um sistema que recomenda matrícula em disciplinas baseado no histórico acadêmico da pessoa: o que já cursou, o que ainda falta cursar etc.
Para isso, preciso de informações sobre departamentos, currículos e componentes (pré-requisitos, corequisitos e equivalências).
Obs.: No SIGAA da UnB, as disciplinas são, na verdade, um componente do tipo disciplina.
um componente pode ser do tipo disciplina, atividade, bloco ou módulo. Dá uma olhada aqui.
Há alguma forma de obter os dados de todos os componentes/disciplinas?
Estava desenvolvendo um scraper para obter tais dados, porém acho mais interessante contribuir para o projeto.
No arquivo de exemplo da API no repositorio "get-grades-simultaneously.js" quando é testado funciona perfeitamente. Porém quando é utilizado o recurso Promise.all
com outras partes da API como pegar as lessons ou absences dos cursos é dado o erro de "API Error: Sigaa: using the old page coused the change to the last accessed course instead of the resquested course". No codigo esse erro ocorre quando uma pagina não é a que foi informada. Em seguida tem um codigo que gera esse erro.
Tentei deixar o mais parecido com o exemplo do repositorio para não haver duvidas que é um bug de verdade.
const { Sigaa } = require("sigaa-api");
const username = "";
const passwd = "";
const options = {
url: "",
institution: "",
};
async function getCoursesObject(courses) {
const coursesResult = await Promise.all(
courses.map(async (course) => {
const sigaaInstanceOfCourse = new Sigaa(options);
// pega as notas de cada turma simultaneamente
console.log("Logando para a turma: " + course.title);
const account = await sigaaInstanceOfCourse.login(username, passwd); // login
const bonds = await account.getActiveBonds();
const bondOfCourse = bonds.filter((b) => b.type === "student")[0]; // pega o vinculo da turma
const courses = await bondOfCourse.getCourses(true);
const courseSelected = courses.filter((c) => c.id === course.id)[0]; // pega a turma especificada
var topics = [];
const topicsArray = await courseSelected.getLessons();
for (const topic of topicsArray) {
const subitems = [];
for (const attachment of topic.attachments) {
subitems.push({
title: attachment.title,
type: attachment.type,
});
}
const topicData = {
title: topic.title,
date: topic.startDate.toString() + " - " + topic.endDate.toString(),
content: topic.contentText,
subitems: subitems,
};
topics.push(topicData);
}
const absencesCourse = await course.getAbsence();
account.logoff();
return {
info: {
title: course.title,
code: course.code,
students: String(course.numberOfStudents),
schedule: course.schedule.split(" ")[0],
},
topics,
absences: {
totalAbsences: absencesCourse.totalAbsences,
maxAbsences: absencesCourse.maxAbsences,
},
};
})
);
return coursesResult;
}
async function main() {
const sigaa = new Sigaa(options);
console.log("Logging...");
const account = await sigaa.login(username, passwd);
console.log("Loged");
const studentBond = (await account.getActiveBonds()).filter(
(bond) => bond.type === "student"
)[0];
const allCourses = await studentBond.getCourses(true);
console.log("Getting course infos...");
const results = await getCoursesObject(allCourses);
console.log(results);
}
main().then(() => {
process.exit(0);
});
Este bug ja foi mencionado em um commit que resolvia esses bug. Eu tentei debugar um pouco o código e suspeitei do cache tentei fazer poucas alterações, mas pouco surgiu efeito. No decorator sharedReturn
a variavel de cache de paginas __sharedReturn...
que fica dentro da instância da API está armazenando somente uma pagina de curso e o resto de undefined
na Map do cache. Não tenho certeza, mas acho que era para ter mais de uma pagina em cache no momento do código que verifiquei. Talvez seja a stack de promises, porém não verifiquei.
Parece que qualquer método async que é utilizado dentro da Promise.all
tirando o método grades da este erro, exceto quando é utilizado somente 2 cursos, porem com 3 ou mais é dado esse erro.
Na página /sigaa/public/turmas/listar.jsf dos SIGAAs, vemos uma página que lista cada disciplina oferencida de um determinado campus e período letivo. Esta página mostra dados interessantes de cada disciplina que podem ser interessantes de serem analisadas em diversas atividades de análise de dados, como:
* Muitas salas estão como "A definir", o que atrapalha análises dessas informações.
** Pelo jeito, nem todos os SIGAAs e períodos letivos mostram as vagas que foram disponibilizadas.
Penso que a API possa gerar uma lista em JSON, do mesmo padrão da feita em em search.teacher().getCampusList()
. Como uma espécie de search.getSubjectList(campus)
ou algo parecido.
[
{
ID: "FCI0001",
name: "TÓPICOS ESPECIAIS EM BIBLIOTECONOMIA E CIÊNCIA DA INFORMAÇÃO",
turmas: [
{
ID: 1,
professor: "AILTON LUIZ GONCALVES FEITOSA",
local: "FCI - LEV",
horário: "6M1234"
},
]
},
]
Fonte do exemplo: https://sigaa.unb.br/sigaa/public/turmas/listar.jsf no dept de Faculdade de Ciência de Dados - 2023.1
(To estudando ainda, então posso estar bem errado)
Dei uma olhada no código que há na API e acredito que não seja algo complicado de fazer. Não precisa de autenticação nenhuma, a parte provavelmente mais difícil deve ser o método http.POST
que deve ser feito para que os resultados da pesquisa apareçam na página web. Esse método pelo que eu tinha visto precisa de um cookie do http.GET
da página para não gerar erros, mas como vocês parecem já ter uma interface para a extração dos Cookies da página, deve ser simples.
Essa funcionalidade era algo que eu estava tentando fazer antes de conhecer o repositório. Assim que conheci, percebi que vocês têm muita mais estrutura que eu para de fato implementá-la, além de combinar muito com o intuito da API.
Espero que tenham gostado da proposta.
Olá, eu estava com um problema ao usar o getGrades em uma matéria, recebendo o erro:
Error: SIGAA: Received empty table on grade page.
at SigaaCourseStudent.getGrades (C:\Users\Duarte\Desktop\sigaa14\node_modules\sigaa-api\src\courses\sigaa-course-student.ts:1610:13)
at processTicksAndRejections (node:internal/process/task_queues:93:5)
at main (C:\Users\Duarte\Desktop\sigaa14\index.js:73:19)
src/courses/sigaa-course-student.ts
const table = page.$('table.tabelaRelatorio');
if (table.length !== 1) throw new Error('SIGAA: Received empty table on grade page.');
Dizendo que a tabela estava vazia. Mas pelo o contrario, tinha 2 tabelas.
Uma para as notas, e uma em relação a recuperação da nota.
Gostaria de saber sobre o if (table.length !== 1)
, porque !== 1
e não < 1
.
Fiz os testes aqui e substitui a condição, retornou normalmente a tabela das notas.
Teria algum motivo em especifico para essa condição?
Atualmente, tem uma documentação simples aqui, contudo ela é muito básica, é gerada automaticamente pelo tsdoc.
Meu objetivo é criar uma documentação mais voltada em um formato de tutorial do que, atualmente, apenas listar os métodos, classes, etc.
Português, inglês ou ambos? Ambos seria o melhor porém ter que manter duas versões complicaria muito, se escolhemos fazer em português será mais fácil de escrever, contudo será uma oportunidade perdida para melhorar o inglês. O problema do inglês é que ele cria uma barreira a mais para as pessoas entenderem a biblioteca, já que o SIGAA, até o que sei, só é usado no Brasil, por brasileiros. Usar o nomes em inglês pode trazer confusão, por mais que eu esteja seguindo uma tabela da UFSC com as traduções para os termos acadêmicos é muito fácil, por exemplo, confundir course com curso, quando na verdade course quer dizer turma. Mesmo assim, tudo pode ser explicado na documentação em inglês, se for feito em inglês.
Qual é a melhor maneira de fazer uma documentação? Eu estava pensando em usar o (VuePress)[https://vuepress.vuejs.org/guide/getting-started.html], mas não sei se tem melhores opções.
Também queria saber se alguém poderia tanto escrever como dar feedback da documentação.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.