Précédent   Forum des professionnels en informatique > PHP > Bibliothèques et frameworks
Bibliothèques et frameworks Forum d'entraide sur les frameworks, templates, bibliothèques de code (PDFLib, eZPdf, JpGraph, Artichow, PEAR, etc). Avant de poster : FAQ bibliothèques, toutes les FAQ PHP et cours bibliothèques
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 12/10/2006, 11h31   #1
Candidat au titre de Membre du Club
 
Inscription : mars 2005
Messages : 101
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 101
Points : 12
Points : 12
Par défaut [cURL] Tester le temps de la dernière requête avec cURL

Boinjour,

je fais des requêtes à un serveur avec curl.

je fais une requête pour m'authentifier, et je voudrais le faire seulement toutes les 10 minutes.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 
 $ch = curl_init();
 
  curl_setopt($ch, CURLOPT_URL,$url);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  curl_setopt($ch, CURLOPT_TIMEOUT, 4);
  curl_setopt($ch, CURLOPT_COOKIEJAR, "\tmp\cookie.txt");
  curl_setopt($ch, CURLOPT_COOKIEFILE, "\tmp\cookie.txt");	
  curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
 
$data = curl_exec($ch);
  #print_r $data;
  if (curl_errno($ch)) {
    print curl_error($ch);
    return false;
  }
 
 return $ch;
avant de faire le curl_exec, je dois regarder depuis combien de temps la derniere requete a été effectuée.
Si ca fait moins de 10 minutes, récuperer $ch ( CURL Handle authenticated ) pour l'utiliser dans une autre requete.

Quelqu'un pour m'aider?

merci d'avance
brasco06 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/10/2006, 13h32   #2
Membre émérite
 
Inscription : mai 2004
Messages : 709
Détails du profil
Informations personnelles :
Localisation : Belgique

Informations forums :
Inscription : mai 2004
Messages : 709
Points : 852
Points : 852
Si ton script est relancé à chaque fois, tu perds tous tes pointeurs de ressources. Mais pourquoi ne pas simplement réinjecter le cookie de session/authentification avec CURLOPT_COOKIEFILE.

Pour le timestamp, c'est relativement simple, tu le mets en bdd ou en fichier plat et tu le relis à chaque fois que tu veux exécuter le script.
__________________
:q :q! :wq :w :w! :wq! :quit :quit! :help help helpquit quit quithelp
:quitplease :quitnow :leave :shit ^X^C ^C ^D ^Z ^Q QUITDAMMIT
Jabber: ripat at im.apinc.org
ripat est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/10/2006, 13h48   #3
Candidat au titre de Membre du Club
 
Inscription : mars 2005
Messages : 101
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 101
Points : 12
Points : 12
tu veux dire je teste si le temps est inferieur à 10min, je fais un
Code :
 curl_setopt($ch, CURLOPT_COOKIEFILE, "\tmp\cookie.txt");
et ca me récuperera mon cookie d'authentification?
brasco06 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/10/2006, 13h50   #4
Candidat au titre de Membre du Club
 
Inscription : mars 2005
Messages : 101
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 101
Points : 12
Points : 12
Il n'y a pas un autre moyen que de créer un timestamp dans un bdd.?
une info dans le cookie qui nous donnerai la date de création par exemple
brasco06 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/10/2006, 14h24   #5
Membre émérite
 
Inscription : mai 2004
Messages : 709
Détails du profil
Informations personnelles :
Localisation : Belgique

Informations forums :
Inscription : mai 2004
Messages : 709
Points : 852
Points : 852
Si tu veux récupérer un pointeur de ressource plus loin dans un script, c'est possible, bien sûr. Mais si le script est exécuté à nouveau, tous les pointeurs de ressources seront automatiquement fermés quand le premier script s'arrêtera.

A ma connaissance il n'y a pas de connections persistante pour ce type de ressource.
http://be2.php.net/manual/fr/resource.php

Pour le timestamp la fonction curl_getinfo() ne contient que des données de durée (connexion et transaction). Pas l'heure de la connexion.

Pourrais-tu expliquer le pourquoi de ta demande. Gain de temps? Prolongation d'une session?

Citation:
Envoyé par brasco06
Il n'y a pas un autre moyen que de créer un timestamp dans un bdd.?
une info dans le cookie qui nous donnerai la date de création par exemple
Si, dans un fichier plat (ou en session ce qui revient au même).
__________________
:q :q! :wq :w :w! :wq! :quit :quit! :help help helpquit quit quithelp
:quitplease :quitnow :leave :shit ^X^C ^C ^D ^Z ^Q QUITDAMMIT
Jabber: ripat at im.apinc.org
ripat est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/10/2006, 14h33   #6
Candidat au titre de Membre du Club
 
