Exception bei Captcha-Eintragung

04/16/2016 14:08 exceble#1
Nabend liebe Coder,

versuche mich gerade an ein kleines Mail-Creator-Tool mit C# aber habe Probleme mit dem Captcha.

Sobald ich versuche im Browser das Captcha einzutragen, kriege ich eine NullReference-Meldung. Aber ich verstehe nicht warum und bin nach längerem Googlen auch auf nichts hilfreiches gestoßen.

HTML:
Code:
<input type="text" class="feedback-panel-trigger" value="" name="captchaPanel:captcha-response:textfield" id="idd1" maxlength="50">
C#:
Code:
wB.Document.GetElementById("idd1").SetAttribute("value", "Test");
Bei allen anderen Elementen funktioniert es genau so, nur nicht beim Captcha. Würde mich freuen, wenn mir jemand dabei helfen kann.

Cheers
04/16/2016 14:43 sexualising#2
Warum denn mit nem Webbrowser?

Willst du das Captcha in einer Picturebox abbilden und/oder den Text des Captchas in eine Textbox?
04/16/2016 14:54 exceble#3
Das Captcha in eine Picturebox zu laden war kein Problem.

Ich möchte das Registrierungsformular auf der Website ausfüllen lassen. Aber sobald ich irgendetwas in das Textfeld des Captchas schreiben möchte, kriege ich die exception. Aber bei allen anderen Textboxen funktioniert meine Methode.

Achja und den Webbrowser nutze ich, weil mir das am Trivialsten erschien.
04/16/2016 15:14 Kraizy​#4
Sicher, dass die ID immer gleich ist beim erneuten Aufruf der Seite? Gibt genug Seiten, bei denen die IDs immer neu generiert werden. Um welche Seite handelt es sich denn?

Würde dir übrigens empfehlen, lieber HttpRequests zu benutzen, statt dem WebBrowser. Ist 1. um ein vielfaches schneller und 2. meiner Meinung nach viel simpler und du musst dich nicht mit solchen IDs rumschlagen.
04/16/2016 15:28 exceble#5
Quote:
Originally Posted by Kraizy​ View Post
Sicher, dass die ID immer gleich ist beim erneuten Aufruf der Seite? Gibt genug Seiten, bei denen die IDs immer neu generiert werden. Um welche Seite handelt es sich denn?

Würde dir übrigens empfehlen, lieber HttpRequests zu benutzen, statt dem WebBrowser. Ist 1. um ein vielfaches schneller und 2. meiner Meinung nach viel simpler und du musst dich nicht mit solchen IDs rumschlagen.
Ja die IDs scheinen sich nach Aktualisierung zu ändern. Dennoch füllt mein Programm alle Felder aus (sollte er doch eigentlich garnicht mehr?). Bis auf das des Captchas.

Und ich habe bisher noch nie in C# mit Websites gearbeitet, deswegen danke für den Tipp. HttpRequests ist doch von System.Web vererbt oder nicht? Trotz hinzufügen in die using-Direktive kennt er HttpRequests nicht. Muss ich mir erst irgendein Verweis runterladen?
04/16/2016 15:29 Kraizy​#6
[Only registered and activated users can see links. Click Here To Register...]
04/16/2016 17:24 exceble#7
Quote:
Originally Posted by Kraizy​ View Post
[Only registered and activated users can see links. Click Here To Register...]
Erstmal vielen Dank, das scheint mir auch eine effizientere Methode.

Ich hatte auch grundlegend PHP in der Schule, weswegen ich mit der POST-Methode was anfangen kann aber ich verstehe noch nicht ganz, wie ich das jetzt in C# abschicke bzw. realisiere.

Habe jetzt folgendes dazu gefunden:
[Only registered and activated users can see links. Click Here To Register...]

