Probleme mit Linkverfolgung !!! HILFE !!!

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Probleme mit Linkverfolgung !!! HILFE !!!

    Hallo werte Gemeinde,

    mal wieder habe ich ein Problem und brauche eure Hilfe.

    Ich habe eine Art Spider in PHP geschrieben die automatisch alle links innerhalb einer Domain verfolgt und ausliest um Sie in einer Datenbank zu Speichern (Fast ne kleine SuMa).

    Nun habe ich folgendes Prob:

    Bei einigen Links ( z.B. http://www.code-box.de/download.php?id=28&s=download ) wird ein Automatischer Download gestartet und die berümte abfrage ( Öffenen / Speichern / Abbrechen ) erscheint. Die ersten 10 solcher Links verkraftet das Script, dann bleibt es hängen. Ausgelesen werden die Daten mit $content = implode("", file($url));

    Wie kann ich nun vor dem auslesen erkennen ob der Link einen Download startet ? Habe es schon mit phpLinkCheck ( http://www.php-faq.de/q/q-code-links-testen.html ) versucht dieses erkennt das aber nicht.

    Weis jemand ABHILFE ?

    Vielen Dank schonmal im vorraus für die Hilfe.

    MfG

  • #2
    fsockopen ist schon richtig, HEAD-Request schicken und Content-Type / Content-disposition auswerten
    Ich denke, also bin ich. - Einige sind trotzdem...

    Kommentar


    • #3
      Nur wie ?

      Bitte ewas ausführlicher ich bin da nicht so Firm in dem Bereich.

      MfG

      Kommentar


      • #4
        Hallo,

        schau dir mal hier an wie fsockopen() überhaupt funktioniert:

        www.php.net/fscockopen

        In den Userkommentaren findest auch schon fertig funtkionierende Beispiele, wie man so nen Request absetzt.

        Für dein Vorhaben reicht es aus vorerst nur bis zum ersten doppelten Zeilenumbruch (\r\n\r\n) auszulesen.

        Dann wertest die Zeile mit 'Content-disposition' aus, wenn da dahinter 'attachment' steht, dann dürfte das ein Dateidownload sein.

        Gruss
        Quetschi
        Ihr habt ein Torturial durchgearbeitet, das auf den mysql_-Funktionen aufbaut?
        Schön - etwas Geschichte kann ja nicht schaden.
        Aber jetzt seht euch bitte php.net/pdo oder php.net/mysqli bevor ihr beginnt!

        Kommentar


        • #5
          Habe es mit folgendem Script versucht :

          PHP-Code:
          <?php 

          function phpLinkCheck($url$r FALSE

            
          /*  Purpose: Check HTTP Links 
             *  Usage:   $var = phpLinkCheck(absoluteURI) 
             *           $var["Status-Code"] will return the HTTP status code 
             *           (e.g. 200 or 404). In case of a 3xx code (redirection) 
             *           $var["Location-Status-Code"] will contain the status 
             *           code of the new loaction. 
             *           See print_r($var) for the complete result 
             * 
             *  Author:  Johannes Froemter <j-f@gmx.net> 
             *  Date:    2001-04-14 
             *  Version: 0.1 (currently requires PHP4) 
             */ 

            
          $url trim($url); 
            if (!
          preg_match("=://="$url)) $url "http://$url"
            
          $url parse_url($url); 
            if (
          strtolower($url["scheme"]) != "http") return FALSE

            if (!isset(
          $url["port"])) $url["port"] = 80
            if (!isset(
          $url["path"])) $url["path"] = "/"

            
          $fp fsockopen($url["host"], $url["port"], &$errno, &$errstr30); 

            if (!
          $fp) return FALSE
            else 
            { 
              
          $head ""
              
          $httpRequest "HEAD "$url["path"] ." HTTP/1.1\r\n" 
                            
          ."Host: "$url["host"] ."\r\n" 
                            
          ."Connection: close\r\n\r\n"
              
          fputs($fp$httpRequest); 
              while(!
          feof($fp)) $head .= fgets($fp1024); 
              
          fclose($fp); 

              
          preg_match("=^(HTTP/\d+\.\d+) (\d{3}) ([^\r\n]*)="$head$matches); 
              
          $http["Status-Line"] = $matches[0]; 
              
          $http["HTTP-Version"] = $matches[1]; 
              
          $http["Status-Code"] = $matches[2]; 
              
          $http["Reason-Phrase"] = $matches[3]; 

              if (
          $r) return $http["Status-Code"]; 

              
          $rclass = array("Informational""Success"
                              
          "Redirection""Client Error"
                              
          "Server Error"); 
              
          $http["Response-Class"] = $rclass[$http["Status-Code"][0] - 1]; 

              
          preg_match_all("=^(.+): ([^\r\n]*)=m"$head$matchesPREG_SET_ORDER); 
              foreach(
          $matches as $line$http[$line[1]] = $line[2]; 

              if (
          $http["Status-Code"][0] == 3
                
          $http["Location-Status-Code"] = phpLinkCheck($http["Location"], TRUE); 

              return 
          $http
            } 


          $test=phpLinkCheck("http://www.code-box.de/download.php?id=28&s=download");

          print_r($test);

          ?>
          Heraus kommt : Content-Type => text/html.

          Wenn man aber die URL im browser aufruft kommt die downloadanfrage und bei dieser oder einer anderen adresse die den selben effeckt hat bleibt das Script hängen.

          Auch mime-Typ liefert dieses ergebniss.

          Kommentar


          • #6
            hint: das sind die header, die dabei übertragen werden:
            Code:
            GET /download.php?id=28&s=download HTTP/1.1
            Host: [url]www.code-box.de[/url]
            [...]
            
            
            HTTP/1.x 302 Found
            Date: Wed, 20 Jul 2005 16:35:36 GMT
            Server: Apache
            X-Powered-By: PHP/4.3.11
            Location: [url]http://gtk.php.net/distributions/php-gtk-0.5.0-win32.zip[/url]
            Keep-Alive: timeout=15, max=100
            Connection: Keep-Alive
            Transfer-Encoding: chunked
            Content-Type: text/html
            ----------------------------------------------------------
            [url]http://gtk.php.net/distributions/php-gtk-0.5.0-win32.zip[/url]
            
            
            GET /distributions/php-gtk-0.5.0-win32.zip HTTP/1.1
            Host: gtk.php.net
            [...]
            
            
            HTTP/1.x 200 OK
            Date: Wed, 20 Jul 2005 16:35:35 GMT
            Server: Apache/1.3.33 (Unix) PHP/5.0.4
            Last-Modified: Wed, 23 Jan 2002 19:31:34 GMT
            Etag: "14c68-23ddaf-3c4f0f96"
            Accept-Ranges: bytes
            Content-Length: 2350511
            Keep-Alive: timeout=15, max=100
            Connection: Keep-Alive
            Content-Type: application/zip
            sprich, das gespräch zwischen deinem script und dem server muss so lange weitergehen, solange kein fehler bzw. 200 zurückgegeben wird. dein script hört bei 302 schon auf (da ist auch text/html) - das sollte vermieden werden.

            Kommentar


            • #7
              Sorry anscheinend bin ich zu blöd um das zu verstehen.

              Sie müste ich mein script nun abändern ?

              Kommentar


              • #8
                das script ist anscheinend in ordnung. nur musst du an der stelle debuggen, an der rekursion eintritt. in diesem fall sollte es so sein - auf 302 hin soll die funktion erneut aufgerufen werden, das passiert auch.

                zeig mal die ausgabe dieser funktion (mittels print_r() und <pre> am besten).

                ich tippe darauf, dass die rekursion anders ablaufen sollte:
                PHP-Code:
                //statt $http["Location-Status-Code"] = phpLinkCheck($http["Location"], TRUE); 

                //sowas wie 
                $http phpLinkCheck($http["Location"]); 

                Kommentar


                • #9
                  ich glaube....

                  habe mal deinen vorschlag versucht.

                  und habe zusätzlich über if ($http["Status-Code"][0] == 3) ein echo "<br>".$http["Location"]."<br>"; eingefügt und siehe da $http["Location"] scheint leer zu sein, ohne inhalt ud deshalb läuft die rekursion nicht aber wieso die leer ist kann ich nicht erkenne.

                  weis Jemand warum

                  Kommentar


                  • #10
                    weis Jemand warum
                    OffTopic:
                    ein ultimatives fehler-pro-satz-verhältnis...
                    nein, debuggen musst du schon selbst.

                    wenns leer ist, dann musst du herausfinden warum. hellseher sind alle im urlaub.

                    Kommentar


                    • #11
                      Mal ein paar sachen:

                      1: bin ich erst 12

                      2: erst seit 2 jahren in deutschland (komme aus bella italia)

                      3: habe erst vor ca. 3 wochen mit php angefangen

                      4: dachte ich hier würde man geholfen

                      MfG

                      Kommentar

                      Lädt...
                      X