2014-07-23 9 views
6

Ich versuche, Captchas schneller zu laden, rendere sie dann in einem WebBrowser-Steuerelement und kopiere dann das Bild und rende es in eine Picturebox.Fehlerhaftes Captcha Image von Google ReCaptcha Scrapping

Warum nicht einfach das Bild direkt in die PictureBox herunterladen, was den Vorteil hat, weniger CPU-Auslastung und Speicher zu verwenden. Diese Lösung funktioniert für jeden anderen Captcha-Dienst, der besser Solve Media heißt (mit Solve Media) Sehen Sie sich die Bild-URL an, wenn Sie das nächste Mal versuchen, es anzuzeigen, es gibt Ihnen ein falsches Fehler-catpcha Bild).

Aber jetzt brauche ich Unterstützung für ReCaptcha Captcha-System sowie für die Verwendung der Automatisierung meines Bot schneller, dann nur eine Webseite aktualisieren und warten auf es zu rendern.

Also ich schreibe einfach meinen Code hier so weit ich verstehe Ich vermisse gerade emulieren eine der Eigenschaften in HTML Request Ich habe den User-Agent als echten Internet Explorer 8 gefälscht, ich denke, das Problem ist das Cookie scheint irgendwie einen Cookie zu generieren, ich kann nicht herausfinden, wo, aber ich bekomme auch einen Cookie, den ich beim Herunterladen der Javascript-Datei finde.

In beiden Fällen versucht Google ReCaptcha, Sie mit einem falschen Captcha zu betrügen, das Sie nicht lesen können, um es in Ihrem Gesicht zu reiben, dass Sie nicht etwas richtig machen. Ich habe herausgefunden, wenn man die 2 schwarzen Kreise sieht, dann ist es offensichtlich, dass es falsch ist. Hier

ist ein Beispiel für Bad-Check Captcha und Gut Check Captcha

captchagood captcha

An einem Punkt Ich erinnere mich ReCaptcha ein weiteres Sicherheitsmerkmal hatte die irgendwie wußte, wenn Sie das Captcha Bild von der tatsächlichen Domain geladen, wo sie gesetzt werden Ich weiß nicht, wie das funktioniert, seit ich alles lokal heruntergeladen habe, oder? aber sie scheinen dieses Feature sowieso entfernt zu haben. (Eigentlich existiert es auf manchen Webseiten anscheinend standardmäßig deaktiviert, einfach auszutricksen benutzt Referer Header)

Ich versuche hier nichts zu schummeln werde ich noch manuell in diese Captchas eintippen aber das will ich auch Geben Sie sie schneller ein als erforderlich, um die Seite normal darzustellen.

Ich möchte, dass die Captchas entweder diese Straßennummern oder mindestens 2 Wörter ohne diese schwarzen Kreise werden.

Wie auch immer, hier ist mein aktueller Code.

