IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Récupérer le contenu d'une page web


Sujet :

Langage PHP

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 68
    Points : 32
    Points
    32
    Par défaut Récupérer le contenu d'une page web
    Bonjour,

    J'utilise le code suivant pour récupérer le contenue d'une page web afin de vérifier si une entreprise est bien enregistrée ou non.
    Jusqu'à présent je le fais sur un site non officiel mais le problème c'est qu'il ne contient pas 100% des entreprises française, je voulais donc faire la même chose sur le site de l'insee mais ça coince.

    Voilà mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
        $urlfichier = "http://avis-situation-sirene.insee.fr/avisitu/IdentificationEtabToEntr.do?siren=$siren";
        $flux = implode ('', file ($urlfichier));

    Mais sur le site de l'insee j'ai cette erreur du coup :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        Warning: file(http://avis-situation-sirene.insee.fr/avisitu/IdentificationEtabToEntr.do?siren=) [function.file]: failed to open stream: HTTP request failed! HTTP/1.1 500 Erreur Interne de Servlet in wget.php on line 6
     
        Warning: implode() [function.implode]: Bad arguments. in wget.php on line 6
    En sachant que la ligne 6 de mon fichier correspond à la première ligne du code que je vous présente ci dessus.

    Je patoge, quelqun aurait une idée pour m'aider ?

    Merci d'avance,

  2. #2
    Membre expert Avatar de Fench
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Mai 2002
    Messages
    2 353
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Groenland

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 353
    Points : 3 390
    Points
    3 390
    Par défaut
    Bonjour,

    De même est tu sûr de ta variable $siren qui a l'air vide d'ou erreur 500 ..
    Meuuh en AI à l'INRA
    Domaines: {java, php, js, jquery}{hibernate, doctrine}{MyLib, symfony, Zend}
    fait gagner du temps à ceux qui aident , donc un message avec la balise résolu laisse plus de temps pour résoudre d'autres problèmes (balise à cliquer en bas de l'écran)

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 68
    Points : 32
    Points
    32
    Par défaut
    Oui je suis certain, j'ai même essayé en insérant directement un siren que je sais être valide mais le résultat est le même.
    Et même si le siren est erroné je dois recevoir une page annonçant que le siren est invalide, en aucun cas une erreur 500/

  4. #4
    Membre expert Avatar de Fench
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Mai 2002
    Messages
    2 353
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Groenland

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 353
    Points : 3 390
    Points
    3 390
    Par défaut
    Et même si le siren est erroné je dois recevoir une page annonçant que le siren est invalide, en aucun cas une erreur 500/
    Si tu es sûr de toi ... (500- erreur de ton code ou du serveur http)

    Sinon tu es sur Ie ?
    Meuuh en AI à l'INRA
    Domaines: {java, php, js, jquery}{hibernate, doctrine}{MyLib, symfony, Zend}
    fait gagner du temps à ceux qui aident , donc un message avec la balise résolu laisse plus de temps pour résoudre d'autres problèmes (balise à cliquer en bas de l'écran)

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 68
    Points : 32
    Points
    32
    Par défaut
    Ben l'erreur 500 est renvoyé par le site distant, c'est quand mon script attaque l'url du site disant que ce dernier renvoi une erreur 500.
    Même si je ne vois pas de lien je suis sous FF quand je lance mon script hébergé sur mon serveur.

  6. #6
    Membre expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Points : 3 947
    Points
    3 947
    Par défaut
    Salut

    J'ai fais un petit essai rapidos aussi.
    Si on saisi directement l'URL, même avec un N°Siren valide, ça débouche sur une erreur 500
    Par contre, si on passe par leur formulaire, ça fonctionne, on obtient les infos.

    Comme ça, au feeling, je dirais qu'ils imposent de passer par leur formulaire, que ça serait un moyen d'éviter que tout le monde vienne pomper sans cesse leur source.

    Ce serait une protection, non seulement pour ces données personnelles, mais aussi pour limiter la charge de leur serveur.
    Vous étiez peut être nombreux à procéder ainsi, qui sait.


    Ceci dit, analyse leur formulaire, les données qui seraient attendues par POST (il y en a peut être, j'ai pas regardé), et fais un essai avec Curl.
    Sait on jamais ... je reste pessimiste malgré tout.
    Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20
    Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra]

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 68
    Points : 32
    Points
    32
    Par défaut
    J'ai fais un essai également en post ça donne rien, même erreur, voila mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
     
    <?php
     
    // on définit l'URL du fichier
    $urlfichier = "http://avis-situation-sirene.insee.fr/avisitu/IdentificationEtabToEntr.do";
     
     
     
    // Définition des champs du formulaire POST
    $donnees = array('siren' => '$siren', 'critere' => 'A' );
     
     
     
    // Définition de la fonction d'encodage des headers
    function http_build_headers( $headers ) {
     
           $headers_brut = '';
     
           foreach( $headers as $nom => $valeur ) {
                   $headers_brut .= $nom . ': ' . $valeur . "\r\n";
           }
     
           return $headers_brut;
    }
     
    // Création du contenu brut de la requête
    $contenu = http_build_query( $donnees );
     
    // Définition des headers
    $headers = http_build_headers( array(
    'Content-Type' => 'application/x-www-form-urlencoded',
    'Content-Length' => strlen( $contenu) ) );
     
    // Définition du contexte
    $options = array( 'http' => array( 'user_agent' => 'Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.8.1) Gecko/20061010 Firefox/2.0',
    'method' => 'POST',
    'content' => $contenu,
    'header' => $headers ) );
     
    // Création du contexte
    $contexte = stream_context_create( $options );
     
    // Envoi du formulaire POST
    $retour = file_get_contents( "$urlfichier", false, $contexte );
     
     
    echo $retour;
     
    ?>

  8. #8
    Membre expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Points : 3 947
    Points
    3 947
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    // Définition du contexte
    $options = array( 'http' => array( 'user_agent' => 'Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.8.1) Gecko/20061010 Firefox/2.0',
    'method' => 'POST',
    'content' => $contenu,
    'header' => $headers ) );
    T'est sûr qu'on puisse définir une entête avec la méthode POST ?
    Personnellement, j'ai jamais vu ça.
    Sauf erreur, il me semble que ce soit pas possible.

    Je te conseillerais Curl. On peut faire des requête HTTP en POST avec Curl.
    Voir la doc : http://fr2.php.net/manual/fr/book.curl.php


    A mon sens, n'insiste pas trop non plus, ne passe pas des semaines quoi, car je vois dans leur formulaire des vérif en JSP ...
    Bref ... J'ai vraiment l'impression qu'ils ont verrouillé ça, qu'on ne puisse pas pomper comme ça leur contenu.
    Je peux mon tromper ...
    Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20
    Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra]

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 68
    Points : 32
    Points
    32
    Par défaut
    J'ai testé sur une page à moi et ça marche, j'ai bien reçu l'user agent defini etc...
    Je vais essayer de me pencher sur curl mais je connais pas du tout.

  10. #10
    Expert confirmé
    Avatar de Thes32
    Homme Profil pro
    Développeur PHP, .Net, T-SQL
    Inscrit en
    Décembre 2006
    Messages
    2 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Développeur PHP, .Net, T-SQL

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 379
    Points : 4 853
    Points
    4 853
    Par défaut
    Citation Envoyé par RunCodePhp
    T'es sûr qu'on puisse définir une entête avec la méthode POST ?
    Personnellement, j'ai jamais vu ça.
    Comme pour les autres méthodes HTTP, une requête POST contient des en-têtes et certains d'entre eux (comme Host) sont obligatoires.

    @ johnny-57 : un bon tuto sur cUrl http://julp.developpez.com/php/curl/ .
    Développeur | Zend Certified Engineer

    Étapes Pour mieux se servir du forum:
    1. Commencez par lire les cours et tutoriels ;
    2. Faites une recherche;
    3. Faites un post si rien trouvé dans les deux étapes précédentes en respectant les règles;

    Nix>_Rien n'est plus pratique que la théorie

  11. #11
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 68
    Points : 32
    Points
    32
    Par défaut
    Je pense que c'est la session qui me bloque, du coup, curl permet de gerer les sessions ? Parce que j'ai testé un script permettant d'utiliser le mien avec ouverture de session mais ça coince quand meme.

  12. #12
    Membre expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Points : 3 947
    Points
    3 947
    Par défaut
    Le problème majeur ici, c'est que personne ne sait comment et quelle condition il faut pour interroger cette page.
    Il faudrait avoir son code. Sans ça, c'est un peut "au petit bonheur la chance".

    De plus, on sait qu'il y a un mécanisme permettant de verrouiller son accès, en tout cas, ça se sent.
    L'erreur 500 n'est pas un hasard, une erreur de code, mais une action volontaire du codeur. Ca sent roussie ton histoire.

    Rien qu'une vérification sur le HTTP_REFERER suffit pour éjecter toutes requête ne venant pas du même domaine.


    Pour ma part, je ferais des recherche sur le Net pour savoir si une personne est parvenue à interroger cette page.
    A mon avis, tu ne devrais pas être le seul ... il doit avoir des discutions sur des forums, je serais étonné du contraire.

    Tu auras (peut être) une réponse : Si c'est possible ou pas. Et si c'est possible, peut être le code qui va avec qui sait.
    Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20
    Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra]

  13. #13
    Membre averti Avatar de BornBanane
    Homme Profil pro
    dev
    Inscrit en
    Mars 2007
    Messages
    284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : dev

    Informations forums :
    Inscription : Mars 2007
    Messages : 284
    Points : 416
    Points
    416
    Par défaut
    Et comme ceci ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    <?php
    $url = 'http://avis-situation-sirene.insee.fr/avisitu/IdentificationListeSiret.do';
    $post = array('bSubmit' => 'Valider',
    'critere' => 'S',
    'departement' => ''	,
    'departement_actif' => '',
    'nic' => '',
    'siren' => 'XXXXXXX');
     
    //curl 
    $ch = curl_init();
     
    // configuration des options
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_POST, true); 
    curl_setopt($ch, CURLOPT_REFERER, 'http://avis-situation-sirene.insee.fr/avisitu/jsp/avis.jsp'); 
    curl_setopt($ch, CURLOPT_POSTFIELDS, $post); 
    // exécution de la session
    $data = curl_exec($ch);
     
    // fermeture des ressources
    curl_close($ch);
     
    var_dump($data);
     
    ?>
    (j'ai pas testé soucis de proxy ou je suis )
    Smiley de Plomb 2009
    Anciennement FrancoisIT

  14. #14
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 68
    Points : 32
    Points
    32
    Par défaut
    J'ai testé ton code françoisIT, comme je n'y connais rien a curl j'ai simplement copié collé ton code en y ajoutant un siren à la main pour le test.

    Réponse quand on intéroge la page du script : bool(true)

    Je suppose que c'est bon signe, mais question devient alors, quelle variable contient le contenue de la page de sorte à ce que je puisse y chercher les infos de l'entreprise pour vérifier ce qui a été saisi chez moi ?

  15. #15
    Membre averti Avatar de BornBanane
    Homme Profil pro
    dev
    Inscrit en
    Mars 2007
    Messages
    284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : dev

    Informations forums :
    Inscription : Mars 2007
    Messages : 284
    Points : 416
    Points
    416
    Par défaut
    Alors le true signifie que le curl n'a pas retourné d'erreur.

    Pour le contenu de la page dans la variable de retour $data il faut ajouter au niveau de la définitions des options cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    Tu peux mettre aussi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    curl_setopt($ch, CURLOPT_HEADER, 1);
    à la place de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    curl_setopt($ch, CURLOPT_HEADER, 0);
    ceci pour voir les headers retourné par le serveur.
    Smiley de Plomb 2009
    Anciennement FrancoisIT

  16. #16
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 68
    Points : 32
    Points
    32
    Par défaut
    En effectuant les deux modifs que tu suggère je reçois ça :

    string(313) "HTTP/1.1 100 Continue HTTP/1.1 302 Déplacé Temporairement Date: Thu, 25 Mar 2010 15:10:01 GMT Set-Cookie: JSESSIONID=1602008EAF57A03C658FE2FDFF8FAB34.route3; Path=/avisitu Location: http://avis-situation-sirene.insee.f...u/jsp/avis.jsp Content-Type: text/html;charset=ISO-8859-1 Content-Length: 0 "
    ça sent pas bon je crois.

  17. #17
    Membre averti Avatar de BornBanane
    Homme Profil pro
    dev
    Inscrit en
    Mars 2007
    Messages
    284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : dev

    Informations forums :
    Inscription : Mars 2007
    Messages : 284
    Points : 416
    Points
    416
    Par défaut
    Hum effectivement ca ne sens pas bon mais déjà on a une réponse qui n'est pas un 500 error.

    Essaie toujours dans les options de rajouter ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
    Pour voir si il n'y aurait pas une redirection dans l'air.
    Edit :
    Je pense qu'il va te redirigé vers la page d'acceuil. Vu le
    Smiley de Plomb 2009
    Anciennement FrancoisIT

  18. #18
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 68
    Points : 32
    Points
    32
    Par défaut
    Effectivement il redirige vers la page dont tu parle ce qui n'arrange pas les affaires.

    On obtient :

    string(7673) "HTTP/1.1 100 Continue HTTP/1.1 302 Déplacé Temporairement Date: Thu, 25 Mar 2010 15:44:53 GMT Set-Cookie: JSESSIONID=F3B0FD71D51A45BC134ED1E40C7D3E6F.route4; Path=/avisitu Location: http://avis-situation-sirene.insee.f...u/jsp/avis.jsp Content-Type: text/html;charset=ISO-8859-1 Content-Length: 0 HTTP/1.1 200 OK Date: Thu, 25 Mar 2010 15:44:53 GMT Set-Cookie: JSESSIONID=B5582872A628C1AA7CBD480F20B436B9.route4; Path=/avisitu Content-Type: text/html;charset=iso-8859-1 Content-Length: 7159

    et en dessous de ça la page http://avis-situation-sirene.insee.f...u/jsp/avis.jsp s'affiche.

  19. #19
    Membre averti Avatar de BornBanane
    Homme Profil pro
    dev
    Inscrit en
    Mars 2007
    Messages
    284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : dev

    Informations forums :
    Inscription : Mars 2007
    Messages : 284
    Points : 416
    Points
    416
    Par défaut
    Alors une chose que je remarque c'est qu'il envoie un header pour créer un cookie. Donc il faut peut être se pencher la dessus.

    Lorsqu'on va sur la page du formulaire on a un cookie qui se crée. Et donc celui-ci est ensuite transmis lors du post.
    Il faut alors sans doute passé ce même cookie par curl.

    Pour envoyer un cookie il faut faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $strCookie = 'JSESSIONID=1602008EAF57A03C658FE2FDFF8FAB34.route3';
    curl_setopt( $ch, CURLOPT_COOKIE, $strCookie );
    Il faudrait que tu lances une fois le script pour récupérer la valeur du JSESSIONID. Puis que tu relances avec le code ci-dessus en mettant la valeur que tu as récupérer.

    Dans le cas ou ca fonctionne bel et bien :
    Après il faudra automatisé le tout en faisant un 1er appel curl sur la page du formulaire, parser le retour du header et récupérer le JSESSIONID et faire l'envoie du formulaire.
    Smiley de Plomb 2009
    Anciennement FrancoisIT

  20. #20
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 68
    Points : 32
    Points
    32
    Par défaut
    Magnifique ça marche terrible.

    J'ai codé un peu pour récupérer l'id de session dans la première page et je relance la requête avec le code que tu m'a donné et ça marche nikel maintenant. Merci beaucoup sans toi je n'y serais pas arrivé.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Récupérer le contenu d'une page web protégée
    Par karoudja dans le forum Langage
    Réponses: 3
    Dernier message: 27/08/2007, 10h21
  2. récupérer le contenu d'une page web
    Par marielaure2805 dans le forum Langage
    Réponses: 4
    Dernier message: 28/02/2007, 13h12
  3. Récupérer le contenu d'une page web
    Par smarties dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 13/02/2007, 01h25
  4. [Servlet]Récupérer le contenu d'une page web
    Par Jarodnet dans le forum Servlets/JSP
    Réponses: 6
    Dernier message: 06/10/2005, 15h47

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo