re captcha anzeigen in vb.net?

10/31/2013 13:54 DeinMud#16
Joa oder ich verfolg den Thread hier weiter, vllt hat jmd nen Weg.
10/31/2013 14:35 dready#17
Wie botter2k erklärt hat, die Anfrage selbst machen bei der Webrequest, die Letze Anfrage sollte dir das Bild zurückgeben.
Danach hast du alle Daten um eine neue Request aufzumachen und zu beantworten?

Er hat es dir doch Schritt für Schritt erkärt.

@botter2k
Warum sind Cookies ein Problem ?
Werden welche mit JS gesetzt ? Konnt ich mich bei Recaptcha jetzt nicht dran erinnern.
10/31/2013 14:36 #SoNiice#18
Code:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.IO;
using System.Text.RegularExpressions;
using System.Web;
using System.Drawing;
 
class ReCaptchaViewer {
    CookieContainer cookies = new CookieContainer();
    Image captchaImage = null;
    string challengeField = string.Empty;
 
    public ReCaptchaViewer(string noScript) {
        GetCaptchaImage(noScript);
    }
 
    public Image CaptchaImage {
        get { return captchaImage; }
    }
 
    public string ChallengeField {
        get { return challengeField; }
    }
 
    private void GetCaptchaImage(string noScript) {
        HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create("http://www.google.com/recaptcha/api/noscript?k=" + noScript);
        req.CookieContainer = cookies;
        string src = new StreamReader(req.GetResponse().GetResponseStream()).ReadToEnd();
 
        challengeField = new Regex("id=\"recaptcha_challenge_field\" value=\"([^\"]+)\">").Match(src).Groups[1].Value;
 
        string imageLocation = Regex.Match(src, "src=\"([^\"]+)\"").Groups[1].Value;
        req = (HttpWebRequest)HttpWebRequest.Create("http://www.google.com/recaptcha/api/" + imageLocation);
        captchaImage = Image.FromStream(req.GetResponse().GetResponseStream());
    }
 
    public string GetNoScriptField(string src) {
        return Regex.Match(src, "iframe src=\"http://api.recaptcha.net/noscript\\?k=([A-Za-z0-9-_]+)\"").Groups[1].Value;
    }
}
Das ist eine C# Klasse, die ich vor etlichen Monaten (oder vielleicht auch vor 1 - 2 Jahren?) genutzt habe, weiß daher nicht ob diese überhaupt noch so funktioniert bezüglich der ReCaptcha-Geschichte. Einfach mal testen ;O
10/31/2013 16:33 schmir#19
html code auslesen und in richtextbox wieder anzeigen lassen.

Falls das Captcha als Bild hinterlegt ist einfach nur aus dem Quellcode den Bilderlink nehmen und in einer Picturebox anzeigen lassen.