Dim newCaptcha = New Captcha 
Dim myUserAgent As String = "" 
Dim myReferer As String = "http://www.google.com/recaptcha/demo/" 
Dim outputSite As String = HTTP.HTTPGET("http://www.google.com/recaptcha/demo/", "", "", "", myUserAgent, myReferer) 
Dim recaptchaChallengeKey = GetBetween(outputSite, "http://www.google.com/recaptcha/api/challenge?k=", """") 

'Google ReCaptcha Captcha 
outputSite = HTTP.HTTPGET("http://www.google.com/recaptcha/api/challenge?k=" & recaptchaChallengeKey, "", "", "", myUserAgent, myReferer) 

'outputSite = outputSite.Replace("var RecaptchaState = {", "{""RecaptchaState"": {") 
'outputSite = outputSite.Replace("};", "}}") 
'Dim jsonDictionary As Dictionary(Of String, Object) = New JavaScriptSerializer().Deserialize(Of Dictionary(Of String, Object))(outputSite) 
Dim recaptchaChallenge = GetBetween(outputSite, "challenge : '", "',") 
outputSite = HTTP.HTTPGET("http://www.google.com/recaptcha/api/js/recaptcha.js", "", "", "", myUserAgent, myReferer) 'This page looks useless but it seems the javascript loads this anyways, maybe this why I get bad captchas? 

If HTTP.LoadWebImageToPictureBox(newCaptcha.picCaptcha, "http://www.google.com/recaptcha/api/image?c=" & recaptchaChallenge, myUserAgent, myReferer) = False Then 
    MessageBox.Show("Recaptcha Image loading failed!") 
Else 
    Dim newWork As New Work 
    newWork.CaptchaForm = newCaptcha 
    newWork.AccountId = 1234 'ID of Accounts. 
    newWork.CaptchaHash = "recaptcha_challenge_field=" & recaptchaChallenge 
    newWork.CaptchaType = "ReCaptcha" 
    Works.Add(newWork) 
    newCaptcha.Show() 
End If 

Hier ist die HTTP-Klasse, die ich verwende.

Imports System.Collections.Generic 
Imports System.Linq 
Imports System.Text 
Imports System.Net 
Imports System.IO 
Public Class HTTP 

    Public StoredCookies As New CookieContainer 

    Public Function HTTPGET(ByVal url As String, ByVal proxyname As String, ByVal proxylogin As String, ByVal proxypassword As String, ByVal userAgent As String, ByVal referer As String) As String 
     Dim resp As HttpWebResponse 
     Dim req As HttpWebRequest = DirectCast(WebRequest.Create(url), HttpWebRequest) 

     If userAgent = "" Then 
      userAgent = "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET4.0C; .NET4.0E; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)" 
     End If 
     req.UserAgent = userAgent 
     req.Referer = referer 
     req.AllowAutoRedirect = True 
     req.ReadWriteTimeout = 5000 
     req.CookieContainer = StoredCookies 
     req.Headers.Set("Accept-Language", "en-us") 

     req.KeepAlive = True 
     req.Method = "GET" 

     Dim stream_in As StreamReader 

     If proxyname <> "" Then 
      Dim proxyIP As String = proxyname.Split(New Char() {":"})(0) 
      Dim proxyPORT As Integer = CInt(proxyname.Split(New Char() {":"})(1)) 

      Dim proxy As New WebProxy(proxyIP, proxyPORT) 
      'if proxylogin is an empty string then don't use proxy credentials (open proxy) 
      If proxylogin <> "" Then 
       proxy.Credentials = New NetworkCredential(proxylogin, proxypassword) 
      End If 
      req.Proxy = proxy 
     End If 

     Dim response As String = "" 
     Try 
      resp = DirectCast(req.GetResponse(), HttpWebResponse) 
      StoredCookies.Add(resp.Cookies) 
      stream_in = New StreamReader(resp.GetResponseStream()) 
      response = stream_in.ReadToEnd() 
      stream_in.Close() 
     Catch ex As Exception 
     End Try 
     Return response 
    End Function 


    Public Function LoadWebImageToPictureBox(ByVal pb As PictureBox, ByVal ImageURL As String, ByVal userAgent As String, ByVal referer As String) As Boolean 
     Dim bAns As Boolean 

     Try 
      Dim resp As WebResponse 
      Dim req As HttpWebRequest 

      Dim sURL As String = Trim(ImageURL) 

      If Not sURL.ToLower().StartsWith("http://") Then sURL = "http://" & sURL 

      req = DirectCast(WebRequest.Create(sURL), HttpWebRequest) 

      If userAgent = "" Then 
       userAgent = "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET4.0C; .NET4.0E; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)" 
      End If 
      req.UserAgent = userAgent 
      req.Referer = referer 
      req.AllowAutoRedirect = True 
      req.ReadWriteTimeout = 5000 
      req.CookieContainer = StoredCookies 
      req.Headers.Set("Accept-Language", "en-us") 

      req.KeepAlive = True 
      req.Method = "GET" 

      resp = req.GetResponse() 
      If Not resp Is Nothing Then 
       Dim remoteStream As Stream = resp.GetResponseStream() 
       Dim objImage As New MemoryStream 
       Dim bytesProcessed As Integer = 0 
       Dim myBuffer As Byte() 
       ReDim myBuffer(1024) 
       Dim bytesRead As Integer 
       bytesRead = remoteStream.Read(myBuffer, 0, 1024) 
       Do While (bytesRead > 0) 
        objImage.Write(myBuffer, 0, bytesRead) 
        bytesProcessed += bytesRead 
        bytesRead = remoteStream.Read(myBuffer, 0, 1024) 
       Loop 
       pb.Image = Image.FromStream(objImage) 
       bAns = True 
       objImage.Close() 
      End If 
     Catch ex As Exception 
      bAns = False 
     End Try 

     Return bAns 
    End Function 
End Class 

EDIT: dachte ich, das Problem heraus, dass es bei

this Google Javascript Clientside Obfuscated Verschlüsselungssystem ist

http://www.google.com/js/th/1lOyLe_nzkTfeM2GpTkE65M1Lr8y0MC8hybXoEd-x1s.js

Ich mag noch in der Lage sein, es zu besiegen, ohne vielleicht einen schweren Web-Browser zu verwenden einig leichtes schnelles javascript auswerten steuerung? Es hat keinen Sinn, sie zu entschlüsseln und auf VB.NET zu portieren, denn sobald ich es tue, könnten sie ein paar Variablen oder die Verschlüsselung komplett ändern und ich habe all das für nichts getan, also möchte ich etwas, das intelligenter ist. An diesem Punkt weiß ich nicht einmal, wie die URL generiert wird, sie scheint für den Moment statisch zu sein und es ist wahrscheinlich eine echte Datei, nicht nur eine zeitlich generierte Datei.

Stellt die _challenge Seite heraus, die die Herausforderung für das Bild gibt, ist nur eine Köderherausforderung .. diese Herausforderung wird dann ersetzt (verschlüsselt möglicherweise?) Clientseitig mit Variablen t1, t2, t3, scheint diese Verschlüsselung nicht benutzt wird jedes Mal, wenn du es passierst, sobald du Zugriff darauf bekommst, das zu tun, was ich versuche zu tun, funktioniert mein Code, aber es hört auf, in sehr zufälligen Intervallen zu arbeiten, ich will etwas festeres, das ich seit Wochen unbeaufsichtigt lassen kann.

Antwort

9

Ich hatte das gleiche Problem und habe eine Lösung gefunden, die nicht die einfachsten Captchas liefert, aber zumindest Bilder, die viel einfacher sind. Das Ergebnis wird ein lesbares und ein verdecktes Wort sein.

Ich fand, dass das Herunterladen von "recaptcha/api/reload" wichtig ist, um das zu erreichen. Vielleicht macht es auch einen Unterschied, den "cachestop" -Parameter und vielleicht den Referer hinzuzufügen.

data = UrlMgr("http://www.google.com/recaptcha/api/challenge?k=%s&cachestop=%.17f" % (id, random.random()), referer=referer, nocache=True).data 
challenge = re.search("challenge : '(.*?)',", data).group(1) 
server = re.search("server : '(.*?)',", data).group(1) 
# this step is super important to get readable captchas - normally we could take the "c" from above and already retrieve a captcha but 
# this one would be barely readable 
reloadParams["c"] = challenge 
reloadParams["k"] = id 
reloadParams["lang"] = "de" 
reloadParams["reason"] = "i" 
reloadParams["type"] = "image" 
data = UrlMgr("http://www.google.com/recaptcha/api/reload" , params=reloadParams, referer=referer, nocache=True).data 
challenge = textextract(data, "Recaptcha.finish_reload('", "',") 
return challenge, solveCaptcha(UrlMgr("%simage" % (server), params={"c":challenge}, referer=referer)) 

Für weitere Verbesserungen meine Vermutung ist, dass der "th" Parameter verwendet wird, um Bots zu erkennen. Es wird von einigen komplizierten Javascript generiert, die ich selbst nicht debuggen.

+0

'reloadParams' sind das' POST' oder 'GET'? – SSpoke

+0

Gefunden es ist Python 'von tools.url importieren UrlMgr 'scheint es' GET' standardmäßig, es sei denn, Sie verwenden 'post = params' vielleicht? – SSpoke

+1

Wow, es funktioniert perfekt, hoffentlich reparieren sie es nicht, Puh! – SSpoke