passer un captcha avec curl

passer un captcha avec curl - PHP - Programmation

Marsh Posté le 30-08-2010 à 18:15:19    

bonjour,
 
je précise avant tout que je ne cherche pas à produire du spam avec mon script :jap:  
 
donc voilà, je souhaite programmer un bot qui va devoir se logguer sur mon panneau utilisateur d'un site distant. je suis tout à fait capable de gérer ça moi-même et je l'ai déjà fait, or ici, légère complication, le formulaire d'identification présente un captcha. je me suis dit bon pas de soucis, j'ai juste à faire sur ma page perso un truc tel que:
 

Code :
  1. <form method="post" action="?" >
  2. <img src="http://www.domainedistant.com/captcha.php" /> <input type="text" name="captchapost" />
  3. <input type="submit" value="go" />
  4. </form>


 
donc avec mon script sur ma page perso je n'ai plus qu'à taper le code captcha pour qu'ensuite mon bot se loggue et automatise mes taches sur le site distant. or le code captcha que je saisis est toujours incorrect lorsqu'il est soumis via mon script vers le site distant dont la page traite le formulaire di'dentification. j'ai lu un max d'infos sur google et essayé un max de samples, pas moyen de faire tourner mon script à cause du-dit captcha...
 
 j'ai essayé comme j'ai pu le lire ça et là les "cookiejar" et "cookiefile" tels que:

Code :
  1. curl_setopt($curl, CURLOPT_COOKIEFILE, $cookie_file_path);
  2. curl_setopt($curl, CURLOPT_COOKIEJAR, $cookie_file_path);


 
mais toujours rien...
 