Inscription : mars 2005
Messages : 101
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 101
Points : 12
Points : 12
c'est pour un gain de temps oui.

le but est de s'authentifier au serveur une fois, de pouvoir effectuer des requêtes sans se ré-authentifier (pour eviter de faire 2 requetes à chaque fois).

Et de faire une authentification automatique selon un temps prédéfini.
brasco06 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/10/2006, 14h55   #7
Candidat au titre de Membre du Club
 
Inscription : mars 2005
Messages : 101
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 101
Points : 12
Points : 12
je vais récapituler:

je m'identifie a un serveur:

Code :
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
 $ch = curl_init();
 
  curl_setopt($ch, CURLOPT_URL,$url);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  curl_setopt($ch, CURLOPT_TIMEOUT, 4);   
 curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie);
 curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie);
  curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
 
  $data = curl_exec($ch);
 
  if (curl_errno($ch)) {
    print curl_error($ch);
    return false;
  }
 
 
  preg_match("(\d*)", $data, $matches);
  $resp_code = $matches[0];
 
  if ( $resp_code != 100 && $resp_code != 301) {
    //error( "Response: Authentication Failed: $resp_code");
    return false;
  }
 
  return $ch;

ensuite pour effectuer de nouvelle requete a ce serveur, j'ai besoin de recupérere la ressource $ch .

Pour éviter d'appeler une methode d'authentification à chaque fois.

Apres dans une methode "send_query", je fais :

Code :
1
2
3
4
5
6
7
8
9
10
 
curl_setopt($ch, CURLOPT_URL,$url);
$data = curl_exec($ch);
 
if (curl_errno($ch)) {
	  print curl_error($ch);
         return false;
}
 
return $data;
Le but est donc de retourner la ressource $ch sans re appeler la methode d'authentification.

j'espère avoir été plus clair.
brasco06 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/10/2006, 15h09   #8
Membre émérite
 
Inscription : mai 2004
Messages : 709
Détails du profil
Informations personnelles :
Localisation : Belgique

Informations forums :
Inscription : mai 2004
Messages : 709
Points : 852
Points : 852
A première vue il ne s'agit pas d'une authentification http mais plutôt par cookie. Essaye, comme suggéré plus haut de réinjecter le cookie capturé lors de la première connexion.

Ton script send_query:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
curl_setopt($ch, CURLOPT_URL,$url);
 
// réinjection du cookie.
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie);
 
$data = curl_exec($ch);
 
if (curl_errno($ch)) {
	  print curl_error($ch);
         return false;
}
 
return $data;
__________________
:q :q! :wq :w :w! :wq! :quit :quit! :help help helpquit quit quithelp
:quitplease :quitnow :leave :shit ^X^C ^C ^D ^Z ^Q QUITDAMMIT
Jabber: ripat at im.apinc.org
ripat est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/10/2006, 15h14   #9
Candidat au titre de Membre du Club
 
Inscription : mars 2005
Messages : 101
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 101
Points : 12
Points : 12
merci pour ton aide.

j'avais deja essayé ca mais ca m renvoi une erreur:

Code :
curl_setopt(): supplied argument is not a valid cURL handle resource in
pour la ligne
Code :
curl_setopt($ch, CURLOPT_COOKIEFILE, $COOKIE);
Il veut une ressource $ch, mais ne l'a pas dans send_query;
brasco06 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/10/2006, 15h24   #10
Membre émérite
 
Inscription : mai 2004
Messages : 709
Détails du profil
Informations personnelles :
Localisation : Belgique