Aber ich blick die Vererbungs- also "Legacy"-Methode, die er meint nicht wirklich, kann mir jemand kurz sagen was genau jetzt was macht?
04/17/2016 20:41 exceble#8
^
04/17/2016 21:59 h4zed#9
Ich würde dir empfehlen den WebClient mit seiner Methode UploadValues(POST) zu benutzen. Macht im Endeffekt genau das selbe wie ein HttpWebRequest, nur ist der WebClient meiner Meinung nach einfacher zu handhaben ist!

Hier etwas Pseudo Code als Denkanstoss:

Code:
//WebClient erstellen
dim wc as new webclient
wc.proxy = nothing
wc.encoding = utf8

//Optional Request Header bearbeiten/setzen
wc.headers.add("User-Agent", "firefox 42 whatever")

//Eine Collection mit den zu sendenden Daten(POST Values) erstellen
dim postColl as new namevaluecollection
postColl.add("VARIABLE", "WERT")
postColl.add("VARIABLE", "WERT")
postColl.add("VARIABLE", "WERT")
..............

//Nun die POST Values uploaden
dim respStr as string = utf8.getString(httpClient.uploadValues("URL", "POST", postColl)
Ähmm, ja sieht jz nicht besonders aus aber ich hoffe mal dieses "Snippet" kann dir helfen!
04/19/2016 21:14 EqoTime#10
Quote:
Originally Posted by exceble View Post
Ja die IDs scheinen sich nach Aktualisierung zu ändern. Dennoch füllt mein Programm alle Felder aus (sollte er doch eigentlich garnicht mehr?). Bis auf das des Captchas.

Und ich habe bisher noch nie in C# mit Websites gearbeitet, deswegen danke für den Tipp. HttpRequests ist doch von System.Web vererbt oder nicht? Trotz hinzufügen in die using-Direktive kennt er HttpRequests nicht. Muss ich mir erst irgendein Verweis runterladen?
Nur die ID vom Captcha wird sich höchstwahrscheinlich ändern, da es eine art "Botschutz" ist. Du kannst dir wenn du die Seite geladen hast den Quelltext in einen String speichern und mit regex oder substring (einfach mal googlen) die neue ID auslesen.

MfG
04/19/2016 22:13 Kraizy​#11
Quote:
Originally Posted by exceble View Post
Erstmal vielen Dank, das scheint mir auch eine effizientere Methode.

Ich hatte auch grundlegend PHP in der Schule, weswegen ich mit der POST-Methode was anfangen kann aber ich verstehe noch nicht ganz, wie ich das jetzt in C# abschicke bzw. realisiere.

Habe jetzt folgendes dazu gefunden:
[Only registered and activated users can see links. Click Here To Register...]

Aber ich blick die Vererbungs- also "Legacy"-Methode, die er meint nicht wirklich, kann mir jemand kurz sagen was genau jetzt was macht?
Ist eig relativ selbsterklärend, wenn man Zeile für Zeile durchgeht.
Es wird ein Http Request, in dem Fall ein POST Request -> request.Method = "POST"; an die Seite [Only registered and activated users can see links. Click Here To Register...] erstellt. postData ist ein String, welches die Daten enthält, die übertragen werden sollen. Bei einem (simplen) Login würde der Post z.B. so ausschauen: username=abc123&password=123abc. Der String wird anschließend als Bytearray in den Stream geschrieben (abgeschickt). Danach wird die response Variable erstellt, welche wie der Name schon sagt, die Antwort vom Server empfängt. Mit .ReadToEnd() wird dann quasi die Antwort als String ausgelesen (Seitenquelltext).

Wie du an die richtigen Daten kommst, die du als POST senden musst, bzw an welchen Link du das senden musst, findest du in zahlreichen Tutorials zum Thema HttpWebRequests, zum Teil auch hier auf Epvp. Da habe ich damals mal ein Tutorial geschrieben, zwar in VB.NET aber sollte kein allzugroßer Unterschied zu C# sein. Vllt hilft dieser dir ja weiter.
04/27/2016 21:41 #Saiirex#12
Bei Web.de oder gmx.net kannst du Webbrowser vergessen.