help?  :(

Reply

Marsh Posté le 30-08-2010 à 18:15:19   

Reply

Marsh Posté le 30-08-2010 à 22:04:57    

le captcha présenté a ton bot n'est pas le meme que celui que tu vois

Reply

Marsh Posté le 31-08-2010 à 00:31:16    

pourquoi?
il n'y a aucun captcha présenté à mon bot. lorsque je lance mon script, mon login et mon pass sont stockées dans des vars, il reste donc à saisir le captcha qui du coup n'a été chargé qu'une seule fois et pas deux comme tu le sous-entends. j'envoie ensuite login+pass+captcha en POST sur la page qui traite le form.
je ne te comprends pas.
 
comment y remédier?

Reply

Marsh Posté le 31-08-2010 à 01:07:43    

Ton bot ne se connecte pas sur le site avec le même ID de session, donc, pas la même connexion, donc, à mon avis, protection de php...


---------------
Fort et motivé. Sauf parfois.
Reply

Marsh Posté le 31-08-2010 à 01:27:47    

et donc comment récupérer l'id de session qui vient avec le captcha, et réinjecter cet id de session en POST avec le captcha qui va bien?

Reply

Marsh Posté le 02-09-2010 à 10:41:38    

à l'aide  [:kabouk]  [:kabouk]  [:kabouk]

   

bon, voici un bout de code pour prouver ma bonne volonté  [:taijitu:3]

 
Code :
  1. <?php
  2. if(isset($_POST['captcha'])){
  3. $fp = fopen("cookies.txt",'wb');
  4. fclose($fp);
  5. $postfields = array();
  6. $postfields["uid"] = "mail@mail.com";
  7. $postfields["pwd"] = "pass";
  8. $postfields["rlmmemb"] = "MA";
  9. $postfields["var"] = "http%3a%2f%2fdir%2ewebsite%2ecom%2f";
  10. $postfields["img"] = $_POST['captcha'];
  11. $postfields["rmbr"] = "y";
  12. $url = "http://dir.website.com/process.php";
  13. $useragent = "Mozilla/5.0";
  14. $referer = "http://dir.website.com/";
  15. $ch = curl_init($url);
  16. curl_setopt($ch, CURLOPT_COOKIEJAR, "cookies.txt" );
  17. curl_setopt($ch, CURLOPT_COOKIEFILE, "cookies.txt" );
  18. //CURL options
  19. curl_setopt($ch, CURLOPT_POST, 1);
  20. //On poste les données du tableau $postfields
  21. curl_setopt($ch, CURLOPT_POSTFIELDS, $postfields);
  22. curl_setopt($ch, CURLOPT_USERAGENT, $useragent);
  23. curl_setopt($ch, CURLOPT_REFERER, $referer);
  24. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  25. // en cas de redirection
  26. curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
  27. //Page de résultats et fermeture de session
  28. $result = curl_exec($ch);
  29. curl_close($ch);
  30. //on peut faire un echo du résultat obtenu
  31. echo $result;
  32. }
  33. else{
  34. echo'
  35. <form method="post">
  36. <img src="http://dir.website.com/captcha.php" /><input type="text" name="captcha" />
  37. <input type="submit" />
  38. </form>
  39. ';
  40. }
  41. ?>
  

[:fegafobobos:3]


Message édité par pimsa le 02-09-2010 à 10:42:22
Reply

Marsh Posté le 02-09-2010 à 10:53:41    

Le seul moyen serait de faire wget avec ton bot (ou une copie de l'image avec les fonctions d'image) ainsi ce serait ton bot qui demanderait l'image et ensuite tu n'aurais qu'à l'afficher dans ton navigateur ou sur une page web distante.
D'un autre côté, si il y a un captcha, c'est justement pour éviter l'utilisation des bots donc bon :X


---------------
23Prod, Audit et conception de systèmes d'informations : http://www.23prod.fr
Reply

Marsh Posté le 02-09-2010 à 11:09:52    

ok je vois le problème.
je viens d'essayer ceci:
 

Code :
  1. copy( 'http://dir.website.com/captcha.php', './captcha.jpg' );


 
sans succès  [:taijitu:3]  
 
sinon je me rends compte également qu'il n'y a rien du tout dans mon fichier cookies.txt...
 
 
 
 
le captcha est là pour éviter le spam & co je pense. je ne cherche pas à nuire, je veux juste me loguer et automatiser un truc que je fais régulièrement.

Reply

Marsh Posté le 02-09-2010 à 11:22:47    

Si tu veux que ton cookie.txt se remplisse il faut que tu récupère le captcha avec les fonctions curl sinon tu n'auras pas le bon id_session quand ton robot récupérera le captcha.
Même si tu ne cherches pas à nuire, le captcha sert à bloquer tous les robots quel qu'il soit, donc c'est normal que ce ne soit pas simple :D


---------------
23Prod, Audit et conception de systèmes d'informations : http://www.23prod.fr
Reply

Marsh Posté le 02-09-2010 à 12:39:04    

ok. je suis parvenu à récuperer le cookie envoyé par le captcha.php. mais quand j'essaye d'envoyer le formulaire ça ne fonctionne pas, le serveur renvoie une erreur 500  [:kabouk]  
 
 
voici mon code jusqu'ici:
 

Code :
  1. <?php
  2. $useragent = "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)";
  3. $referer = "http://dir.website.com/";
  4. if(isset($_POST['captcha'])){
  5. // ETAPE 2 ON SE LOG //////////////////////
  6. $postfields = array();
  7. $postfields["var1"] = "val1";
  8. $postfields["var2"] = "http%3a%2f%dir%2ewebsite%2ecom%2f";
  9. $postfields["uid"] = "mail@mail.com";
  10. $postfields["pwd"] = "pass";
  11. $postfields["img"] = $_POST['captcha'];
  12. $url = "http://dir.website.com/captcha.php";
  13. $ch = curl_init($url);
  14. //CURL options
  15. curl_setopt($ch, CURLOPT_POST, 1);
  16. //On poste les données du tableau $postfields
  17. curl_setopt($ch, CURLOPT_POSTFIELDS, $postfields);
  18. curl_setopt($ch, CURLOPT_USERAGENT, $useragent);
  19. curl_setopt($ch, CURLOPT_FRESH_CONNECT, 1);
  20. curl_setopt($ch, CURLOPT_REFERER, $referer);
  21. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  22. // en cas de redirection
  23. curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
  24. curl_setopt($ch, CURLOPT_COOKIEFILE, "cookies.txt" );
  25. //Page de résultats et fermeture de session
  26. $result = curl_exec($ch);
  27. curl_close($ch);
  28. //on peut faire un echo du résultat obtenu
  29. echo '<PRE>'.$result;
  30. //ETAPE 3 J'OUVRE LA PAGE QUI M'INTERESSE ET QUI CONTIENT LES INFOS QUE JE VEUX RECUPERER VIA MON BOT /////////////////
  31. $url3 = "http://dir.website.com/dir/member/file.xml";
  32. $ch3 = curl_init($url3);
  33. curl_setopt($ch3, CURLOPT_USERAGENT, $useragent);
  34. curl_setopt($ch3, CURLOPT_REFERER, $referer);
  35. curl_setopt($ch3, CURLOPT_FRESH_CONNECT, 1);
  36. curl_setopt($ch3, CURLOPT_RETURNTRANSFER, 1);
  37. curl_setopt($ch3, CURLOPT_FOLLOWLOCATION, 1);
  38. curl_setopt($ch3, CURLOPT_COOKIEFILE, "cookies.txt" );
  39. $result3 = curl_exec($ch3);
  40. echo '<PRE>'.$result3;
  41. }
  42. else{
  43. // ETAPE 1 ON RECUPERE LE CAPTCHA //////////////////////
  44. $fp = fopen("cookies.txt",'wb');
  45. fclose($fp);
  46. $url1 = "http://dir.website.com/captcha.php";
  47. $ch1 = curl_init($url1);
  48. curl_setopt($ch1, CURLOPT_RETURNTRANSFER, 1);
  49. curl_setopt($ch1, CURLOPT_FOLLOWLOCATION, 1);
  50. curl_setopt($ch1, CURLOPT_FRESH_CONNECT, 1);
  51. curl_setopt($ch1, CURLOPT_USERAGENT, $useragent);
  52. curl_setopt($ch1, CURLOPT_REFERER, $referer);
  53. curl_setopt($ch1, CURLOPT_COOKIEJAR, "cookies.txt" ); // je sauvegarde le cookie
  54. copy($url1,'./captcha.jpg');
  55. $result1 = curl_exec($ch1);
  56. curl_close($ch1);
  57. echo'
  58. <form method="post">
  59. <img src="./captcha.jpg" /><input type="text" name="captcha" />
  60. <input type="submit" />
  61. </form>
  62. ';
  63. // FIN ETAPE 1 //////////////////////////////////////////////////////
  64. }
  65. ?>


 
 
 
 
 
 
 
 [:kabouk]  [:kabouk]  [:kabouk]

Reply

Marsh Posté le 02-09-2010 à 12:39:04   

Reply

Marsh Posté le 02-09-2010 à 13:53:38    

Utilises

Code :
  1. curl -f -O "http://www.monsite.com/image[01-12].jpg

à la place de la fonction copy car sinon tu vas pas récupérer la bonne image (l'image est généré en fonction de l'id_session) et n'oublie pas dans cette commande de préciser ton fonction de cookie (utilises la fonction system)


---------------
23Prod, Audit et conception de systèmes d'informations : http://www.23prod.fr
Reply

Marsh Posté le 02-09-2010 à 14:15:35    

je ne connais pas la fonction "system"

 

voilà ce que j'ai fais avec la piste que tu me donnes:

 
Code :
  1. // ETAPE 1 ON RECUPERE LE CAPTCHA ET LE COOKIE //////////////////////
  2. $fp = fopen("cookies.txt",'wb');
  3. fclose($fp);
  4. $url1 = "http://dir.website.com/captcha.php";
  5. $ch1 = curl_init($url1);
  6. curl_setopt($ch1, CURLOPT_RETURNTRANSFER, 1);
  7. curl_setopt($ch1, CURLOPT_FOLLOWLOCATION, 1);
  8. curl_setopt($ch1, CURLOPT_FRESH_CONNECT, 1);
  9. curl_setopt($ch1, CURLOPT_USERAGENT, $useragent);
  10. curl_setopt($ch1, CURLOPT_REFERER, $referer);
  11. curl_setopt($ch1, CURLOPT_COOKIEJAR, "cookies.txt" ); // je sauvegarde le cookie envoyé par captcha.php?
  12. curl_setopt($ch1, CURLOPT_BINARYTRANSFER,1);
  13. $result1 = curl_exec($ch1);
  14. $fp = fopen('./captcha.jpg','wb');
  15. fwrite($fp, $result1);
  16. fclose($fp);
  17. curl_close($ch1);
    

maintenant que j'ai copié l'image en jpg et que j'ai un cookie, j'envoie le formulaire:

 
Code :
  1. // ETAPE 2 ON SE LOG //////////////////////
  2. $url = "http://dir.website.com/login.php";
  3. $ch = curl_init($url);
  4. //CURL options
  5. curl_setopt($ch, CURLOPT_POST, 1);
  6. //On poste les données du tableau $postfields
  7. curl_setopt($ch, CURLOPT_POSTFIELDS, "var1=blabla&for=http%3a%2f%2fdir%2ewebsite%2ecom%2f&uid=mail@mail.com&pwd=pass&rmbvar=y&img=".$_POST['captcha']);
  8. curl_setopt($ch, CURLOPT_USERAGENT, $useragent);
  9. curl_setopt($ch, CURLOPT_FRESH_CONNECT, 1);
  10. curl_setopt($ch, CURLOPT_REFERER, $referer);
  11. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  12. // en cas de redirection
  13. curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
  14. curl_setopt($ch, CURLOPT_COOKIEFILE, "cookies.txt" ); // j'envoi le cookie en même temps que la requête POST
  15. //Page de résultats et fermeture de session
  16. $result = curl_exec($ch);
  17. curl_close($ch);
  18. //on peut faire un echo du résultat obtenu
  19. echo '<PRE>'.$result;
 

et rien. erreur de login.

 

y'a un problème de cookie ou de session ou de captcha  [:corten:1]


Message édité par pimsa le 02-09-2010 à 14:17:24
Reply

Marsh Posté le 02-09-2010 à 14:59:58    

Oui mais c'est normal faire un fopen c'est comme faire un copy donc c'est normal, il faut que tu copies l'image en même temps que tu récupères la session. Sinon tu récupères la session, et quand tu copies l'image ce n'est pas la même image générée. Pour la fonction system => http://php.net/manual/fr/function.system.php


---------------
23Prod, Audit et conception de systèmes d'informations : http://www.23prod.fr
Reply

Marsh Posté le 02-09-2010 à 15:06:43    

bah pour l'image normalement c'est ok puisque je fais  
 

Code :
  1. $result1 = curl_exec($ch1);


 
puis  
 

Code :
  1. fwrite($fp, $result1);


 
donc je n'ouvre pas deux fois l'image, je l'ouvre une seule fois, puis je l'enregistre grace à $result1
 
non?  [:fegafobobos:2]  
 
 
 
et je ne comprends pas pourquoi on parle de system()

Reply

Marsh Posté le 02-09-2010 à 17:00:23    

bon j'ai réussi a le faire fonctionner, je sais casser un captcha maintenant  :D  
 
tu m'as bien mis sur la piste merci à toi, j'aurais pas compris l'histoire du double chargement du captcha/cookie/session (moi + bot) sans ton aide  :jap:
 
 
 
 
 
 
 
 [:fegafobobos:1]


Message édité par pimsa le 02-09-2010 à 17:00:38
Reply

Marsh Posté le 03-09-2010 à 10:56:11    

Content d'avoir pu t'aider ^^


---------------
23Prod, Audit et conception de systèmes d'informations : http://www.23prod.fr
Reply

Marsh Posté le 03-09-2010 à 11:06:36    

N'oublie pas de passer ton post en [Résolu]


---------------
23Prod, Audit et conception de systèmes d'informations : http://www.23prod.fr
Reply

Marsh Posté le 23-03-2012 à 15:23:35    

Bonjour
 
Pimsa, j'ai le même problème, et je galère depuis plusieurs jours en tentant de le résoudre.
 
Je n'ai pas saisi ce qui t'a permis de le résoudre. Apparemment, tu as à mettre en place un code qui fonctionne.
 
Pourrais-tu m'aider ?

Reply

Marsh Posté le 03-03-2013 à 20:56:03    

bonjour,
 
je remonte le sujet car j'arrive pas a trouver la solution au probleme
 
voici ma premiere partie du systeme et appatement c'est la que ça ddoit bloquer
 

Code :
  1. // ETAPE 1 ON RECUPERE LE CAPTCHA ET LE COOKIE //////////////////////
  2. $fp = fopen("cookies.txt",'wb');
  3. fclose($fp);
  4. $url1 = "http://monsite.com/antibot.php";
  5. $ch1 = curl_init($url1);
  6. curl_setopt($ch1, CURLOPT_RETURNTRANSFER, 1);
  7. curl_setopt($ch1, CURLOPT_FOLLOWLOCATION, 1);
  8. curl_setopt($ch1, CURLOPT_FRESH_CONNECT, 1);
  9. curl_setopt($ch1, CURLOPT_USERAGENT, $useragent);
  10. curl_setopt($ch1, CURLOPT_REFERER, $referer);
  11. curl_setopt($ch1, CURLOPT_COOKIEJAR, "cookies.txt" ); // je sauvegarde le cookie envoyé par captcha.php?
  12. curl_setopt($ch1, CURLOPT_BINARYTRANSFER,1);
  13. $result1 = curl_exec($ch1);
  14. $fp = fopen('captcha.jpg','wb');
  15. fwrite($fp, $result1);
  16. fclose($fp);
  17. curl_close($ch1);

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed