Dateidownloadfunktion funktioniert nicht auf allen Webseiten
Übersicht

![]() |
ChristophBetreff: Dateidownloadfunktion funktioniert nicht auf allen Webseiten |
![]() Antworten mit Zitat ![]() |
---|---|---|
Als ich folgenden Code ausprobiert habe, habe ich mich gewundert, warum ein und derselbe code auf dem einen host funzen und auf dem nächsten nicht:
Code: [AUSKLAPPEN] Download("www.google.de","/intl/de_de/images/logo.gif","C:\image.gif")
Download("www.tw-tools.com","/static/images/logo.png","C:\image.png") Function Download(host$, url$, name$) file = WriteFile(name$) tcp = OpenTCPStream(host$,80) If tcp=0 Then Print "Verbindung fehlgeschlagen...":WaitKey:End WriteLine tcp, "GET "+url$+" HTTP/1.0" WriteLine tcp, "Host: " + host$ WriteLine tcp, "Useragent: Browser" WriteLine tcp, Chr$(10) Repeat Delay 500 Until ReadAvail(tcp)>0 Print "ReadAvail="+ReadAvail(tcp):WaitKey Repeat Until ReadLine$(tcp)="" Repeat WriteByte file, ReadByte(tcp) Until Eof(tcp)=1 Print "Fertig" WaitKey CloseTCPStream tcp CloseFile file End Function Beim zweiten Downloadversuch ist readavail immer 0. Weiß jemand, warum der zweite host mir nichts schicken will? |
||
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
weil nicht alle direkt download erlauben, viele haben referrer backlinks die dafür sorgen das man nur via intern drauf kann oder nur via öffnen einer page etc etc.
sofern du keinen eigenen webspace/server hast, kannst du das mehr oder weniger knicken ... |
||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
![]() |
Silver_Knee |
![]() Antworten mit Zitat ![]() |
---|---|---|
hmm mit firefox kann mans runterladen.... ich hab mal meinen Servergestaret und das gibt firefox mir so zurück:
Code: [AUSKLAPPEN] [21:53:23] GET / HTTP/1.1
[21:53:23] Host: localhost [21:53:23] User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.8.1.6) Gecko/20070725 Firefox/2.0.0.6 [21:53:23] Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5 [21:53:23] Accept-Language: de-de,de;q=0.8,en-us;q=0.5,en;q=0.3 [21:53:23] Accept-Encoding: gzip,deflate [21:53:23] Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 [21:53:23] Keep-Alive: 300 [21:53:24] Connection: keep-alive bau doch mal die zeilen ein mal sehen obs dann rückmeldung gibt |
||
![]() |
Christoph |
![]() Antworten mit Zitat ![]() |
---|---|---|
@Dreamora
Wenn ich im Firefox "www.tw-tools.com/static/images/logo.png" eingebe, wird das bild im Browser angezeigt auch wenn ich vorher auf keiner seite von tw-tools.com war. Kann ich mich nicht irgendwie als Firefox ausgeben? ![]() @Silver_Knee Sobald ich "Connection: keep-alive" an tw-tools schicke, hängt mein Programm. Lasse ich es weg, ist es wie vorher, ich erhalte keine Antwort |
||
![]() |
Silver_Knee |
![]() Antworten mit Zitat ![]() |
---|---|---|
es hängt? das liegt an http 1.1 daist die übertragung nicht fertig wenn EOF(stream)=1 ist sondern wenn Readavail(stream)=0 änder mal die bedingung in deinem code | ||
![]() |
Christoph |
![]() Antworten mit Zitat ![]() |
---|---|---|
Geht nicht, er kommt nicht mehr aus der
Code: [AUSKLAPPEN] Repeat Delay 500 Until ReadAvail(tcp)>0
schleife raus, weil readavail=0, sprich weil keine daten empfangen werden... |
||
![]() |
Silver_Knee |
![]() Antworten mit Zitat ![]() |
---|---|---|
hast du mal alles rübergeschickt (dich also auch als Firefox ausgegeben) | ||
E. Urbachehemals "Basicprogger" |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Mit der Download-Funktion meines Netzwerk-Moduls, welches fast dieselbe Schnittstelle wie BNetEx hat, funktioniert es. Wenn es dir hilft, kann ich sie dir zur Verfügung stellen (ist zwar C++, liest sich aber wie pseudo-code):
Code: [AUSKLAPPEN] //Download
inline bool Download(String url, String toFile = "", int timeout = 15000, short port = 80) { if(url.StartsWith("http://")) { url.EraseLeft(7); } String host = url.Until('/'); String path = url.From('/'); TCPStream stream = CreateTCPStream(); stream->SetTimeouts(timeout, timeout); stream->SetRemoteIP(host); stream->SetRemotePort(port); EngineLog3("Trying to connect to " << stream->GetRemoteIP() << "..."); if(!stream->Connect()) { EngineLogError("Can't connect to " << stream->GetRemoteIP()); return false; } EngineLog3("Connected."); EngineLog3("Sending HTTP query..."); stream->WriteLine("GET " + path + " HTTP/1.0"); //TODO: HTTP/1.1 stream->WriteLine("Host: " + host); stream->WriteLine("Connection: close"); stream->WriteLine(""); stream->SendAll(); EngineLog3("Sent."); EngineLog3("Waiting for messages..."); int startWaiting = MilliSecs(); int avail; while((avail = stream->GetAvail()) == 0) { Delay(1); if(MilliSecs() - startWaiting > timeout) { EngineLogError("Timeout"); return false; } } EngineLog3("Done. " << avail << " bytes available in the first package."); EngineLog3("Receiving..."); stream->RecvAll(); EngineLog3("Received."); String line = "-"; if(toFile.IsEmpty() && (toFile = StripDir(url)).IsEmpty()) { EngineLog3("Reading HTTP response..."); while(!stream->Eof() && line != "") { stream->ReadLine(line); if(line.StartsWith("Content-Type:")) { toFile = "index." + line.Mid(14).From('/', 1); } EngineLog3(line); } EngineLog3("Done."); if(toFile.IsEmpty()) toFile = "index.html"; } else { EngineLog3("Ignoring HTTP response..."); while(!stream->Eof() && line != "") { stream->ReadLine(line); EngineLog3(line); } EngineLog3("Done."); } EngineLog3("Writing content to file " << toFile << "..."); FileWriteStream fileStream = CreateFileWriteStream(toFile); fileStream->WriteStreamContent(stream); EngineLog3("Written."); return true; } Ich habe deinen Code damit verglichen und mir sind keine gravierenden Unterschiede aufgefallen, aber auf jeden Fall solltest du probieren, die HTTP-Antwort auf deine Anfrage zu lesen anstatt sie zu ignorieren. Wenn es ein HTTP 200 OK war, dann lief alles glatt. Zitat: Kann ich mich nicht irgendwie als Firefox ausgeben?
Hätte keinen Sinn und würde absolut nichts ändern. Zitat: Sobald ich "Connection: keep-alive" an tw-tools schicke, hängt mein Programm.
Ebenfalls weglassen, für solche Zwecke musst du wenn überhaupt "Connection: close" angeben. Zitat: Beim zweiten Downloadversuch ist readavail immer 0.
Muss wohl an (der Funktionsweise von) BB liegen, schließlich läuft der quasi äquivalente Code bei mir und liefert bei GetAvail() meist einen Wert größer/gleich 1440. Wenn ich mich nicht vollkommen irre, entspricht dies ungefähr der maximalen Anzahl an Bytes (1460?), die in einem TCP/IP-Paket mit Header enthalten sein können. Falls es dir hilft, die Antwort vom HTTP-Server auf die Anfrage bezüglich der oben genannten URL sieht so aus: Code: [AUSKLAPPEN] HTTP/1.0 200 OK
Connection: close Content-Type: image/png Accept-Ranges: bytes ETag: "-4136930544340843751" Last-Modified: Sat, 24 Mar 2007 15:05:48 GMT Content-Length: 72590 Date: Sat, 11 Aug 2007 07:08:38 GMT Server: lighttpd/1.4.15 |
||
The box said, "Requires Windows XP or better", so I installed Ubuntu | Linux is NOT Windows
Flua :: Profiler für BB und BMax :: Partikel-Engine für BMax :: Lyphia-Projekt Quellcode (BMax) :: Automatische Parallelisierung :: Meine Musik |
![]() |
Vertex |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich kann immer nur auf Redirections hinweisen. Bei meinem Spider kamen die Redirections nicht all zu selten auf. Das sind die Statecodes 3xx wo euch ein weiteres Field "Location" vermittelt wird. In dem Feld steht dann die neue URL wo ihr wieder von vorne beginnen müsst zu laden.
Man muss ja nicht das ganze HTTP Protokoll kennen, aber es mal gelesen zu haben, ist unabdingbar. Das gilt auch für URL-Aufbau. Alles in RFCs verankert. |
||
vertex.dreamfall.at | GitHub |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group