Captcha abfragen

11/14/2014 02:01 Hype#1
Es geht um folgendes:

Ich möchte eine Captcha von einer Website(ok.de) auslesen.
Da ich eine Registrierung per HtmlWebRequest abschicken möchte, kommt für mich kein normaler WebBrowser in Frage.
Soweit habe ich alles schon gemacht, den HTML Code habe ich mir nun genau angeschaut.
Die einzigen beiden Links, die mit dem Captcha zutun haben, sind folgende:

HTML Code:
<script type="text/javascript" src="https://www.google.com/recaptcha/api/challenge?k=6LeTItQSAAAAAMMAMVABUkh53Qp84ni9wVr1B4Yr"></script>
und

HTML Code:
<iframe src="https://www.google.com/recaptcha/api/noscript?k=6LeTItQSAAAAAMMAMVABUkh53Qp84ni9wVr1B4Yr" height="300" width="500" frameborder="0"></iframe><br/>
Nun... diese Links kann ich zwar mit RegEx auslesen, jedoch wird man, wenn man auf diese Links mal klickt feststellen, dass man dort keine Bilder findet...
Wenn ich über einen normalen Browser(Chrome, Firefox etc.) auf die Seite ok.de gehe und einen Rechtsklick auf das Captcha mache, kann man sich die Bild-Url kopieren oder das Bild in einem neuen Tab anzeigen lassen.
Genau diesen Link brauche ich aber in meiner VB Anwendung, doch dieser ist nur über den normalen Quelltext der Seite zu bekommen. (Nicht der HTML Text durch HtmlWebRequest)

Kann mir jemand erklären, wie ich an den normalen Quelltext rankomme?
Danke

Mfg
11/14/2014 18:01 Mostey#2
Das wird der selbe Link sein, ich bezweifle das dort mit JS etwas geändert wird. Problematisch ist nur, das du vermutlich ohne Cookies darauf gehst weshalb du dann kein Bild angezeigt bekommst.

Übrigens: Finger weg von RegEx in solchen Fällen. Mach das gleich mit einem gescheiten HTML Parser, HtmlAgilityPack zum Beispiel.
11/14/2014 19:34 Hype#3
In Bezug auf die Cookies: Ich benutze einen CookieContainer; muss ich den beim Aufrufen des Captcha Links auch mit schicken?

Regex soll ja Schwierigkeiten mit HTML's haben, jedoch muss ich in dem Fall nur den Link aus dem Code bekommen, das funktioniert ja noch ganz gut.
Mit HtmlAgilityPack beschäftige ich mich später gerne mal :)
11/14/2014 23:22 123Tim321#4
Entweder es liegt an mir oder an dir...
Aber egal mit welchem Broweser ich den link des Bildes aufrufe sehe ich auch ein Bild.
_
-
Also, entweder du machst es kompliziert, ich bin jetzt mal auf deinen Code eingegangen...
Du rufst die Seite aus, die du ausgelesen hast, auf dieser ließt du den Link zum Bild aus und lädst den Link z.B in eine PictureBox, hier mal ein Bild:
[Only registered and activated users can see links. Click Here To Register...]
-
Ich "habe" als ich ein Mail Account Generator einfach einen Webbrowser benutzt (ja ich hab gelesen, dass du ihn nicht nutzen willst) und hab mir über die ID den Link für das Bild geholt. Du kannst den Webbrowser ja einfach unvisible machen und den Link in einem string speichern...
Hier noch ein Bild:
[Only registered and activated users can see links. Click Here To Register...]


Tim

Edit:
Hier mal ein Tipp in VB Code:
Code:
WebBrowser1.Document.GetElementById("recaptcha_challenge_immage").TextContent
11/14/2014 23:50 tolio#5
erstmal den webbrowser müll in die tonne treten, webrequests ist da schon der richtige ansatz.
anschließened http verstehen dann ergibt sich das ganze auch, stichwort cookies.
hätte ich schon heute nacht was schreiben wollen, dann dachte ich mir cross forum poster kann man ruhig mal warten lassen
11/14/2014 23:57 Hype#6
@tolio: In Vb paradise gab es ja ein paar Komplikationen in Bezug auf die Möglichkeit der Erstellung eines Bots. Da dort um die Uhrzeit wirklich wenig Leute online waren, habe ich es hier nochmal probiert, da ich gestern Abend noch die Funktion mit dem Captcha auslesen fertig machen wollte.

