Récupération des profils de poste dans Poppee
<?php | |
# Récupération des fiches de postes au mouvement de conservateur d'après le site Poppee | |
$poppee_URL="https://mvtbib.adc.education.fr/mvtbib/servlet/mvtbib.Centrale"; | |
$nom_fichier_sortie='fichier_sortie.csv'; | |
class RecupHeaders { | |
# classe pour récupérer le header d'une requête et donc les cookies | |
# code inspiré de Geoffrey Warnants http://geoffray.be/blog/php/extraire_http_headers_avec_lib_curl | |
# et Brian Wendt http://ontodevelopment.blogspot.fr/2011/04/curloptheaderfunction-tutorial-with.html | |
protected $_url = null; | |
protected $_headers = array(); | |
protected $_body = ''; | |
public function __construct($url,$headers,$postfields) { | |
# initalise l'objet | |
$this->_url = curl_init($url); | |
curl_setopt($this->_url, CURLOPT_RETURNTRANSFER, true); | |
curl_setopt($this->_url, CURLOPT_HEADER, true); | |
curl_setopt($this->_url, CURLOPT_HTTPHEADER, $headers); | |
curl_setopt($this->_url, CURLOPT_POST, true); | |
curl_setopt($this->_url, CURLOPT_POSTFIELDS, $postfields); | |
# fonction readHeaders appelée à la réception de chaque ligne d'entête | |
curl_setopt($this->_url, CURLOPT_HEADERFUNCTION,array($this, 'readHeaders')); | |
} | |
public function __destruct() { | |
curl_close($this->_url); | |
} | |
public function getHeaders() { | |
# exécute la requête et remplit le tableau $headers | |
$this->_body = curl_exec($this->_url); | |
return $this->_headers; | |
} | |
public function getBody() { | |
return $this->_body; | |
} | |
protected function readHeaders($url, $str) { | |
# ajout de chaque ligne d'entête dans un tableau | |
if (strlen($str) > 0) { | |
$this->_headers[] = $str; | |
} | |
# la fonction doit retourner le nombre précis de caractères de chaque ligne d'entête | |
return strlen($str); | |
} | |
} | |
function get_session_cookie ($url) { | |
# simule une navigation et récupère le cookie | |
$headers=array(); | |
$session_cookies=array(); | |
# page d'accueil de Poppee -> 1er cookie | |
$connexion = new RecupHeaders($url,array(''),''); | |
$headers=$connexion->getHeaders(); | |
$connexion= null; | |
foreach ($headers as $header) { | |
if (preg_match('/^Set-Cookie:\s*JSESSIONID=([^;]*)/mi', $header, $cookie) == 1) { | |
$session_cookies[]=$cookie[1]; | |
} | |
} | |
if (count($session_cookies) <> 1) { | |
# erreur | |
return 0; | |
} | |
$cookie1=$session_cookies[0]; | |
# 2e page de Poppee -> 2e cookie | |
$connexion = new RecupHeaders($url,array('Cookie: JSESSIONID='.$cookie1,'Referer: https://mvtbib.adc.education.fr/mvtbib/servlet/mvtbib.Centrale','Connection: keep-alive', | |
'Host: mvtbib.adc.education.fr','Content-Type: application/x-www-form-urlencoded'),'pageAction=mouvements&lastPage=identification&login=Y%2Bbidon&password=bidon&profil=&sessionInvalidate=&ecran=&motCle='); | |
$headers=$connexion->getHeaders(); | |
$connexion= null; | |
$session_cookies=array(); | |
foreach ($headers as $header) { | |
if (preg_match('/^Set-Cookie:\s*JSESSIONID=([^;]*)/mi', $header, $cookie) == 1) { | |
$session_cookies[]=$cookie[1]; | |
} | |
} | |
if (count($session_cookies) <> 1) { | |
# erreur | |
return 0; | |
} | |
$cookie2=$session_cookies[0]; | |
# 3e page | |
$connexion = new RecupHeaders($url,array('Cookie: JSESSIONID='.$cookie2,'Referer: https://mvtbib.adc.education.fr/mvtbib/servlet/mvtbib.Centrale','Connection: keep-alive', | |
'Host: mvtbib.adc.education.fr','Content-Type: application/x-www-form-urlencoded'),'pageAction=mouvements&lastPage=mouvements&codeMvt=CONSER'); | |
$headers=$connexion->getHeaders(); | |
$connexion= null; | |
return $cookie2; | |
} | |
function get_profil($noRet,$uaarneRet,$session_cookie) { | |
# récupère une fiche de profil de poste | |
$x = curl_init("https://mvtbib.adc.education.fr/mvtbib/servlet/mvtbib.Centrale"); | |
curl_setopt($x, CURLOPT_HTTPHEADER, array( | |
'Connection: keep-alive', | |
'Host: mvtbib.adc.education.fr', | |
'Referer: https://mvtbib.adc.education.fr/mvtbib/servlet/mvtbib.Centrale', | |
'Content-Type: application/x-www-form-urlencoded', | |
'Cookie: JSESSIONID='.$session_cookie)); | |
curl_setopt($x, CURLOPT_HEADER, 0); | |
curl_setopt($x, CURLOPT_POST, 1); | |
curl_setopt($x, CURLOPT_POSTFIELDS, 'pageAction=listeProfils2&lastPage=listeProfils2&uaarneRet='.$uaarneRet.'&noRet='.$noRet.'&action=detailler&radiobutton=radiobutton'); | |
curl_setopt($x, CURLOPT_FOLLOWLOCATION, 0); | |
curl_setopt($x, CURLOPT_RETURNTRANSFER, 1); | |
curl_setopt($x, CURLOPT_COOKIESESSION, 1 ); | |
$data = curl_exec($x); | |
curl_close($x); | |
return $data; | |
} | |
function get_liste_profils($session_cookie) { | |
# récupère une fiche de profil de poste | |
# renvoie un tableau de tableau à 4 entrées : numéro de poste, code établissement, nom établissment, ville | |
$tableau=array(); | |
$x = curl_init("https://mvtbib.adc.education.fr/mvtbib/servlet/mvtbib.Centrale"); | |
curl_setopt($x, CURLOPT_HTTPHEADER, array( | |
'Connection: keep-alive', | |
'Host: mvtbib.adc.education.fr', | |
'Referer: https://mvtbib.adc.education.fr/mvtbib/servlet/mvtbib.Centrale', | |
'Content-Type: application/x-www-form-urlencoded', | |
'Cookie: JSESSIONID='.$session_cookie)); | |
curl_setopt($x, CURLOPT_HEADER, 0); | |
curl_setopt($x, CURLOPT_POST, 1); | |
curl_setopt($x, CURLOPT_POSTFIELDS, 'pageAction=chEtab5&lastPage=chEtab5&uaarne=&codeDpt=&ttEtab=1'); | |
curl_setopt($x, CURLOPT_FOLLOWLOCATION, 0); | |
curl_setopt($x, CURLOPT_RETURNTRANSFER, 1); | |
curl_setopt($x, CURLOPT_COOKIESESSION, 1 ); | |
$data = curl_exec($x); | |
curl_close($x); | |
$dom = new DOMDocument(); | |
@$dom->loadHTML($data); | |
$xpath = new DOMXpath($dom); | |
$nb_tr=0; | |
$trs=$xpath->query('/html/body/table/tr/td[2]/div/form/table/tr'); | |
foreach ($trs as $tr) { | |
if (($nb_tr > 0) and (($nb_tr+2) < $trs->length)) { | |
$content = $tr->childNodes->item(4)->nodeValue; | |
$num_poste = trim($tr->childNodes->item(6)->childNodes->item(0)->nodeValue); | |
$detail=explode("\n",$content); | |
$code=trim($detail[1]); | |
$etab=trim($detail[2]); | |
$ville=trim($detail[3]); | |
$tableau[]=array($num_poste,$code,$etab,$ville); | |
} | |
$nb_tr++; | |
} | |
return $tableau; | |
} | |
# ============================ | |
# Corps du programme | |
# ============================ | |
$fichier_sortie = fopen($nom_fichier_sortie, 'w'); | |
# récupération du cookie de session | |
$session_cookie= get_session_cookie ($poppee_URL); | |
if ($session_cookie ===0) { | |
echo "Erreur dans la fonction get_session_cookie\n"; | |
exit; | |
} | |
# récupération de la liste de tous les profils (mais pas du détail) | |
$liste_profils = get_liste_profils($session_cookie); | |
# boucle : récupération des profils | |
foreach ($liste_profils as $profil_court) { | |
$numero = $profil_court[0]; | |
$code = $profil_court[1]; | |
$etab = $profil_court[2]; | |
$ville = $profil_court[3]; | |
$profil = get_profil($numero,$code,$session_cookie); | |
$erreur=strpos($profil,"Veuillez-vous reconnecter !"); | |
if ($erreur > 0) { | |
echo "Erreur : le cookie fourni est invalide\n"; | |
exit; | |
} | |
$erreur=strpos($profil,"Veuillez recommencer"); | |
if ($erreur > 0) { | |
echo "Erreur : le cookie fourni est invalide (ou autre problème)\n"; | |
exit; | |
} | |
# nettoyage des espaces | |
$profil = preg_replace('/\s+/', ' ', (str_replace("\n", ' ', $profil))); | |
# transformation en arbre DOM | |
$dom = new DOMDocument(); | |
@$dom->loadHTML($profil); | |
$xpath = new DOMXpath($dom); | |
$descriptif_court = trim($xpath->query("/html/body/table/tr/td[2]/div/form/table/tr[4]/td[3]")->item(0)->nodeValue); | |
$descriptif_long = trim($xpath->query("/html/body/table/tr/td[2]/div/form/table/tr[6]/td[3]")->item(0)->nodeValue); | |
$responsabilite = trim($xpath->query("/html/body/table/tr/td[2]/div/form/table/tr[8]/td[3]")->item(0)->nodeValue); | |
$competences = trim($xpath->query("/html/body/table/tr/td[2]/div/form/table/tr[10]/td[3]")->item(0)->nodeValue); | |
$ligne= array( | |
$numero, | |
$code, | |
$etab, | |
$ville, | |
$descriptif_court, | |
$descriptif_long, | |
$responsabilite, | |
$competences | |
); | |
# écriture dans un fichier csv | |
$delimiter=","; | |
$enclosure='"'; | |
fputcsv($fichier_sortie, $ligne,$delimiter,$enclosure); | |
sleep (2); | |
} | |
fclose($fichier_sortie); | |
?> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment