Litarvan / pronote-api

(Tout langage) API compatible Pronote 2020/2021
194 stars 87 forks source link

L'API ne retourne pas tout les resources pédagogiques #140

Closed millianlmx closed 4 years ago

millianlmx commented 4 years ago

Bonjour à tous, j'ouvre cette issue pour suggérer d'ajouter une fonction documents() qui renvoie tous les documents publiés. Parce que lors de l'exécution de la fonction de content(), certains documents ne sont pas retournés, essentiellement les documents qui sont dans la section "Autres documents" comme le montre l'image : img. Merci d'ajouter cette fonction ou de fournir une solution pour obtenir ces liens vers ces documents à l'aide de l'API. Bonne journée, félicitations pour ce travail incroyable 😁

ThibautTrarbach commented 4 years ago

Hello, Possible d'avoir la partie de votre code qui devrait récup ces info ? Ainsi que le résultat voulu ?

Cdt Thibaut

millianlmx commented 4 years ago

Bonjours, j'ai d'abord pensé à utiliser la fonction content comme cela :

let session = await pronote.login(params.url, params.username, params.password);
await session.contents(new Date(2020, 9, 15));

Mais le problème est que la fonction me retourne uniquement les leçons et donc j'obtiens seulement les documents rattachés aux leçons. Donc j'ai voulu utilisé un bout de code de pronote-lib qui fonctionne.

const files = (await navigate(session, 99, 'RessourcePedagogique', {
    avecRessourcesPronote: true,
    avecRessourcesEditeur: false
})).donnees;

Donc j'execute ça en guise de test :

const test = async () => {
    let session = await pronote.login("https://0590221v.index-education.net/pronote/", "User", "Password");
    return (await getFiles(session));
}

test().then(val => val.listeRessources.V.forEach(element => console.log(element)));

J'ai ceux-ci en réponse :

{
  G: 0,
  ressource: {
    _T: 24,
    V: { L: 'résumé dérivation.docx', N: '3625BD00183B36', G: 48 }
  },
  date: { _T: 7, V: '04/09/2020 11:00:00' },
  matiere: { _T: 24, V: { N: '81A2B8412EAC33' } }
}
{
  G: 0,
  ressource: {
    _T: 24,
    V: { L: 'SUITES Rappels.docx', N: '3733F10BF089F6', G: 67 }
  },
  date: { _T: 7, V: '01/09/2020' },
  matiere: { _T: 24, V: { N: '81A2B8412EAC33' } }
}
...

Ce code fonctionne mais je ne sais pas comment exploiter la réponse, tout déchiffrer, par la suite je pense qu'il serait cool d'ajouter la fonction files() à l'objet PronoteSession qui retourne tout les url des fichiers dans la période données. Merci de votre aide, cordialement.

millianlmx commented 4 years ago

J'ai ajouté un fichier files.js qui contient:

const parse = require('../../data/types');
const { toPronote } = require('../../data/objects');

const navigate = require('./navigate');

const PAGE_NAME = 'RessourcePedagogique';
const TAB_ID = 99;
const ACCOUNTS = ['student'];

async function getFiles(session)
{
    const files = await navigate(session, PAGE_NAME, TAB_ID, ACCOUNTS, {
        avecRessourcesPronote: true,
        avecRessourcesEditeur: false
    });
    return files;
}

module.exports = getFiles;
millianlmx commented 4 years ago

Le problème est que je ne comprend pas comment l'api fonctionne donc j'ai besoin d'aide pour la parti de déchrement, j'ai vu qu'il existe les fonctions parse() et getFileURL(), je ne vois pas ce que je dois faire avec ni à quoi correspond "G:", "T:", "N:".

millianlmx commented 4 years ago

Bonsoir je reviens vers vous car j'ai fais quelques avancer ce soir avec ce code:

const getFiles = require("pronote-api/src/fetch/pronote/files");
const url = require("pronote-api/src/data/files");
const pronote = require("pronote-api");

const test = async () => {
    let session = await pronote.login(url, username, password);
    const files = await getFiles(session);
    let result = [];

    const subjects = {};
    for (const subject of files.listeMatieres.V) {
        subjects[subject.N] = subject.L;
    }

    for (const file of files.listeRessources.V) {
        result.push({
            time: file.date.V,
            subject: subjects[file.matiere.V.N],
            name: file.ressource.V.L,
            url: url.getFileURL(session, {id: file.ressource.V.N, name: file.ressource.V.L, type: file.ressource.V.G})
        });
    }
    return result;
}

test().then(val => console.log(val))

J'obtiens la réponse suivante:

[{
    time: '23/10/2020 18:21:26',
    subject: 'ANGLAIS LV1',
    name: 'Anglais tweet.docx',
    url: 'https://0590221v.index-education.net/pronote/FichiersExternes/ccf226c390780236ea2ce1fcf6f2a11c2fe90e05e8a58276b94ce52b40f23eef/Anglais%2520tweet.docx?Session=9927867'
  },
  {
    time: '16/10/2020 11:00:00',
    subject: 'MATHEMATIQUES',
    name: 'fiche révision 1ère toussaints.docx',
    url: 'https://0590221v.index-education.net/pronote/FichiersExternes/769eb95c99b46b2467951e58d472dc6c7f5aa57cce9d7fdfe59b8f640ff1bd53/fiche%2520r%25C3%25A9vision%25201%25C3%25A8re%2520toussaints.docx?Session=9927867'
  },
...
]

Personnellement elle me satisfait, par contre je ne sais pas comment vous intégrez les date (pour avoir que les élément compris entre telle date et telle date), mais de mon côté je vais voir pour l'intégrer à l'api et faire une merge request. Merci de vos retour 😄

ThibautTrarbach commented 4 years ago

Je vérifie ton PR se soir normalement

Cdt Thibaut

millianlmx commented 4 years ago

Bonjours, ça marche si il y a des problèmes sur le code, dis le moi je modifie tout ça. Bonne journée.

ThibautTrarbach commented 4 years ago

Hello,

Il me manque juste la partie pour le serveur GraphQL. Et normalement après tout sera bon.

Cdt Thibaut

millianlmx commented 4 years ago

Bonsoir, effectivement j'ai oublié cette partie j'intègre tout ça ce soir et je commit. Cordialement.

millianlmx commented 4 years ago

Re bonsoir, j'ai du batailler un peu pour ajouter la feature à GrapQL (parce que je connaissais pas), mais c'est fait avec succés et j'ai remarqué qu'il ne fallat pas grand chose de plus pour ajouter le support de session pronote parent, maintenant c'est chose faite. Cordialement.

ThibautTrarbach commented 4 years ago

C'est merge.

Cdt Thibaut