Dann werde ich das ganze mal mit Cookie probieren, danke :)



Quote:
Originally Posted by 123Tim321 View Post
[...]
Ich "habe" als ich ein Mail Account Generator einfach einen Webbrowser benutzt (ja ich hab gelesen, dass du ihn nicht nutzen willst) und hab mir über die ID den Link für das Bild geholt. Du kannst den Webbrowser ja einfach unvisible machen und den Link in einem string speichern...
[...]
Wenn ich die Regipage mit 2 versch. Wegen aufrufe, bekomme ich 2 verschiedene Captcha's. Das wäre nicht wirklich hilfreich, weil der Benutzer nur den Captcha des Webbrowsers beantworten kann, jedoch ist dieser nicht derselbe, den ich durch HttpWebRequest bekomme
11/15/2014 16:51 123Tim321#7
Quote:
Originally Posted by Tadashi' View Post
Wenn ich die Regipage mit 2 versch. Wegen aufrufe, bekomme ich 2 verschiedene Captcha's. Das wäre nicht wirklich hilfreich, weil der Benutzer nur den Captcha des Webbrowsers beantworten kann, jedoch ist dieser nicht derselbe, den ich durch HttpWebRequest bekomme
Stimmt, hab ich voll vergessen :handsdown: .
11/17/2014 13:03 Yaknar#8
Es mit einem Webbrowser Control zu machen wäre meiner Meinung nach nicht sehr optimal, da es dadurch sehr langsam wird.

Es ist meiner Meinung nach eigentlich ganz einfach an die Bilder zukommen. Hier einmal erklärt:

Wie du geschrieben hast, hast du bereits die ok.de Seite, auf der die Captchas mit ihren Public Keys stehen. In deinem Fall: 6LeTItQSAAAAAMMAMVABUkh53Qp84ni9wVr1B4Yr

Dann gibt es einmal die Möglichkeit, die dein Browser macht, wenn er Javascript hat oder nicht. Für die spätere Umsetzung im Programm ist es eigentlich egal, welche Methode man nutzt.

Mit Javascript:

