Votre question

[c#] HttpWebRequest et Recaptcha google ...

Tags :
  • Google
Dernière réponse : dans Programmation
12 Mai 2013 00:23:18

Bonjour,
Pour un projet personnelle j'ai besoin de remplir un formulaire en ligne qui contiens un recaptcha ( le captcha de google ... )

Donc dans un premier temps a l'aide d'un WebBrowser je recupaire le code html de la page que je découpe de manière a retrouvais le "challenge" ( qui me permet de récupérer l'image du captcha )

  1. string htmlbody = temp.Document.Body.InnerHtml;
  2. var a = htmlbody.IndexOf("http://www.google.com/recaptcha/api/image?c=");
  3. if (a > 0)
  4. {
  5. var b = htmlbody.IndexOf('"', a);
  6. var urlimg = htmlbody.Substring(a, b - a);
  7. _listwebsite[avancement].Chalengevalue = urlimg.Substring(45);
  8. pictureBox1.Load(urlimg);
  9. }


ensuite a l'aide d'un httpwebrequest je fais une requête post, mais a chaque fois quand j'affiche le code retour pour voir ce qui ce passe je peut voir que le captcha n'a pas marcher ...

avec en data :
  1. "&" + _listwebsite[avancement].Chalengechamp + "=" +
  2. _listwebsite[avancement].Chalengevalue + "&" +
  3. _listwebsite[avancement].Chalengereponcechamp + "=" +
  4. _listwebsite[avancement].Chalengereponcevalue;


recaptcha_challenge_field pour chalengechamp
recaptcha_response_field pour chalengereponce

voila le code que j'utilise ,que j'ai trouvais sur le net :
  1. string uri = _listwebsite[avancement].GetValideUrl;
  2.  
  3. // create a request
  4. HttpWebRequest request = (HttpWebRequest)
  5. WebRequest.Create(uri); request.KeepAlive = false;
  6. request.ProtocolVersion = HttpVersion.Version10;
  7. request.Method = "POST";
  8.  
  9. // turn our request string into a byte stream
  10. byte[] postBytes = Encoding.ASCII.GetBytes(post_data);
  11.  
  12. // this is important - make sure you specify type this way
  13. request.ContentType = "application/x-www-form-urlencoded";
  14. request.ContentLength = postBytes.Length;
  15. Stream requestStream = request.GetRequestStream();
  16.  
  17. // now send it
  18. requestStream.Write(postBytes, 0, postBytes.Length);
  19. requestStream.Close();
  20.  
  21. // grab te response and print it out to the console along with the status code
  22. HttpWebResponse response = (HttpWebResponse)request.GetResponse();
  23. Form2 aa = new Form2(new StreamReader(response.GetResponseStream()).ReadToEnd());
  24. aa.Show();
  25. MessageBox.Show(response.StatusCode.ToString());



y a-t-il un façon particulière a suivre pour les captcha google ?, pourquoi cela ne marche pas ?

Autres pages sur : httpwebrequest recaptcha google

16 Mai 2013 21:30:30

Je suis pas sûr d'avoir compris tes data, mais je pense que tu n'utilises pas les bons tags. Pour le challenge, c'est "&challenge=" et pour la réponse "&response=", "&privatekey=", "&remoteip="

Pour les tags exacts, tu peux voir le code source de recaptcha_check_answer:
http://www.sourcexref.com/xref/escher/nav.html?plugins/recaptcha/recaptchalib.php.source.html#l143
  1. 'privatekey' => $privkey,
  2. 'remoteip' => $remoteip,
  3. 'challenge' => $challenge,
  4. 'response' => $response,
16 Mai 2013 22:37:15

Je ne veux pas utilisé l'api, puisque je veux validée un formulaire sur un site distant ... qui n'est pas a mois !
Je croix que j'ai pas trouvais plus simple comme site pour tester : http:// www . freebitcoins . me /
Le but serais de valider cette page juste en tapent le recaptcha ... d'ou l'utilisation des champs : recaptcha_challenge_field et recaptcha_response_field

donc je forme ma requete avec ( dans le cas du site que j'ai link ) 'btcaddr=' '&recaptcha_challenge_field=' & 'recaptcha_response_field='
22 Mai 2013 23:22:38

OK je vois.

Pour le response field, tu as bien un '+' entre les 2 mots dans le lien final? (on ne sait jamais :)  )

Le challenge à utiliser semble bien le même entre le GET image et le POST résultant, et j'imagine que tu fais bien le GET challenge puisque tu fais le GET image.
Je vois qu'il y a les cookies de google analytics envoyés dans la requête, mais je ne pense pas que ce soit le problème (tu peux faire un test).

Un dernier point, dans ce site, dans l'entête, il y a les champs:
request.Host = "www . freebitcoins . me"
request.Referer = "http:// www . freebitcoins . me / index . php"
C'est peut-être aussi juste pour google analytics, mais on ne sait jamais.

après il faudrait voir si la compression gzip est obligatoire.
Enfin bref, essaie de reprendre tous les paramètres jusqu'à ce que ça marche.
Je testerai peut-être en python un jour si j'ai le temps (c'est pas gagné :)  )
23 Mai 2013 01:02:57

