Dateidownloadfunktion funktioniert nicht auf allen Webseiten

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

Christoph

Betreff: Dateidownloadfunktion funktioniert nicht auf allen Webseiten

BeitragFr, Aug 10, 2007 20:32
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragFr, Aug 10, 2007 21:22
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragFr, Aug 10, 2007 21:55
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragFr, Aug 10, 2007 22:43
Antworten mit Zitat
Benutzer-Profile anzeigen
@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? Very Happy

@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

BeitragFr, Aug 10, 2007 22:45
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragFr, Aug 10, 2007 22:52
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragFr, Aug 10, 2007 23:25
Antworten mit Zitat
Benutzer-Profile anzeigen
hast du mal alles rübergeschickt (dich also auch als Firefox ausgegeben)
 

E. Urbach

ehemals "Basicprogger"

BeitragSa, Aug 11, 2007 9:31
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSa, Aug 11, 2007 15:06
Antworten mit Zitat
Benutzer-Profile anzeigen
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

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group