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?
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.
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");
}
}
}
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.
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.
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?
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