Bild aus URL Laden funktioniert nicht
-
Hallo ihr lieben,
ich habe mir einen Crawler gebastelt, der mir hilft für ein Forum die Threads zu durchforsten. Das Tool ist bereits voll funktionsfähig und arbeitet über das Auslesen des Seitenquelltextes. Nun wollte ich probieren in einem Thread enthaltene Bilder in einer PictureBox auszugeben, wobei ich leider jedoch scheitere. Ich erhalte bei dem Versuch die Meldung:
The remote server returned an error: (403) Forbidden
Der Fehler trifft auf, sobald ich Versuche eine Antwort vom Server anzufordern:
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url); request.Accept = "text/html"; request.Method = "GET"; request.Credentials = new NetworkCredential(UserName, PassWord); HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Merkwürdigerweise funktioniert das Anfordern einer Bilddatei in einem anderem Forum, wo ich das ebenfalls getestet habe. Was kann also die Ursache dafür sein, dass ich diese Rückmeldung vom Server bekomme?
-
Funktioniert es nur in dem Programm nicht oder auch wenn du das entsprechende Bild in einem Browser abrufst ?
-
Hi,
also es ist so, dass wenn ich eine Url eines Bildes in der Browserleiste eingebe, dass ich das Bild dann angezeigt bekomme. Im Tool jedoch erhalte ich eben die Exception. Deshalb hatte ich zunächst gedacht, dass es an daran liegt, dass ich beim Request möglicherweise eine Verknüpfung zu einem registrierten User benötige, doch auch mit den Credentials funktionierte die Anfrage nicht.
Ich denke, dass das Problem daran liegt, dass die Bilder in dem Forum nur dann angeschaut werden können, wenn man auch im Forum eingeloggt ist.
In einem Forum, wo man die Bilder auch als nicht registrierter User einsehen kann und mein Tool beim Request eine Antwort erhält, ist die Bild-Url folgendermaßen aufgebaut:
Während ein Bild in dem problembehafteten Forum nur einsehbar ist, sobald ich mich eingeloggt habe und dieser Aufbau ist anders:
http:xyz;topic=12345;attach=54321;image
Ich vermute ma, dass das Bild nicht abgefragt können werden soll, wenn ich kein registrierter User bin, da ich aber über den Quelltext diese Beschränkung ja umgehen könnte, glaube ich, dass deshalb der Webrequest fehl schlägt.
Merkwürdig jedoch, dass ich das Bild auch unangemeldet im Browser öffnen kann.
Aber vielleichtgeht das nunmal nicht mit einem Webrequest?
-
Ändere mal
request.Accept = "text/html";
in
request.Accept: image/png,image/*;q=0.8,*/*;q=0.5
Ein Bild ist ja keine Textdatei sondern enthält Binärdaten.
403 als Antwort ist aber ungewöhnlich.
-
Ja stimmt natürlich
Ich habe das Problem nach weiterer Nachforschung nun lösen können, mir ist jedoch nicht ganz bewusst, wieso es mit meinem neuen Code klappt:
var httpWebRequest = (HttpWebRequest)WebRequest.Create(url); httpWebRequest.Method = "GET"; httpWebRequest.MediaType = "HTTP/1.1"; httpWebRequest.ContentType = "image/png,image/*;q=0.8,*/*;q=0.5"; httpWebRequest.UserAgent = "Example Client"; var httpWebResponse = (HttpWebResponse)httpWebRequest.GetResponse(); Stream stream = httpWebResponse.GetResponseStream(); Image image = Image.FromStream(stream); pbPreview.Image = image;
Eine Zeile die für den Erfog des Webrequests unerlässlich ist, ist die folgende:
httpWebRequest.UserAgent = "Example Client";
Auch wenn da nur ein Dummy mit übergeben wird, nun funktioniert der Request, sogar ohne Credentials. Höchst merkwürdig
-
Was für eine Forumsoftware ist das?
UA sollte irrelevant sein. Vielleicht weil du vorher überhaupt keinen UA gesendet hast?
EDIT:
Es gibt für Firefox verschiedene addons, die den UA ändern können.
Einfach mal nen UA weg oder leer lassen. Was passiert?Oder ein tool benutzen, das dir das erlaubt (wäre aber eher der fortgeschrittenen Modus).