Sneapi: Problem beim auslesen von Quelltext mit curl

Hallo Leute,
ich hab da ein kleines Problem beim auslesen des Quelltextes mit curl und zwar erhalte ich immer die Antwort:
The document has moved here
ich vertseh nicht ganz wieso kann mir da vll jemand weiter Helfen?

So sieht mein Code aus:

  
$curl_link = 'http://ul.to/fnum1u';  
$useragent = 'Mozilla/5.0 (Windows; U; Windows NT 6.1; de; rv:1.9.1.7) Gecko/20091221 Firefox/3.5.7';  
$timeout = 20;  
	  
$ch = curl_init($curl_link);  
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);  
curl_setopt($ch, CURLOPT_USERAGENT, $useragent);  
curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);  
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);  
	  
$result = curl_exec($ch);  
curl_close($ch);  
echo $result;  

Danke schon mal fürs Helfen.

Mfg

  1. The document has moved here

    Weil der Server genau das ausliefert.

    Im HTTP-Response dieses URL-Verlkürzungsdiensts bekommst du einen HTTP-302-Status - darin steht das "neue" Ziel welches du auswerten musst.

    1. The document has moved here

      Weil der Server genau das ausliefert.

      Im HTTP-Response dieses URL-Verlkürzungsdiensts bekommst du einen HTTP-302-Status - darin steht das "neue" Ziel welches du auswerten musst.

      Also wenn ich dich richtig verstehe, ist der Link der bei "here" steht der neue Link? Wenn ich aber im Quelltext schaue steht dort genau der gleiche Link wie den den ich nutze.

      Oder hab ich da jetzt was falsch verstanden?

      1. hi,

        Oder hab ich da jetzt was falsch verstanden?

        Evnt. Ein Status: 302 sagt dem Browser, dass das Dokument woanders ist, erst nach dem 302Header gibt der Server dann die Location bekannt.

        Hotti

        1. hi,

          Oder hab ich da jetzt was falsch verstanden?

          Evnt. Ein Status: 302 sagt dem Browser, dass das Dokument woanders ist, erst nach dem 302Header gibt der Server dann die Location bekannt.

          Hotti

          Ah ok jetzt hab ich das soweit verstanden. Nur wie ich jetzt aus dem Link den ich curl gebe den Link mache den ich brauche das weiß ich leider nicht. Kann man das dann auch irgend wie mit curl auslesen oder sagen er soll der Weiterleitung folgen oder so?

          1. Ah ok jetzt hab ich das soweit verstanden. Nur wie ich jetzt aus dem Link den ich curl gebe den Link mache den ich brauche das weiß ich leider nicht. Kann man das dann auch irgend wie mit curl auslesen oder sagen er soll der Weiterleitung folgen oder so?

            Du musst den Status auswerten und dann ggf. einen weiteren Request absetzen.

            1. Ah ok jetzt hab ich das soweit verstanden. Nur wie ich jetzt aus dem Link den ich curl gebe den Link mache den ich brauche das weiß ich leider nicht. Kann man das dann auch irgend wie mit curl auslesen oder sagen er soll der Weiterleitung folgen oder so?

              Du musst den Status auswerten und dann ggf. einen weiteren Request absetzen.

              Du meinst etwar so:

                
              $curl_link = 'http://ul.to/fnum1u';  
              $useragent = 'Mozilla/5.0 (Windows; U; Windows NT 6.1; de; rv:1.9.1.7) Gecko/20091221 Firefox/3.5.7';  
              $timeout = 20;  
                
              $ch = curl_init($curl_link);  
              curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);  
              curl_setopt($ch, CURLOPT_USERAGENT, $useragent);  
              curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);  
              curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);  
              	  
              $result = curl_exec($ch);  
                
              $info = curl_getinfo($ch);  
              if($info['http_code'] == 302){  
                // weiterer Request  
              }  
                
              curl_close($ch);  
              
              

              Aber wenn ich dort die selbe abfrage noch mal mache dann kommt doch der selbe 302 Fehler wieder.....

              1. Hallo,

                Du musst den Status auswerten und dann ggf. einen weiteren Request absetzen.
                Du meinst etwar so:

                $result = curl_exec($ch);

                $info = curl_getinfo($ch);
                if($info['http_code'] == 302){
                  // weiterer Request
                }

                  
                im Prinzip ja. Besser ist jedoch, eine while-Schleife zu nutzen, die solange läuft, wie 301 oder 302 als Status zurückkommt. Theoretisch können nämlich auch mehrere Redirects als Kette vorkommen.  
                  
                
                > Aber wenn ich dort die selbe abfrage noch mal mache dann kommt doch der selbe 302 Fehler wieder.....  
                  
                Natürlich nicht dieselbe, sondern die URL, die der Server dir im Location-Header mitteilt. Diese Info stellt [curl](http://php.net/manual/en/book.curl.php) aber anscheinend nicht zur Verfügung.  
                  
                Allerdings kannst du auch eine [Option setzen](http://www.php.net/manual/en/function.curl-setopt.php), mit der curl einem Redirect automatisch folgt. Über das [Statusfeld](http://www.php.net/manual/en/function.curl-getinfo.php) kannst du dann abfragen, wie viele Umleitungen beteiligt waren und wo du tatsächlich gelandet bist, wenn dich das interessiert.  
                  
                So long,  
                 Martin  
                
                -- 
                Most experts agree: Any feature of a program that you can't turn off if you want to, is a bug.  
                Except with Microsoft, where it is just the other way round.  
                
                
                1. Also hab das mit dem Fehler jetzt malweggelassen und erstmal versucht dem Link zu folgen und zwar so:

                    
                  $curl_link = 'http://ul.to/fnum1u';  
                  $useragent = 'Mozilla/5.0 (Windows; U; Windows NT 6.1; de; rv:1.9.1.7) Gecko/20091221 Firefox/3.5.7';  
                  $timeout = 20;  
                    
                  function geturl(){  
                  global $curl_link,$useragent,$timeout;  
                    
                  $ch = curl_init($curl_link);  
                  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);  
                  curl_setopt($ch, CURLOPT_HEADER, true);  
                  curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);  
                  curl_setopt($ch, CURLOPT_USERAGENT, $useragent);  
                  curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);  
                  curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);  
                  	  
                  $result = curl_exec($ch);  
                  curl_close($ch);  
                  return $result;  
                  }  
                    
                  echo geturl();  
                  
                  

                  Antwort:
                  Warning: curl_setopt() [function.curl-setopt]: CURLOPT_FOLLOWLOCATION cannot be activated when in safe_mode or an open_basedir is set in /var/www/web49/html/diamonddog/downloads/test.php on line 12

                    
                  HTTP/1.1 302 Found  
                  Date: Mon, 18 Jan 2010 10:50:57 GMT  
                  Server: Apache/2.2.8 (Ubuntu) mod_python/3.3.1 Python/2.5.2  
                  Location: http://uploaded.to/file/fnum1u  
                  Connection: close  
                  Transfer-Encoding: chunked  
                  Content-Type: text/plain  
                    
                  <p>The document has moved <a href="http://uploaded.to/file/fnum1u">here</a></p>  
                  
                  

                  PS: save_mode ist off

                  1. Aber hallo!

                    echo geturl();

                    Antwort:
                    Warning: curl_setopt() [function.curl-setopt]: CURLOPT_FOLLOWLOCATION cannot be activated when in safe_mode or an open_basedir is set in /var/www/web49/html/diamonddog/downloads/test.php on line 12

                    wenn der safe_mode bei dir aus ist, wird's wohl eine open_basedir-Einschränkung sein. Warum deshalb das Verfolgen von HTTP-Redirects nicht erlaubt sein soll, ist mir allerdings nicht klar. Ich sehe da keinen logischen Zusammenhang.

                    HTTP/1.1 302 Found
                    Date: Mon, 18 Jan 2010 10:50:57 GMT
                    Server: Apache/2.2.8 (Ubuntu) mod_python/3.3.1 Python/2.5.2
                    Location: http://uploaded.to/file/fnum1u
                    Connection: close
                    Transfer-Encoding: chunked
                    Content-Type: text/plain

                    Hey, da sind ja alle HTTP-Header! Gibt curl die als Nutzinhalt mit aus? Na prima, dann hast du doch den HTTP-Status und den Location-Header, und kannst beides auswerten.

                    Ciao,
                     Martin

                    --
                    Nein, es ist nicht wahr, dass bei der Post Beamte schneller befördert werden als Pakete.
                    1. Hey, da sind ja alle HTTP-Header! Gibt curl die als Nutzinhalt mit aus? Na prima, dann hast du doch den HTTP-Status und den Location-Header, und kannst beides auswerten.

                      ja nur gibt er mir den header in $result mit aus, was etwas umständlich ist weil mein ja so immer den Link ausschneiden muss. Geht das nicht auch einfacher das man den header in ein array schreiben läst oder so weil sonst muß ich immer den string zerlegen und dann die neue abfrage mit der neuen url starten. Wenn man es im array hätte brächt man ja nur ne neue abfrage mit Location machen.

                      Hier noch mal den Code wie ich ihn jetzt habe:

                        
                      $curl_link = 'http://ul.to/fnum1u';  
                      //$curl_link = 'http://ul.to/fnum1u';  
                      $useragent = 'Mozilla/5.0 (Windows; U; Windows NT 6.1; de; rv:1.9.1.7) Gecko/20091221 Firefox/3.5.7';  
                      $timeout = 20;  
                        
                      function geturl(){  
                      global $curl_link,$useragent,$timeout;  
                        
                      $ch = curl_init($curl_link);  
                      curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);  
                      curl_setopt($ch, CURLOPT_HEADER, true);  
                      curl_setopt($ch, CURLOPT_USERAGENT, $useragent);  
                      curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);  
                      curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);  
                      	  
                      $result = curl_exec($ch);  
                        
                      curl_close($ch);  
                      return $result;  
                      }  
                        
                      echo geturl();  
                      
                      

                      PS: Der Header wird jetzt wegen der Zeile:

                        
                      curl_setopt($ch, CURLOPT_HEADER, true);  
                      
                      

                      mit ausgegeben.

              2. Aber wenn ich dort die selbe abfrage noch mal mache dann kommt doch der selbe 302 Fehler wieder.....

                Darum musst du ja den Response auswerten - der sollte etwa so aussehen (im Klartext):

                HTTP/1.1 302 Found
                Location: http://www.example.com/foo.php

                Du musst den response Parsen und den Inhalt des Location-Wertes für den neuen Request verwenden.

                Dein Script sollte aber so schlau aufgebaut sein, dass es für den Fall dass dort wieder ein 302 daherkommt, entsprechend reagiert.

                Erstelle also eine Funktion die dein cURL ausführt und auf den Status reagiert - am Besten nicht nur auf 301 sondern auch auf andere gängige Statuscodes die auf eine andere Ressource verweisen (eben 301 (wichtig), oder auch 300, 303, 307).