|
You last visited: Today at 00:53
Advertisement
C# Captcha lösen Problem
Discussion on C# Captcha lösen Problem within the .NET Languages forum part of the Coders Den category.
06/17/2015, 15:34
|
#1
|
elite*gold: 300
Join Date: Apr 2013
Posts: 3,234
Received Thanks: 1,205
|
C# Captcha lösen Problem
Hallo, ich möchte das Captcha von web.de runterladen und zu DBC hochladen.
Am Anfang hat es wunderbar geklappt, aber jetzt lädt er das bild "nicht richtig" runter.
Mein Code:
Code:
System.Net.WebClient wc = new System.Net.WebClient();
HtmlElementCollection imgs = this.webBrowser1.Document.GetElementsByTagName("img");
for (int j = 0; j < imgs.Count; j++)
{
string classCaptcha = imgs[j].GetAttribute("className");
if (classCaptcha == "captcha")
{
//captcha.png löschen falls vorhanden
if (File.Exists("captcha.png"))
File.Delete("captcha.png");
//captcha runterladen
string img;
img = imgs[j].GetAttribute("src");
wc.DownloadFile(img, "captcha.png");
}
}
Ich habe schon versucht zu debuggen und in "img" steht eigentlich auch der richtige link drin.
Im Link ist iwas mit "anticache" könnte es evtl daran liegen?
€: Ich habe gerade das Captcha aus dem Webbrowserelement und das Captcha aus dem Link in "img" verglichen und es sind zwei verschiedene?
|
|
|
06/17/2015, 19:53
|
#2
|
elite*gold: 1091
Join Date: Jun 2007
Posts: 19,836
Received Thanks: 7,180
|
Du erhälst vermutlich 2 verschiedene Captchas weil du die Cookies für den Download nicht wiederverwendest. Daher generiert er dir auch gleich'n neuen Captcha.
Übrigens überschreibst du das Bild immer wieder lokal. Solltest du also mehrere Captchas haben, wird logischerweise nur das letzte gespeichert weil alle vorherigen überschrieben werden.
|
|
|
06/17/2015, 20:06
|
#3
|
elite*gold: 0
Join Date: Apr 2008
Posts: 495
Received Thanks: 817
|
Quote:
Originally Posted by #Saiirex
€: Ich habe gerade das Captcha aus dem Webbrowserelement und das Captcha aus dem Link in "img" verglichen und es sind zwei verschiedene?
|
Servus,
dass wird wahrscheinlich daran liegen, dass Du die Url zweimal aufrufst und deshalb ein anderes Captcha erstellt wird.
Zu deinem Code, verzichte auf das WebBrowser-Control. Falls Du es dennoch verwenden willst, dann könntest Du an dieser Stelle
Code:
HtmlElementCollection imgs = this.webBrowser1.Document.GetElementsByTagName("img");
Lambda-Ausdrücke verwenden, somit wird Deine For-Schleife und if-Bedingung überflüssig und der Code übersichtlicher.
Ich habe Dir eben eine schnelle Lösung geschrieben, ohne Fehlerbehandlung usw.
Code:
using HtmlAgilityPack;
using System;
using System.Drawing;
using System.Linq;
using System.Net;
using System.Threading.Tasks;
namespace WebCaptcha
{
class Program
{
static void Main(string[] args)
{
Task.Run(async () =>
{
const string baseUrl = @"https://registrierung.web.de/";
//LoadHTML
string htmlSource = await GetHTML(new Uri(baseUrl));
//ParseHTML
string parsedHtml = ParseHtml(htmlSource);
//DownloadCaptcha
await GetImageFromURL(new Uri(parsedHtml.Replace(@"./", baseUrl)));
}).Wait();
Console.WriteLine("Fertig");
Console.ReadKey();
}
/// <summary>
/// Laedt den Quellcode von registrierung.web.de herunter, um die Captcha Adresse zu erhalten.
/// </summary>
/// <param name="Address">Uri => Adresse von web.de</param>
/// <returns>
/// string.Empty => Konnte kein Quellcode heruntergeladen werden.
/// string => Gefuellt mit Quellcode
/// </returns>
private async static Task<string> GetHTML(Uri Address)
{
string ret = string.Empty;
using (WebClient webClient = new WebClient())
{
ret = await webClient.DownloadStringTaskAsync(Address);
}
return ret;
}
/// <summary>
/// Parst den HTML Quellcode mit Hilfe von HtmlAgilityPack, um die Adresse des Captchas zu kriegen.
/// </summary>
/// <param name="Html">string => Quellcode von web.de</param>
/// <returns>
/// string.Empty => Konnte den Quellcode nicht parsen.
/// string => Gefuellt mit der Adresse des Captchas
/// </returns>
private static string ParseHtml(string Html)
{
string imgSource = string.Empty;
HtmlDocument htmlDoc = new HtmlDocument();
//HTML Quellcode laden
htmlDoc.LoadHtml(Html);
if (htmlDoc.DocumentNode != null)
{
//Suche das <img>-Tag mit der ID = 'id96' und lese den 'src' Wert aus.
imgSource = htmlDoc.DocumentNode.SelectNodes(@"//img[@id='id96']").Select(a => a.Attributes["src"]).FirstOrDefault().Value;
}
return imgSource;
}
/// <summary>
/// Laedt das Captcha und speichert es in den aktuellen Ordner des Programmes unter den Namen "captcha.png".
/// </summary>
/// <param name="Url"> Uri => Adresse des Captchas</param>
/// <see cref="http://dotnet-snippets.de/snippet/image-aus-url-laden/509"/>
private async static Task GetImageFromURL(Uri Url)
{
HttpWebRequest httpWebRequest = (HttpWebRequest)HttpWebRequest.Create(Url);
HttpWebResponse httpWebReponse = (HttpWebResponse)(await httpWebRequest.GetResponseAsync());
System.IO.Stream stream = httpWebReponse.GetResponseStream();
Image.FromStream(stream).Save("captcha.png");
}
}
}
|
|
|
06/18/2015, 00:35
|
#4
|
elite*gold: 300
Join Date: Apr 2013
Posts: 3,234
Received Thanks: 1,205
|
Quote:
Originally Posted by schnewin
Servus,
dass wird wahrscheinlich daran liegen, dass Du die Url zweimal aufrufst und deshalb ein anderes Captcha erstellt wird.
Zu deinem Code, verzichte auf das WebBrowser-Control. Falls Du es dennoch verwenden willst, dann könntest Du an dieser Stelle
Code:
HtmlElementCollection imgs = this.webBrowser1.Document.GetElementsByTagName("img");
Lambda-Ausdrücke verwenden, somit wird Deine For-Schleife und if-Bedingung überflüssig und der Code übersichtlicher.
Ich habe Dir eben eine schnelle Lösung geschrieben, ohne Fehlerbehandlung usw.
Code:
using HtmlAgilityPack;
using System;
using System.Drawing;
using System.Linq;
using System.Net;
using System.Threading.Tasks;
namespace WebCaptcha
{
class Program
{
static void Main(string[] args)
{
Task.Run(async () =>
{
const string baseUrl = @"https://registrierung.web.de/";
//LoadHTML
string htmlSource = await GetHTML(new Uri(baseUrl));
//ParseHTML
string parsedHtml = ParseHtml(htmlSource);
//DownloadCaptcha
await GetImageFromURL(new Uri(parsedHtml.Replace(@"./", baseUrl)));
}).Wait();
Console.WriteLine("Fertig");
Console.ReadKey();
}
/// <summary>
/// Laedt den Quellcode von registrierung.web.de herunter, um die Captcha Adresse zu erhalten.
/// </summary>
/// <param name="Address">Uri => Adresse von web.de</param>
/// <returns>
/// string.Empty => Konnte kein Quellcode heruntergeladen werden.
/// string => Gefuellt mit Quellcode
/// </returns>
private async static Task<string> GetHTML(Uri Address)
{
string ret = string.Empty;
using (WebClient webClient = new WebClient())
{
ret = await webClient.DownloadStringTaskAsync(Address);
}
return ret;
}
/// <summary>
/// Parst den HTML Quellcode mit Hilfe von HtmlAgilityPack, um die Adresse des Captchas zu kriegen.
/// </summary>
/// <param name="Html">string => Quellcode von web.de</param>
/// <returns>
/// string.Empty => Konnte den Quellcode nicht parsen.
/// string => Gefuellt mit der Adresse des Captchas
/// </returns>
private static string ParseHtml(string Html)
{
string imgSource = string.Empty;
HtmlDocument htmlDoc = new HtmlDocument();
//HTML Quellcode laden
htmlDoc.LoadHtml(Html);
if (htmlDoc.DocumentNode != null)
{
//Suche das <img>-Tag mit der ID = 'id96' und lese den 'src' Wert aus.
imgSource = htmlDoc.DocumentNode.SelectNodes(@"//img[@id='id96']").Select(a => a.Attributes["src"]).FirstOrDefault().Value;
}
return imgSource;
}
/// <summary>
/// Laedt das Captcha und speichert es in den aktuellen Ordner des Programmes unter den Namen "captcha.png".
/// </summary>
/// <param name="Url"> Uri => Adresse des Captchas</param>
/// <see cref="http://dotnet-snippets.de/snippet/image-aus-url-laden/509"/>
private async static Task GetImageFromURL(Uri Url)
{
HttpWebRequest httpWebRequest = (HttpWebRequest)HttpWebRequest.Create(Url);
HttpWebResponse httpWebReponse = (HttpWebResponse)(await httpWebRequest.GetResponseAsync());
System.IO.Stream stream = httpWebReponse.GetResponseStream();
Image.FromStream(stream).Save("captcha.png");
}
}
}
|
Web.de generiert die ids immer random, deswegen ist das mit 'id96' leider nicht möglich. Deswegen habe ich ja auch den umständlichen Code geschrieben wie ich an die Id ran komme.
|
|
|
06/18/2015, 17:05
|
#5
|
elite*gold: 0
Join Date: Apr 2010
Posts: 9,696
Received Thanks: 1,811
|
Quote:
Originally Posted by #Saiirex
Web.de generiert die ids immer random, deswegen ist das mit 'id96' leider nicht möglich. Deswegen habe ich ja auch den umständlichen Code geschrieben wie ich an die Id ran komme.
|
Quote:
Originally Posted by schnewin
PHP Code:
imgSource = htmlDoc.DocumentNode.SelectNodes(@"//img[@id='id96']").Select(a => a.Attributes["src"]).FirstOrDefault().Value;
|
->
PHP Code:
imgSource = htmlDoc.DocumentNode.SelectNodes(@"//img[@class='captcha']").Select(a => a.Attributes["src"]).FirstOrDefault().Value;
|
|
|
06/18/2015, 17:13
|
#6
|
elite*gold: 300
Join Date: Apr 2013
Posts: 3,234
Received Thanks: 1,205
|
Ich weiß nicht warum, aber mein Code funktioniert ohne Probleme. Er liest das richtige Captcha aus, lädt es runter und das alles ohne Probleme
|
|
|
06/18/2015, 18:11
|
#7
|
elite*gold: 0
Join Date: Apr 2008
Posts: 495
Received Thanks: 817
|
Quote:
Originally Posted by #Saiirex
Web.de generiert die ids immer random, deswegen ist das mit 'id96' leider nicht möglich. Deswegen habe ich ja auch den umständlichen Code geschrieben wie ich an die Id ran komme.
|
Bei mir hat das img-Tag vom Captcha immer noch die selbe ID. Selbst mit einem anderen Rechner ist es die selbe.
Wann ändert sich die ID?
|
|
|
Similar Threads
|
Captcha lösen :D
08/22/2009 - Metin2 Private Server - 4 Replies
wie scho gesagt
wollte fragen ob das jemand lösen kann :P
http://www.abload.de/thumb/authcode.phpha3z.png
gibt auch ein dickes thx :D:D
|
Captcha Lösen
08/16/2009 - Metin2 Private Server - 2 Replies
Plx kann mir mal einer das Captcha hier lösen? Kanns net lesen und somit auch net entziffern >.< Thanx natürlich dabei xD
http://img512.imageshack.us/img512/3554/authcodep hpm.png
|
captcha lösen
08/10/2009 - Metin2 Private Server - 2 Replies
Hallo,
könnte vielleicht jemand dieses captcha lösen thx:)
http://img248.imageshack.us/img248/4706/72615658. png
mfg
|
All times are GMT +1. The time now is 00:54.
|
|