Ich vermute mal das dein Problem sein wird das du über das Browser Control gehst und dort nicht so einfach den Quellcode nutzen kannst.
Mache die Anfrage per httpwebrequest und les es aus der response aus. Dann überlege dir eine Logik für das Captcha und lasse es automatisch knacken. Oder mache dir eine Lernfunktion.
10/31/2013 16:53 DeinMud#20
@dready
Wenn man eine neue webrequest "aufmacht" ändert sich das captcha, oder nicht?!
10/31/2013 17:18 dready#21
Die Webrequest holt dir nur den QuellCode, da läuft kein Parsing ab, heißt das ganze Laden des Captachs machst du ja selbst -> wird auch nur einmal angefragt.
10/31/2013 17:36 DeinMud#22
Also, ich hatte es hier mal versucht, leider hat sich das Captcha immer geändert;
Code:
Imports System.Net
Imports System.IO
Imports System.Text
Imports System.Text.RegularExpressions
Public Class Form1
    Private cookiecon As New CookieContainer
    Private UserAgent As String = "Mozilla/5.0 (Windows NT 6.1; rv:8.0) Gecko/20100101 Firefox/8.0"
    Private ContentType As String = "application/x-www-form-urlencoded"
    Private request As HttpWebRequest
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        request = DirectCast(HttpWebRequest.Create("https://signup.leagueoflegends.com/de/signup/index"), HttpWebRequest)
        Dim response As HttpWebResponse = DirectCast(request.GetResponse, HttpWebResponse)
        Using sr As New StreamReader(response.GetResponseStream)
            Dim input As String = sr.ReadToEnd
            Dim match As Regex = New Regex("/de/signup/captcha/.+?""")
            PictureBox1.ImageLocation = String.Concat("http://signup.leagueoflegends.com", match.Match(input).Value)
        End Using
    End Sub
    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
        request = DirectCast(HttpWebRequest.Create("https://signup.leagueoflegends.com/de/signup/index"), HttpWebRequest)
        request.Method = "POST"
        request.CookieContainer = cookiecon
        request.UserAgent = UserAgent
        request.ContentType = ContentType
        Dim POST As String = String.Format("_method=POST&data%5B_Token%5D%5Bkey%5D=a61fe015f89e4843902f7cfd1d7ed33ba4a244a1&data%5BPvpnetAccount%5D%5Bname%5D={0}&data%5BPvpnetAccount%5D%5Bpassword%5D={1}&data%5BPvpnetAccount%5D%5Bconfirm_password%5D={1}&data%5BPvpnetAccount%5D%5Bemail_address%5D={2}&data%5BPvpnetAccount%5D%5Bdate_of_birth_day%5D=11&data%5BPvpnetAccount%5D%5Bdate_of_birth_month%5D=11&data%5BPvpnetAccount%5D%5Bdate_of_birth_year%5D=1981&data%5BPvpnetAccount%5D%5Brealm%5D=euw&data%5BPvpnetAccount%5D%5Btou_agree%5D=0&data%5BPvpnetAccount%5D%5Btou_agree%5D=1&data%5BPvpnetAccount%5D%5Bnewsletter%5D=0&data%5BPvpnetAccount%5D%5Bnewsletter%5D=1&data%5BPvpnetAccount%5D%5Bcaptcha%5D={3}&data%5B_Token%5D%5Bfields%5D=d56e711ef2a60053f53b82f8d657e87a89e93b62%253An%253A0%253A%257B%257D", TextBox1.Text.Replace("@"c, "%40"), TextBox2.Text, TextBox3.Text.Replace("@"c, "%40"), TextBox4.Text)
        Dim bytes() As Byte = Encoding.Default.GetBytes(POST)
        request.ContentLength = bytes.Length
        Dim datastream As Stream = request.GetRequestStream
        datastream.Write(bytes, 0, bytes.Length)
        datastream.Close()
        Dim response As HttpWebResponse = DirectCast(request.GetResponse, HttpWebResponse)
        Using sr As New StreamReader(response.GetResponseStream)
            Dim input As String = sr.ReadToEnd
            If input.Contains("Dein Konto wurde erstellt!") Then
                MessageBox.Show("Erfolg")
            End If
        End Using
    End Sub
End Class
10/31/2013 18:00 schmir#23
Natürlich ändert sich das Captcha bei jeder anfrage du musst es schon selbstständig aus der Response holen und verarbeiten. In deinem Fall steht es dann in Input drin. Du fragst ja auch in deinem Code schon einen Teil ab, das musst du erweitern.

If input.Contains("Dein Konto wurde erstellt!") Then
MessageBox.Show("Erfolg")
10/31/2013 18:05 DeinMud#24
Hab ich doch, das Captcha wird angezeigt, aber wie soll ich es denn weiterverarbeiten ohne einen neuen Request zu senden?
11/03/2013 20:30 Mithrandir.#25
Immer noch sehr interessant, leider blick ichs einfach nicht.
wenn jemand mir ne vernüftige vb.net source schicken könnte die bei der Seite die ich auf der 1. Seite gepostet hab wäre ich auch bereit was zu zahlen :D

Ist nur leider nicht so leicht habe zwar was gefunden aber es refesht das captcha halt immer, sehr kompliziert. :/
11/03/2013 21:09 DeinMud#26
Das mit dem refreshen ist auch mein Problem, mit nem webbrowser krieg ich's hin aber bei einem request, wird die session immer erneuert.
Habe gelesen, dass das Captcha erst existiert, wenn man sich die antwort holt -> Hab ich beim zweiten mal keine antwort geholt ging trotzdem nicht.
Mit cookies rumgespielt -> ging auch nicht.
11/09/2013 13:58 HogarthHughes#27
Benutzt du Httpwebrequest oder Webbrowser?
11/12/2013 22:24 Certox#28
Kleine nette Funktion.
Code:
private IEnumerable<string> GetSubStrings(string input, string start, string end)
        {
            Regex r = new Regex(Regex.Escape(start) + "(.*?)" + Regex.Escape(end));
            MatchCollection matches = r.Matches(input);
            foreach (Match match in matches)
                yield return match.Groups[1].Value;
        }