Alors de mon coter j'ai avancé ^^.

Finalement j'utilise un WebClient : http://msdn.microsoft.com/fr-fr/library/system.net.webc...

Le problème de ce WebClient c'est qu'il ne gère pas l’accès a un DOM dynamique ou un truc du genre ...
En gros je me retrouve avec une page brute sans que tous le JS soit exécuter ect ...

Du coup le recaptcha de google n'est pas charger ... mais l'on trouve dans le code un lien qui permet a l'api de charger les info manquante ...
Ce lien est :
  1. http://www.google.com/recaptcha/api/challenge?k=[clef api du site]


Pour récupérer ce truc , un petit parsing de la page
  1. int a = html.IndexOf("http://www.google.com/recaptcha/api/challenge?k=");
  2. int b = html.IndexOf('"', a);


ensuite un substring de a à b-a ...
Une fois ce lien récupérer quand on y accède on tombe sur un petit morceaux de javascript, un simple array et un truc bisard ...

dans cette array l'on retrouve la clef api du site , on vas y trouvais aussi le challenge , et quelque info supplémentaire ( un recaptcha est valide 18000 seconde, je savais pas ^^ ).
bref on pars le fichier et on repart avec le challenge .

voila la fonction entière :
  1. private string challengeByHtml(string html)
  2. {
  3. int a = html.IndexOf("http://www.google.com/recaptcha/api/challenge?k=");
  4. int b = html.IndexOf('"', a);
  5. var webclient = new WebClient();
  6. string javascriptRecaptcha = webclient.DownloadString(html.Substring(a, b - a));
  7. int c = javascriptRecaptcha.IndexOf("challenge : '");
  8. int d = javascriptRecaptcha.IndexOf("',", c + 13 );
  9. string challenge = javascriptRecaptcha.Substring(c + 13, d - (c + 13 ));
  10. return challenge;
  11. }


Nous voila avec le challenge, a ce moment la pour charger l'image associer :
  1. pictureBox1.Load("http://www.google.com/recaptcha/api/image?c=" + challenge);

Hurrr durrrrr ....

Et enfin pour poster la réponse, 4 petit lignes :
  1. WebClient wc = new WebClient();
  2. var URI = new Uri(_listwebsite[avancement].GetValideUrl);
  3. wc.Headers["Content-Type"] = "application/x-www-form-urlencoded";
  4. var a = wc.UploadString(URI, "POST", post_data);


A ce moment la, la variable a contient le html de la page retour, un petit pars pour les infos de debug est le tour est jouer ...

Jusque la le code marche, le webclient est utilisé de manière synchrone ( pour simplifier la logique du code ), mais on pourrais totalement utilisé le webclient en asynchrone (enfin dans mon cas, c'est inutile)...

Donc le problème de recaptcha est résolut ^^

mais maintenant je suis sur un autre problème, c'est que je en reçois pas les paiement du site, donc effectivement j'ai du oublier quelque part certaine valeur a renvoyer ... ( puisque si je le fais a la main sur le site je reçois bien l'argent )

( Ou comment transformer une petit partie de son code en un farmeur de bitcoin ^^ )
Je vais regarder du coter des champ request.Host, request.Referer, je ne suis pas surn je vais peut etre dire une connerie mais pour moi ce sont les champ associer au formulaire , le requeste.Host correspond a l'Host qui envoie le formulaire ( cela permet de vérifier que le formulaire a bien était remplie sur votre site n'a pas était copier/coller sur un autre site ... ), et le requeste.Referer correspondrais a l'url sur la quel doit être envoyer les info du formulaire au moment de ça validation ... enfin je le vois comme ça moi , je peut me tromper, notamment comment cela marcherais quand il y a plusieurs formulaire sur la même page ... je vais me renseigner sur tous sa , et je reviendrais surement avec des nouvelle ^^

Si quelqu'un veut s'amuser, voila une addr bitcoin valide ^^ : 1CtTM4C9AFFABEoSzhuv1RcBEoJAmLaCYN
(Je plaide non coupable de toute les futurs accusations... et je demande le soutient de mes confrères modérateur pour l'issue du futur procès ; ça c'est fais ! )

Bon, je quand même aller creuser du coter des champ requeste ....

Ps : Outch la geule des lien dans les bloc de code ....
23 Mai 2013 22:28:18

Je te conseille d'utiliser Firebug sous Firefox si ce n'est pas déjà le cas. Dans l'onglet "Réseau", on voit toutes les requêtes et leur enchainement, ainsi que toutes les données (uri et data) en détail. On voit facilement la légère authentification.
Je n'ai pas regardé la suite, mais le plus probable est qu'après la validation du recaptcha, il y ait un JS qui continue son exécution en faisant d'autres requêtes sur le serveur.
Tom's guide dans le monde
  • Allemagne
  • Italie
  • Irlande
  • Royaume Uni
  • Etats Unis
Suivre Tom's Guide
Inscrivez-vous à la Newsletter
  • ajouter à twitter
  • ajouter à facebook
  • ajouter un flux RSS