1

L’ENT de ma fac permet de consulter son emploi du temps en ligne avec un service très chiant à utiliser, il faut faire 50 clics avant d’arriver à son emploi du temps.
J’aimerais bien automatiser ça, pour ça je peux me contenter de rejouer les requêtes qui sont jouées quand je fais la manip en vrai, n’est-ce pas ?
Grâce à l’extension httpfox j’ai plein de détails sur les requêtes réalisées par le navigateur, je récupère donc leur liste, je fais gaffe à renvoyer le cookie de session qui m’est donné au démarrage mais … ça ne marche pas, à la fin je n’obtiens pas le bon résultat. sad
Quelles sont les subtilités auxquelles je n’ai pas pensé ? Est-ce que le script côté serveur a un moyen de détecter que je suis en train de réaliser les requêtes avec un script php maison qui s’exécute sur ma machine plutôt qu’à partir de leur interface web et peut me blâmer en conséquence ?

Pour info, l’interface web permettant d’accéder aux emplois du temps est ici

Et voici le script que j’ai écrit (qui contient encore des print_r de débugage). <? require_once "HTTP/Request.php"; $referer = null; $cookie = null; function setup() {   $GLOBALS['referer'] = "http://plannings.univ-rennes1.fr/ade/standard/gui/interface.jsp?login=sansesame&password=sans2007&projectId=44";   $req = new HTTP_Request($GLOBALS['referer']);   $req->addHeader('Keep-Alive', '300');   $req->addHeader('Connection', 'keep-alive');   $req->addHeader('Host', 'plannings.univ-rennes1.fr');   $rep = $req->sendRequest();      if(PEAR::isError($rep)) {     echo $rep->getMessage();     die();   }   /* Récupération du cookie */   $cookies = $req->getResponseCookies();   $GLOBALS['cookie'] = $cookies[0]; // HACK Pour l’instant le système ne renvoie qu’un cookie, ça pourrait changer… } function sendHttpRequest(& $req) {   $req->addHeader('Keep-Alive', '300');   $req->addHeader('Connection', 'keep-alive');   $req->addHeader('Host', 'plannings.univ-rennes1.fr');   $req->addHeader('Referer', $GLOBALS['referer']);   $req->addCookie($GLOBALS['cookie']['name'], $GLOBALS['cookie']['value']);   $rep = $req->sendRequest();   if(PEAR::isError($rep)) {     echo $rep->getMessage();     die();   } } /* Initialisation, récupération du cookie */ setup(); /* Sélection de l’emploi du temps */ $req = new HTTP_Request("http://plannings.univ-rennes1.fr/ade/standard/gui/tree.jsp?selectId=17&reset=true&forceLoad=false&scroll=0"); // 17 = GL2.2 sendHttpRequest($req); print_r($req->getResponseBody()); /* Génération de l’image */ $req = new HTTP_Request("http://plannings.univ-rennes1.fr/ade/custom/modules/plannings/imagemap.jsp?width=802&height=361"); sendHttpRequest($req); print_r($req->getResponseBody()); die(); $xml = new SimpleXMLElement($req->getResponseBody()); $url_img = $xml->BODY->img['src']; /* Récupération de l’image */ $req = new HTTP_Request($url_img); //$req->addCookie($cookie['name'], $cookie['value']); $rep = $req->sendRequest(); header("Content-type: image/gif"); echo $req->getResponseBody(); ?>
L’idée est d’afficher automatiquement juste l’image gif correspondant à mon emploi du temps à moi.
avatar
« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas. »

2

T'as pensé a l'user-agent? copie celui d'un navigateur normal. je sais pas ce que met ta lib smile

3

Hmmm, ça ressemble à quoi ce que tu obtiens ? Une erreur HTTP ? Des données erronées ?
avatar

4

./2 Ah ouais, tiens je vais tester différentes valeurs pour voir…
./3 J’obtiens une page HTML, mais pas la bonne. Normalement, quand on clique sur une section (dans l’arbre des formations), la page de droite est modifiée et affiche l’emploi du temps de la section (à la place de la page que vous pouvez voir, avec les instructions). Mais là, en simulant le clic sur une section, la page reste la même (sans le planning, donc).
Je rajouterai quelques détails demain…
avatar
« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas. »

5

j'ai fait un wget sur l'url de l'emploi du temps, et on voit que l'authentification est gérée par un SSO. Comme toute université qui se respecte ils utilisent CAS: http://www.jasig.org/cas
En gros je dirais que tu vas direct sur le SSO pour essayer de te logger avec ton login/mdp, et avec en parameètre service=url-des-emploi-du-temps: de la tu récupères une 302 qui te redirige vers ton service avec un ticketID qui signalera à la webapp de gestion des emploi du temps que tu as été authentifié par le CAS.

6

Mais si tu essaies tu verras qu’il n’est pas nécessaire de se logger pour accéder aux emplois du temps. Si je peux contourner l’étape d’authentification, je préfère le faire…
avatar
« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas. »

7

heu.... alors je pense que tu n'a pas fait exprès mais si, tu te logges, regarde bien la première url de ton script php... ^^

8

Oui mais ça ne passe pas par le CAS.
avatar
« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas. »

9

Voilà quelques captures d’écran pour mieux suivre ce qu’il se passe :
Je démarre Firefox et je demande l’url que j’ai donnée en ./2.
Voici la suite de requêtes HTTP réalisées par FF (j’ai filtré pour ne garder que les url qui contiennent « jsp », pour éviter qu’on se tape toutes les images) :
tromb Fichier joint : D1Fc (debut.png)
La dernière requête est celle qui permet d’obtenir une frame qui affiche l’image de l’emploi du temps. Pour l’instant elle renvoie le texte « Pour afficher un planning, vous devez : … »

Quand je clique sur une section (par exemple M1 Info), quelques requêtes supplémentaires sont réalisées :
tromb Fichier joint : h5uQ (suite.png)

À ce moment, comme on peut le voir sur le screenshot, la dernière requête renvoie maintenant une frame contenant l’image de l’emploi du temps.

Quand je simule les mêmes requêtes depuis mon script PHP, la dernière requête me renvoie le même résultat que quand je n’ai pas sélectionné d’emploi du temps (« Pour afficher un planning, … »).

Je vais essayer d’ajouter une info de User agent… Ça changera p-ê quelque chose.
avatar
« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas. »

10

Bah ça ne change rien.

[edit] Sinon, il y une URL (bounds.jsp) sur laquelle le navigateur fait régulièrement des requêtes qui sont toujours « Aborted », ça peut servir à quelque chose ?
avatar
« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas. »

11

Ah c’est bon en fait, j’ai simulé d’autres requêtes intermédiaires et j’obtiens le bon résultat : une frame qui contient un fragment de HTML dans lequel il y a une balise img dont l’attribut src contient l’adresse de l’image qui m’intéresse (adresse qui contient un identifiant qui change tout le temps, donc je suis obligé de la récupérer comme ça).
Seul problème, le fragment de HTML n’est pas du XML, du coup je ne peux pas le parser avec un parser XML. Il y a une façon propre de parser du HTML ou bien je dois me débrouiller avec une expression régulière pour extraire juste le truc qui m’intéresse ?
avatar
« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas. »

12

Sasume (./11) :
le fragment de HTML n’est pas du XML, du coup je ne peux pas le parser avec un parser XML.

En PHP, tu as http://fr2.php.net/manual/en/domdocument.loadhtml.php qui permet de charger du HTML, et de bosser avec via le DOM -- en utilisant XPath ou autre, notamment.
avatar
Tutorial C (TI-89/92+/v200) - Articles Développement Web (PHP, Javascript, ...)
« What is the sound of Perl? Is it not the sound of a wall that people have stopped banging their heads against? » - Larry Wall

13

Ah ouais ça aurait été pas mal… Bon tant pis j’ai utilisé une expression régulière, je n’avais pas trouvé ce truc dans la doc…

Enfin, maintenant j’ai terminé, tout marche correctement wink

Il y a juste un hic, je ne sais pas où je peux héberger mon script (pour en faire profiter mes potes), j’utilise le module HTTP_Request de PEAR et il n’est pas présent sur les hébergements de free.fr par exemple…
avatar
« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas. »

14

Sasume (./13) :
Bon tant pis j’ai utilisé une expression régulière, je n’avais pas trouvé ce truc dans la doc…

les regex pour "parser" du HTML, c'est (très) mal ^^
Sasume (./13) :
j’utilise le module HTTP_Request de PEAR et il n’est pas présent sur les hébergements de free.fr

Tu peux récupérer le code PHP des modules PEAR, et les inclure à ton projet -- tu as juste à modifier ton include_path, ensuite, pour que le répertoire où tu as mis ta version des paquets PEAR soit inclue dans l'include_path, et que, donc, ils puissent être chargés.

Pas le courage de tout lire, mais avec un peu de chance, ça pourra peut-être t'aider : http://pear.php.net/manual/en/installation.shared.php
avatar
Tutorial C (TI-89/92+/v200) - Articles Développement Web (PHP, Javascript, ...)
« What is the sound of Perl? Is it not the sound of a wall that people have stopped banging their heads against? » - Larry Wall

15

Si c'est potentiellement utile aux autres, tu peux peut-être demander au webmaster du site de le gérer directement au lieu de bidouiller des scripts, non ?

(comment ça il va t'envoyer chier ? tongue)
avatar
Zeroblog

« Tout homme porte sur l'épaule gauche un singe et, sur l'épaule droite, un perroquet. » — Jean Cocteau
« Moi je cherche plus de logique non plus. C'est surement pour cela que j'apprécie les Ataris, ils sont aussi logiques que moi ! » — GT Turbo

16

./14 C’est super simple et très pratique, donc c’est bien.
Pas con la copie de PEAR sur mon espace hébergé chez free, je vais tenter cette voie smile

./15 Quoi que, ils ont l’air assez sympa les admins je leur ai demandé d’installer Chrome et ils ne m’ont pas envoyé chier, ils vont peut-être l’installer d’ici la semaine prochaine…
avatar
« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas. »