Code:
GetSubStrings(html, "scr=\""", "\""").First();
Quote:
Originally Posted by DeinMud View Post
Mal ne Frage, ich hatte selbst versucht einen Bot zu schreiben mit Captcha Eingabe etc. (httpwebrequest)
Das filtern des Captchas und Anzeigen war kein Problem, doch um das Captcha anzeigen zu lassen musste ich die Antwort auslesen & dort mit Regex halt den Captcha link filtern. Dannach konnte ich jedoch nicht mehr in den Stream schreiben & einen neuen Request zu senden ginge auch nicht da sich dann das Captcha ändern würde. Wie müsste ich da den vorgehen?
1. Per GET HTML laden
2. Mit meiner Funktion oben parsen
3. Captcha ID auslesen und bild per GET laden ([Only registered and activated users can see links. Click Here To Register...])

Code:
private Image getCaptcha(String uri)
        {
            try
            {
                Uri myUri = new Uri("*******");
                captchaID = uri;
                HttpWebRequest request = (HttpWebRequest)WebRequest.Create(new Uri("https://www.google.com/recaptcha/api/image?c=" + uri));
                request.CookieContainer = cookieContainer;
                request.UserAgent = userAgent;
                //request.Proxy = proxy;
                request.KeepAlive = true;
                request.Referer = myUri.ToString();
                request.ContentType = "image/png";
                request.Method = "GET";
                request.Accept = "de-de,de;q=0.8,en-us;q=0.5,en;q=0.3";

                HttpWebResponse response = (HttpWebResponse)request.GetResponse();
                var stream = response.GetResponseStream();
                return Image.FromStream(stream);
            }
            catch (System.Exception e)
            {
                return null;
            }
        }
4. Captcha Lösen bzw DBC
5. POST Request

Code:
post(Url, Referer , "recaptcha_challenge_field=" + captchaID + "&recaptcha_response_field=" + captcha.Text.Replace(" ", "+")");
HTML Stuff
Code:
        public String userAgent = @"Mozilla/5.0 (Windows NT 6.1; WOW64; rv:25.0) Gecko/20100101 Firefox/25.0";
        private CookieContainer cookieContainer = new CookieContainer();

private String get(String url, String referer)
        {
            Uri myUri = new Uri(url);
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(myUri);
            request.CookieContainer = cookieContainer;
            request.UserAgent = userAgent;
            request.KeepAlive = true;
            request.Referer = referer;
            if (proxy != null)
                request.Proxy = proxy;
            HttpWebResponse response = (HttpWebResponse)request.GetResponse();
            foreach (Cookie cookie in response.Cookies)
            {
                cookieContainer.Add(cookie);
            }
            var stream = response.GetResponseStream();
            var reader = new StreamReader(stream);
            return reader.ReadToEnd();
        }

        private String post(String url, String referer, String postdata, String[] headers)
        {
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(new Uri(url));
            request.CookieContainer = cookieContainer;
            request.Method = "POST";
            byte[] data = Encoding.ASCII.GetBytes(postdata);
            request.ContentType = "application/x-www-form-urlencoded";
            request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
            request.ContentLength = data.Length;
            request.UserAgent = userAgent;
            request.KeepAlive = true;
            request.Referer = referer;
            if (proxy != null)
                request.Proxy = proxy;
            request.ServicePoint.Expect100Continue = false;
            foreach (String s in headers)
                request.Headers.Add(s.Split('|')[0], s.Split('|')[1]);

            Stream requestStream = request.GetRequestStream();
            requestStream.Write(data, 0, data.Length);
            requestStream.Close();

            HttpWebResponse response = (HttpWebResponse)request.GetResponse();
            foreach (Cookie cookie in response.Cookies)
            {
                cookieContainer.Add(cookie);
            }
            var stream = response.GetResponseStream();
            var reader = new StreamReader(stream);
            return reader.ReadToEnd();
        }

        private String post(String url, String referer, String postdata)
        {
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(new Uri(url));
            request.CookieContainer = cookieContainer;
            request.Method = "POST";
            byte[] data = Encoding.ASCII.GetBytes(postdata);
            request.ContentType = "application/x-www-form-urlencoded";
            request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
            request.ContentLength = data.Length;
            request.UserAgent = userAgent;
            request.KeepAlive = true;
            request.Referer = referer;
            request.ServicePoint.Expect100Continue = false;

            Stream requestStream = request.GetRequestStream();
            requestStream.Write(data, 0, data.Length);
            requestStream.Close();

            HttpWebResponse response = (HttpWebResponse)request.GetResponse();
            foreach (Cookie cookie in response.Cookies)
            {
                cookieContainer.Add(cookie);
            }
            var stream = response.GetResponseStream();
            var reader = new StreamReader(stream);
            return reader.ReadToEnd();
        }
11/16/2013 18:36 DeinMud#29
@Certox
Funktioniert das nur bei Google Captcha's?