Git Product home page Git Product logo

sigaa-api's People

Contributors

dduartee avatar dependabot[bot] avatar geovaneschmitz avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar

sigaa-api's Issues

Erros nos Testes em "test.spec.ts"

Descrição

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)

Análise

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 .

Não consigo utilizar para o IFPA

WhatsApp Image 2024-04-08 at 17 54 45

Ainda estou debugando, mas aproveitando enviando uma issues para saber se tem conhecimento sobre e por curiosidade se ainda está trabalhando com este projeto. Muito potencial para o estudantes da área de T.I na rede federal.

Não funciona com o sigaa da UFRB

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...

✨feat: Suporte login UNB

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:

  • As minhas credenciais estão corretas;
  • Verifiquei que o padrão de requisição do IFSC é aparentemente o mesmo da UNB;

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:
image

Não consegui identificar a solução, mas eu espero que esses debugs ajudem a descobrir

Error: SIGAA_UNKNOWN_USER_TYPE

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?

Listagem de componentes (disciplinas)

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.

Ao usar requests em paralelo API retorna paginas diferentes

Problema

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.

Exemplo

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);
});

Tentativas e Comportamentos

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.

Proposta de adição - Listar turmas disponibilizadas

Descrição

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:

  • Código
  • Nome
  • Turmas
  • Professores
  • Horários
  • Salas*
  • Vagas**

* 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.

Exemplo

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

Dificuldade Prevista

(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.

Observações

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.

Questão sobre o tamanho da tabela de notas no getGrades()

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.

issue

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?

Questões sobre a documentaçã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.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.