Klaus: HTTPS-Download von fremder Seite

Hallo,

ich würde gerne regelmäßig eine auf einer fremden Seite angebotene Datei downloaden und lokal speichern.
Es handelt sich um Währungskurse, in einer Excel-Datei, die ich dann per PHP weiterverarbeite.

Leider funktioniert mein Script nicht und ich hab keine Idee warum:

$destination=fopen("/lokalerserver/test/".$datum."-fixing.xls","w");
$source=fopen("https://www.fremdewebseite.com/portal/mediadownload/Abrechnungskurse/Stand31032010.xls","r");
while ($a=fread($source,1024)) fwrite($destination,$a);
fclose($source);
fclose($destination);

Als Fehler zeigt der Browser: failed to open stream: Invalid argument
in der Zeile, wo der fopen steht.

Hat jemand eine Idee?

  1. Hi,

    $source=fopen("https://www.fremdewebseite.com/portal/mediadownload/Abrechnungskurse/Stand31032010.xls","r");

    Als Fehler zeigt der Browser: failed to open stream: Invalid argument
    in der Zeile, wo der fopen steht.

    Erster potentieller Anhaltspunkt: http://www.php.net/manual/en/function.fopen.php#80978

    MfG ChrisB

    --
    “Whoever best describes the problem is the person most likely to solve the problem.” [Dan Roam]
    1. Hi,

      Erster potentieller Anhaltspunkt: http://www.php.net/manual/en/function.fopen.php#80978

      war ganz sicher der richtige Anhaltspunkt. Ich hatte das Modul openssl tatsächlich noch nicht geladen und erhalte nun auch eine neue Fehlermeldung:

      failed to open stream: Ein Verbindungsversuch ist fehlgeschlagen, da die Gegenstelle nach einer bestimmten Zeitspanne nicht richtig reagiert hat, oder die hergestellte Verbindung war fehlerhaft, da der verbundene Host nicht reagiert hat.

      Wenn ich den Link im Browser angeben, erhalte ich sofort den Download.
      Wenn file() verwende, erhalte ich ebenfalls diese Meldung.
      Eventuell muss ich vor dem Download noch einen Header angeben, damit die Gegenstelle mich als Browser identifiziert?

  2. Hallo Klaus!

    Vermutlich lässt dein Server das Öffnen externer Ressourcen nicht zu.
    Die cURL-Funktionen von PHP könnten dir helfen.

    Dann könnte dein Beispiel so aussehen

      
    // neuen curl-Handler erzeugen $c  
    $c = curl_init();  
      
    // URL und andere Optionen setzen  
    $options = array(CURLOPT_URL => "/lokalerserver/test/".$datum."-fixing.xls",  
        CURLOPT_CONNECTTIMEOUT => '5',  
        CURLOPT_LOW_SPEED_LIMIT => '5000',  
        CURLOPT_LOW_SPEED_TIME => '5',  
        CURLOPT_USERAGENT => 'Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9.0.5) Gecko/2008120122 Firefox/3.6.2',  
        CURLOPT_RETURNTRANSFER => 1);  
    curl_setopt_array($c, $options);  
      
    // Daten als String übergeben  
    $content = curl_exec($c);  
      
    // curl-Handler schließen  
    curl_close($c);  
      
    // wenn Datenübertragung fehlgeschlagen  
    if($content === false){  
        // Fehlerbehandlung  
    // wenn Datenübertragung erfolgreich  
    }else{  
        // Daten verarbeiten  
    }  
    
    

    Wie PHP mit Excel-Dateien umgehen kann weiß ich nicht.
    Die Verarbeitung zu einem DOM-Objekt könnte z.B. so aussehen:

    $objdom = new DOMDocument();  
    @$objdom->loadHTML($content);
    

    Grüße, Matze

    1. $options = array(CURLOPT_URL => "/lokalerserver/test/".$datum."-fixing.xls",

      Die Adresse ist hier natürlich falsch.
      Falls dich das Thema interessiert kannst du dich ja trotzdem noch näher damit beschäftigen.

      Ansonsten gilt der Hinweis ChrisB. Ich lag völlig falsch.

      Grüße, Matze

  3. Hello,

    $source=fopen("https://www.fremdewebseite.com/portal/mediadownload/Abrechnungskurse/Stand31032010.xls","r");

    Als Fehler zeigt der Browser: failed to open stream: Invalid argument
    in der Zeile, wo der fopen steht.

    Überleg doch mal, was ein Browser macht, wenn er eine HTTPS-Ressource das erste Mal aufruft. Er führt zuerst den Dialog für den Schlüsselaustausch mit dem Server und fragt seinen User,  ob er das soll...

    Diesen Dialog muss der Host, der jetzt als Client benutzt wird mit dem Host, der den Server spielt selbstverständlich auch führen, wenn keine Zertifikate zur Verfügung stehen und beim Request mitgeliefert werden.

    Du müsstest das also mal genauer recherchieren, wie ein HTTPS-Dialog überhaupt stattfindet und diesen dann nachbauen in deinem PHP-Script.

    Liebe Grüße aus dem schönen Oberharz

    Tom vom Berg

    --
     ☻_
    /▌
    / \ Nur selber lernen macht schlau
    http://bergpost.annerschbarrich.de
    1. Hi,

      Du müsstest das also mal genauer recherchieren, wie ein HTTPS-Dialog überhaupt stattfindet und diesen dann nachbauen in deinem PHP-Script.

      Aber genau das macht doch curl (bereits von Matze erwähnt): "Folgende Protokolle werden zur Zeit unterstützt: HTTP, HTTPS, FTP, gopher, telnet, DICT, FILE und LDAP."

      Gruesse, Joachim

      --
      Am Ende wird alles gut.
      1. Hi,

        ich versuche mich momentan mit einem im Internet gefundenen Beispielscript, das auch Cookies unterstützt, da es ja sein kann, dass der Download nur bei der Verwendung von Cookies funktioniert.

        Hier ist mal der Link, von dem ich versuche herunterzuladen:

        h??ps://www.db-markets.com/portal/mediadownload/DWL/Abrechnungskurse/31032010-fixing.xls

        Mit der Excel-Datei, sofern ich sie dann mal habe, kann ich schon problemlos umgehen und die Inhalte auslesen und weiterverarbeiten.

        1. Hi,

          ich versuche mich momentan mit einem im Internet gefundenen Beispielscript, das auch Cookies unterstützt, da es ja sein kann, dass der Download nur bei der Verwendung von Cookies funktioniert.

          Hier ist mal der Link, von dem ich versuche herunterzuladen:

          h??ps://www.db-markets.com/portal/mediadownload/DWL/Abrechnungskurse/31032010-fixing.xls

          Lässt sich bspw. mit dem Web-Sniffer problemlos abrufen, und scheint sich dabei auch nicht groß um Dinge wie bspw. den User-Agent zu kümmern.

          Das Ding setzt zwar einen Cookie, aber da der bei erstmaligem Aufruf noch gar nicht vorhanden sein kann, dürfte das Fehlen eines solchen beim Request auch keine negativen Auswirkungen haben.

          Wenn ich allerdings vom Default HTTP/1.1 auf HTTP/1.0 umstelle, dann kommt zwar noch ein Status 200 OK zurück, allerdings keine Daten mehr - vielleicht ist das ja bei deinem Versuch das Problem?

          MfG ChrisB

          --
          “Whoever best describes the problem is the person most likely to solve the problem.” [Dan Roam]
          1. Hi,

            Wenn ich allerdings vom Default HTTP/1.1 auf HTTP/1.0 umstelle, dann kommt zwar noch ein Status 200 OK zurück, allerdings keine Daten mehr - vielleicht ist das ja bei deinem Versuch das Problem?

            Das scheint das momentane Problem zu sein, denn mit meinem momentanen Script bekomme ich auch keine Fehlermeldung aber auch keine Daten mehr zurück.

            Jetzt muss ich mal schauen, wie ich sicherstellen kann, dass HTTP/1.1 verwendet wird.

            Hier mal mein derzeitiges Script:

              
            function open_https_url($url,$refer = "",$usecookie = false) {  
                if ($usecookie) {  
                    if (file_exists($usecookie)) {  
                        if (!is_writable($usecookie)) {  
                            return "Can't write to $usecookie cookie file, change file permission to 777 or remove read only for windows.";  
                        }  
                    } else {  
                        $usecookie = "cookie.txt";  
                        if (!is_writable($usecookie)) {  
                            return "Can't write to $usecookie cookie file, change file permission to 777 or remove read only for windows.";  
                        }  
                    }  
                }  
                $ch = curl_init();  
                curl_setopt($ch, CURLOPT_URL, $url);  
                curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);  
                curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);  
                curl_setopt($ch, CURLOPT_HEADER, 1);  
                curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)");  
                if ($usecookie) {  
                    curl_setopt($ch, CURLOPT_COOKIEJAR, $usecookie);  
                    curl_setopt($ch, CURLOPT_COOKIEFILE, $usecookie);  
                }  
                if ($refer != "") {  
                    curl_setopt($ch, CURLOPT_REFERER, $refer );  
                }  
                curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);  
               $result =curl_exec ($ch);  
               curl_close ($ch);  
               return $result;  
            }  
              
              
            $datei = open_https_url("https://www.db-markets.com/portal/mediadownload/DWL/Abrechnungskurse/31032010-fixing.xls","",true);  
            echo "-->".$datei."<--";  
              
            $destination=fopen("/lokalerserver/test/AAA.xls","w");  
            fwrite($destination,$datei);  
            fclose($destination);  
            
            
    2. Hi,

      Du müsstest das also mal genauer recherchieren, wie ein HTTPS-Dialog überhaupt stattfindet und diesen dann nachbauen in deinem PHP-Script.

      Das Modul php_openssl gibt's sicher nicht zu dem Zweck, dass man sich das selber basteln muss.

      MfG ChrisB

      --
      “Whoever best describes the problem is the person most likely to solve the problem.” [Dan Roam]
      1. Hello,

        Das Modul php_openssl gibt's sicher nicht zu dem Zweck, dass man sich das selber basteln muss.

        na dann hilft vielelicht dieser Link
        http://www.weberdev.com/get_example-4136.html

        Liebe Grüße aus dem schönen Oberharz

        Tom vom Berg

        --
         ☻_
        /▌
        / \ Nur selber lernen macht schlau
        http://bergpost.annerschbarrich.de
        1. Hi,

          na dann hilft vielelicht dieser Link
          http://www.weberdev.com/get_example-4136.html

          genau dieses Beispielscript versuche ich gerade.... Allerdings bekomme ich zwar keine Fehlermeldung zurück, aber auch keine Daten.

          1. Hello,

            na dann hilft vielelicht dieser Link
            http://www.weberdev.com/get_example-4136.html

            genau dieses Beispielscript versuche ich gerade.... Allerdings bekomme ich zwar keine Fehlermeldung zurück, aber auch keine Daten.

            Versuch es doch erst einmal mit dem Browser und einer Live-HTTP(S)-Headers-Extension. Dann solltest Du mMn sehen können, was für ein Dialog da überhaupt abläuft, bis der eigentliche Datentransfer dann beginnt.

            Liebe Grüße aus dem schönen Oberharz

            Tom vom Berg

            --
             ☻_
            /▌
            / \ Nur selber lernen macht schlau
            http://bergpost.annerschbarrich.de