HTML Code:
<script type="text/javascript" src="https://www.google.com/recaptcha/api/challenge?k=6LeTItQSAAAAAMMAMVABUkh53Qp84ni9wVr1B4Yr"></script>
Wenn man dann: [Only registered and activated users can see links. Click Here To Register...] aufruft sieht man ein JavaScript Dokument, welches z.B. unter anderem diese Werte enthält:
HTML Code:
var RecaptchaState = {
    challenge : '03AHJ_VuvzfGQkRKNea-6KCSJYzX-46MYP-yD1BtpjOP-epF9_nlZWxqMOz6L-rOfs1aYKpdABdlZbdFjmrj2ld6Z_KcAeuHnvzc00cy8yXxyuWBPxoxEi7U7FlBZHI3uQ4hnHk4fBYRTN0QVoVgnwuOtSLDOPMehPm0_ixJI2xfT4KMD4Ar6sKa_6JpCez7fECXxAhIeeUYucS-IdNguG0A66kb6bh04FiqE2pgz-db68NciJnQS44ZT5gpvr_Rn9UJjuRD_JYPqQNevkB5IsSXg8MXWgTHp9ag',
    timeout : 1800,
    lang : 'de',
    server : 'https://www.google.com/recaptcha/api/',
    site : '6LeTItQSAAAAAMMAMVABUkh53Qp84ni9wVr1B4Yr',
timeout = Zeit die es noch gültig ist.
Lang = Sprache deutsch
Server = Der Server auf dem das Bild nachher ist
Site = Nochmal den Key, der bereits oben ist.
und Challenge = Der Wert aus der das Bild generiert wird.

Aus den Werten baut man dann wie folgt einen String:
server & "image?c=" & challenge

Der dann so aussieht:
HTML Code:
https://www.google.com/recaptcha/api/image?c=03AHJ_VuvzfGQkRKNea-6KCSJYzX-46MYP-yD1BtpjOP-epF9_nlZWxqMOz6L-rOfs1aYKpdABdlZbdFjmrj2ld6Z_KcAeuHnvzc00cy8yXxyuWBPxoxEi7U7FlBZHI3uQ4hnHk4fBYRTN0QVoVg
nwuOtSLDOPMehPm0_ixJI2xfT4KMD4Ar6sKa_6JpCez7fECXxAhIeeUYucS-IdNguG0A66kb6bh04FiqE2pgz-db68NciJnQS44ZT5gpvr_Rn9UJjuRD_JYPqQNevkB5IsSXg8MXWgTHp9ag
Und dort erhält man dann das Bild.


Ohne Javascript:

Erhält man ein HTML Dokument.

Dort ist das bild schon fast komplett eingetragen:

HTML Code:
<center><img width="300" height="57" alt="" src="image?c=03AHJ_Vusz9NlAkmJtTWGU9xdsIlSycnDn6EJCs7V7dQkR4378u-jS-pSN21QCnxxxjlttdiwM9xpw2A8hPtMb9Srrgs2KiPzESzpV0J0IL_owJt4_JC6_6D6BY9rneTs2velK3q4yBuBgWv7G5rK9saE0O0dka5njNuWDaIXKq414YOdjrYTdTf3DSJcfDXPSQXe9lKHNBmqrLL8Kw7RVVsGkoOQL05iQaw"></center>
Dann nimmt man den Wert des src Tags und erhält das:
HTML Code:
image?c=03AHJ_Vusz9NlAkmJtTWGU9xdsIlSycnDn6EJCs7V7dQkR4378u-jS-pSN21QCnxxxjlttdiwM9xpw2A8hPtMb9Srrgs2KiPzESzpV0J0IL_owJt4_JC6_6D6BY9rneTs2velK3q4yBuBgWv7G5rK9saE0O0dka5njNuWDaIXKq414YOdjrYTdTf3DSJcfDXPSQXe9lKHNBmqrLL8Kw7RVVsGkoOQL05iQaw
Dort muss dann noch die URL des Servers vorangestellt werden([Only registered and activated users can see links. Click Here To Register...])das ergibt dann:

HTML Code:
https://www.google.com/recaptcha/api/image?c=03AHJ_Vusz9NlAkmJtTWGU9xdsIlSycnDn6EJCs7V7dQkR4378u-jS-pSN21QCnxxxjlttdiwM9xpw2A8hPtMb9Srrgs2KiPzESzpV0J0IL_owJt4_JC6_6D6BY9rneTs2velK3q4yBuBgWv7G5rK9saE0O0dka5njNuWDaIXKq414YOdjrYTdTf3DSJcfDXPSQXe9lKHNBmqrLL8Kw7RVVsGkoOQL05iQaw
Und dort erhält man dann ebenfalls das Bild.

Bild in die Anwendung bekommen:

Ich habe mir noch mal eben einen kleinen Codeschnipsel in VB geschrieben, der das Bild in eine Picturebox bringt:

Code:
                    Dim req As HttpWebRequest = CType(HttpWebRequest.Create(server & "image?c=" & challenge), HttpWebRequest)
                    req.UserAgent = "Mozilla/5.0 (Windows NT 6.2; WOW64; rv:23.0) Gecko/20100101 Firefox/23.0"
                    req.Host = "www.google.com"
                    req.Referer = "" ' Hier ggf Referer der vorherigen Seite'
                    req.CookieContainer = http.cookiecon ' Der cookiecon muss dann allerdings Public sein. Und ich weiß nicht ob es zwingend erforderlich ist die Cookies zu übernehmen'
                    req.Timeout = 15000 ' Timeout in MS (15Sek)'

                    Dim res As HttpWebResponse = CType(req.GetResponse, HttpWebResponse)

                    Picturebox1.Imgae = Image.FromStream(res.GetResponseStream)
Das ganze sollte natürlich in einem anderen Thread laufen und das Bild per invoke übertragen werden, da sonst die ganze Anwendung steht, solange das Bild heruntergeladen wird.

Ich hoffe ich konnte helfen.