Informations forums :
Inscription : mai 2004
Messages : 709
Points : 852
Points : 852
Tu dois évidemment rouvrir une ressource (curl_setopt($ch, CURLOPT_URL,$url), mais sans capturer le cookie (pas de CURLOPT_COOKIEJAR).

Sans pointeur de ressources ça ne risque pas de marcher!

As-tu la main sur le serveur cible? Sinon, les techniques d'indentifications des sites sont parfois très ténébreuses. Il n'y a pas de recette miracle. Par exemple, hotmail n'offre pas d'accès POP, dès lors certains ont essayé d'utiliser CURL (ou wget) pour accéder à leur mail. Pas évident apparemment. Il faut utiliser un anayleur de trames (Etheral, tcpdump) pour décortiquer le contenu de toutes les entêtes de redirection et cookies envoyés par hotmail et d'ensuite les "replay" avec CURL. Pas si simple.
__________________
:q :q! :wq :w :w! :wq! :quit :quit! :help help helpquit quit quithelp
:quitplease :quitnow :leave :shit ^X^C ^C ^D ^Z ^Q QUITDAMMIT
Jabber: ripat at im.apinc.org
ripat est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/10/2006, 15h28   #11
Candidat au titre de Membre du Club
 
Inscription : mars 2005
Messages : 101
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 101
Points : 12
Points : 12
je le fais bien ( voir 2 posts plus haut)!!
je re ouvre une ressource!
brasco06 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/10/2006, 15h38   #12
Membre émérite
 
Inscription : mai 2004
Messages : 709
Détails du profil
Informations personnelles :
Localisation : Belgique

Informations forums :
Inscription : mai 2004
Messages : 709
Points : 852
Points : 852
Pour ouvrir une ressource CURL, tu dois faire:
__________________
:q :q! :wq :w :w! :wq! :quit :quit! :help help helpquit quit quithelp
:quitplease :quitnow :leave :shit ^X^C ^C ^D ^Z ^Q QUITDAMMIT
Jabber: ripat at im.apinc.org
ripat est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/10/2006, 16h17   #13
Candidat au titre de Membre du Club
 
Inscription : mars 2005
Messages : 101
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 101
Points : 12
Points : 12
oui mais en faisant ca, je perds ma 1ere ressource, et donc ce n'est plus la meme session non?
brasco06 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/10/2006, 17h10   #14
Membre émérite
 
Inscription : mai 2004
Messages : 709
Détails du profil
Informations personnelles :
Localisation : Belgique

Informations forums :
Inscription : mai 2004
Messages : 709
Points : 852
Points : 852
J'essaye de te comprendre. Tu veux accéder à un site et y lancer un script après t'être identifié. L'identification CURL se passe toujours en deux temps:
  • Tu captures le cookie envoyé par la page d'identification:
    Code :
    curl_setopt($ch, CURLOPT_COOKIEJAR, "\tmp\cookie.txt");
  • à chaque nouvelle demande de page dans le même script ou dans un autre, tu réinjectes le cookie avec
    Code :
    curl_setopt($ch, CURLOPT_COOKIEFILE, "\tmp\cookie.txt");
  • Le code que tu mets plus haut fait le tout en une seule étape en suivant la redirection envoyée par le site, juste après le cookie. C'est la fonction de l'option CURLOPT_FOLLOWLOCATION.

Il faut bien comprendre la logique des échanges d'entêtes http entre le site et le client (ici CURL). Ensuite, il faut procéder par essais-erreurs pour arriver à tes fins. Ainsi que lire la doc et d'essayer, "à blanc", les exemples de la doc.

Je suppose que tu n'as pas la main sur la cible et que tu essayes de court-circuiter les pages d'indentification pour accéder à une page ou script particulier. Rien de mal à cela mais si la cible est un site qui n'aime pas les bots, tu peux t'attendre à une bonne défense. CURL est l'outil préféré des robots.

Si, par contre il s'agit d'un simple site avec une authentification de base, c'est jouable.

Pour t'aider dans ton déboguage, affiche les headers reçus (CURLOPT_HEADER) et analyse-les.
__________________
:q :q! :wq :w :w! :wq! :quit :quit! :help help helpquit quit quithelp
:quitplease :quitnow :leave :shit ^X^C ^C ^D ^Z ^Q QUITDAMMIT
Jabber: ripat at im.apinc.org
ripat est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/10/2006, 17h14   #15
Candidat au titre de Membre du Club
 
Inscription : mars 2005
Messages : 101
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 101
Points : 12
Points : 12
j'ai acces au serveur cible, car c'est pour un stage.
Le serveur appartient à mon entreprise.


j'ai du mal a comprendre ce systeme de cookie en effet !
brasco06 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/10/2006, 14h11   #16
Candidat au titre de Membre du Club
 
Inscription : mars 2005
Messages : 101
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 101
Points : 12
Points : 12
bonjour,

j'ai réussi en capturant une 1ere fois le cookie et en le ré injectant avec toutes les options de transfert.

J'ai un petit probleme.

Est-ce que je peux choisir le chemin de mon cookie?

car par défaut il se créer a la racine de apache.
brasco06 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/10/2006, 17h11   #17
Membre émérite
 
Inscription : mai 2004
Messages : 709
Détails du profil
Informations personnelles :
Localisation : Belgique

Informations forums :
Inscription : mai 2004
Messages : 709
Points : 852
Points : 852
Tu y mets le chemin que tu veux avec, toutefois, la limitation définie dans open_basedir du php.ini.

Certaines versions de PHP/CURL passent au travers de cette limitation mais chuuut il ne faut le dire à personne!
__________________
:q :q! :wq :w :w! :wq! :quit :quit! :help help helpquit quit quithelp
:quitplease :quitnow :leave :shit ^X^C ^C ^D ^Z ^Q QUITDAMMIT
Jabber: ripat at im.apinc.org
ripat est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 06h21.


 
 
 
 
Partenaires

Hébergement Web