PHP-Skript ruft externe Seite auf

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

  • PHP-Skript ruft externe Seite auf

    Hallo,

    ich bin noch nicht der Experte in PHP, deswegen eine Frage an euch:

    Ist es prinzipiell möglich das ein PHP-Skript eine externe Seite aufruft, sich dort einloggt und dort einige Funktionen (können nur aufgerufen werden, wenn man sich vorher eingeloggt hat) aufruft? Problem hierbei wird doch sicherlich sein, dass beim Anmelden normalerweise Daten in die Session/Cookies geschrieben werden?

    Dies soll letztendlich dazu führen, dass durch den Login und das Aufrufen der Funktionen eine Datei auf dem Server gespeichert wird, von dem aus das Skript aufgerufen wird.

    Ich hoffe es ist in etwa verständlich, was ich meine! ;-)
    Vielen Dank schonmal für die Hilfe.

  • #2
    Zitat von amenz Beitrag anzeigen
    Ist es prinzipiell möglich das ein PHP-Skript eine externe Seite aufruft, sich dort einloggt und dort einige Funktionen (können nur aufgerufen werden, wenn man sich vorher eingeloggt hat) aufruft?
    Ja - dein PHP-Script übernimmt dann gegenüber dem anderen Server die Rolle des Clients.

    Problem hierbei wird doch sicherlich sein, dass beim Anmelden normalerweise Daten in die Session/Cookies geschrieben werden?
    Kein Problem - du musst halt nur das gleiche Verhalten, dass (d)ein Browser diesbezüglich zeigen würden, nachstellen.


    Stichworte wären fsockopen & Co. (wenn man alles selber machen will - erfordert gute Kenntnisse über den Umgang mit dem HTT-Protokoll), bzw. cURL.
    I don't believe in rebirth. Actually, I never did in my whole lives.

    Kommentar


    • #3
      Vielen Dank.

      Eine Frage noch: Ich komme jetzt schon bis zum "Download-Button". Das Problem hier ist, dass sich dahinter Javascript verbirgt. Gibts da eine Möglichkeit, dies mit Curl anzusprechen?

      Sprich: Wenn man auf den Button klickt wird eine Javascript-Funktion aufgerufen, die mir die Datei generiert und der Download wird gestartet.

      Kommentar


      • #4
        Hallo,

        das ist ohne weiteres nicht möglich, da JS nur von Browsern ausgewertet wird. Alles, was du tun kannst, ist eine Analyse des JavaScript-Codes vorzunehmen, um irgendwie an die Download-URL ranzukommen und die dann wieder mit cURL zu ziehen.

        Wenn es aber serverseitig schon so umständlich gelöst ist, erweckt das den Eindruck, dass man eben nicht irgendetwas von dort automatisiert abrufen können soll. Wenn du es trotzdem machst, solltest du dir darüber im Klaren sein, dass es möglicherweise strafbar ist.

        Gruß,

        Amica
        [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
        Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
        Super, danke!
        [/COLOR]

        Kommentar


        • #5
          Vielen Dank auch für diese Antwort!

          Ich bin wieder einen Schritt weiter und hab die Datei nun auf dem Server liegen. Kurz vorm Ziel hat sich für mich aber ein weiteres Problem ergeben, vielleicht könnt ihr mir auch da weiterhelfen, auch wenn es thematisch nicht mehr ganz so gut in diesen Thread passt.

          Ich möchte mir die Datei per Mail zusenden lassen. Sie hat ungefähr eine Größe von 20MB. Die Fehlermeldung, die auftaucht ist folgende:

          Fatal error: Allowed memory size of 41943040 bytes exhausted (tried to allocate 25927325 bytes) in /var/www/html/user/html/bla/skript.php on line 25
          Nach googlen weiß ich, dass das Skript wohl zu speicherintensiv ist, gibts ne Möglichkeit, dass die Mail doch irgendwie versand wird?

          Skript schaut wie folgt aus:
          PHP-Code:
          <?php 
          $empfaenger 
          "asd@domain.de"// Empfänger E-Mail Adresse
          $betreff "betreff"// Betreff

          $dateiname "datei.pdf"// Dateiname
          $dateiname_mail "datei.pdf";

          $id md5(uniqid(time()));
          $dateiinhalt fread(fopen($dateiname"r"), filesize($dateiname));

           
          // Absender Name und E-Mail Adresse
          $kopf "From: Manfred Mustermann <meine@mailadresse.xy>\n";
          $kopf .= "MIME-Version: 1.0\n";
          $kopf .= "Content-Type: multipart/mixed; boundary=$id\n\n";
          $kopf .= "This is a multi-part message in MIME format\n";
          $kopf .= "--$id\n";
          $kopf .= "Content-Type: text/plain\n";
          $kopf .= "Content-Transfer-Encoding: 8bit\n\n";
          $kopf .= "E-Mail mit Anhang"// Inhalt der E-Mail (Body)
          $kopf .= "\n--$id";
          // Content-Type: image/gif, image/jpeg, image/png » MIME-Typen - selfHtml.org
          $kopf .= "\nContent-Type: application/pdf; name=$dateiname_mail\n";
          $kopf .= "Content-Transfer-Encoding: base64\n";
          $kopf .= "Content-Disposition: attachment; filename=$dateiname_mail\n\n";
          $kopf .= chunk_split(base64_encode($dateiinhalt));
          $kopf .= "\n--$id--";
          mail($empfaenger$betreff"Bla bLa"$kopf); // E-Mail versenden
          ?>
          PS: Ich bezahle übrigens für den Service, habe nur keine Lust die Abfolge täglich manuell anzustoßen dafür das Skript!

          Kommentar


          • #6
            Hallo,

            20MB per Mail zu verschicken, ist ziemlich viel. Die 1990er sind zwar vorbei, aber trotzdem wird die zumindest lange unterwegs sein, denke ich mal. Ich vertrete immer noch die Meinung, dass Mails nicht größer als 5MB sein sollten.

            Davon abgesehen, wird durch Base64 die Mail dann 30MB groß. Dass da das Speicherlimit von PHP überschritten wird, ist nicht besonders verwunderlich.

            Gruß,

            Amica
            [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
            Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
            Super, danke!
            [/COLOR]

            Kommentar


            • #7
              Hallo Amica,

              ich habe leider keinen Einfluss auf die Größe der Datei. 20MB sollten aber auch wirklich das Maximum sein (die Größe schwankt allerdings von Tag zu Tag).

              Ehrlich gesagt, war das o.a. Skript die erste Lösung, die ich beim Googlen gefunden habe und habe mich nicht weiter mit den einzelnen Funktionen beschäftigt.

              Hättest du zufällig noch eine Ende, damit ich nicht an das Speicherlimit stoße?

              Danach versprech ich euch, euch auch nicht weiter zu belästigen!

              Kommentar


              • #8
                Zitat von amenz Beitrag anzeigen
                ich habe leider keinen Einfluss auf die Größe der Datei.
                wirklich nicht? Hast du auf dem Webspace keine Zlib-Funktionen oder ein externes gzip zum Aufruf über exec?

                Wie wäre es, wenn du die Datei irgendwo auf dem Server ablegst und nur den Link per Mail verschickst?
                [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
                Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
                Super, danke!
                [/COLOR]

                Kommentar


                • #9
                  zustimmung

                  als gelegenheits admin, kann ich dir sagen, das die meisten server php so konfigurieren, das bei einer bestimmten größe schluss ist.

                  was bei dir der fall ist.

                  da wäre nur die möglichkeit, wie amica schon geschrieben hat, die datei per link zugänglich zu machen.

                  ansonsten frage ich mich schon was du von dem fremden server ziehen willst, was dazu noch über 10mb groß ist ???

                  verdächtig, also auf meinem server würde ich sowas nicht zulassen. und vermutlich wirst du auch bei deinen versuchen an weitere grenzen des machbaren stoßen.
                  fotos :

                  http://www.flickr.com/photos/rassloff/collections/

                  Kommentar


                  • #10
                    Um hier einigen mal die Bedenken zu nehmen. Es handelt sich schlichtweg darum, dass ich meine Tageszeitung seit einigen Tagen auch per Epaper abonniert habe. Diese muss ich allerdings recht umständlich über die Homepage des Verlegers abrufen und herunterladen. Damit ich mir dies jeden morgen sparen kann, hab ich mir (mit eurer Hilfe, danke nochmal!) das Skript geschrieben.
                    Ich würde die Datei aber ungern auf dem Webserver rumliegen lassen, da ansonsten jeder, der die URL weiß Zugriff darauf hätte, deshalb der Ansatz mit der Mail. Die Datei / Verzeichnis mit htacess o.ä. zu sichern würd ich auch ungern machen, da ich ja dann fast wieder so weit bin, wie wenn ich die Datei mit Login usw. direkt vom Verleger runterlade.

                    Ich werd mich dann jetzt mal schlau machen, was die "Zlib-Funktionen", "externes gzip" und "exec" sind! Ich hoffe es funktioniert genauso gut wie die letzten Male mit euren Tipps. =)

                    Kommentar


                    • #11
                      Wenn du dir einen generierten Wegwerflink per E-Mail schickst, müsste dich schon jemand gezielt abhören, um an die URL zu kommen.

                      Mir hat mal jemand 15MB per Mail geschickt. Ich konnte diese Mail auch problemlos empfangen, aber erst nach 6 Tagen. Wenn es um eine Tageszeitung geht, finde ich, dass das vielleicht schon etwas schneller gehen könnte.

                      Es gibt ja auch noch DynDNS und entweder SFTP oder OpenVPN und UNC, um die Datei direkt auf deinen Rechner zu schieben.

                      Gruß,

                      Amica
                      [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
                      Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
                      Super, danke!
                      [/COLOR]

                      Kommentar


                      • #12
                        Hallo zusammen,

                        ich möchte zur Nutzung auf iPhone und später iPad das komplette E-Paper einer namhaften Tageszeitung als Zip auf meinen Server per Crontab downloaden und entpacken, um den direkten Link auf das PDF-Dokument auf meinem Server dann auf meinen privaten E-Mail-Account zu schicken. Natürlich Passwortgeschützt, aber hier reicht mir ein normaler .htaccess.

                        Zur Lösung des PHP-Problems habe ich schon einiges erreich. Im Moment sieht der Code wie folgt aus:

                        PHP-Code:
                        <!-- <head>
                        <base href="http://www.faz.net" /> 
                        <!-- War mein Ansatz, um die relative "Meta-Refresh"-Weiterleitung der Seite funktionsfähig zu machen. 
                        Das funktioniert allerdings nur, wenn man curl_exec per echo und mit dem Browser aufruft... 
                        </head> -->

                        <?php
                        // INIT CURL
                        $ch curl_init();

                        // SET URL FOR THE POST FORM LOGIN
                        curl_setopt($chCURLOPT_URL'http://www.zeitung.tld/d/login/login.aspx');


                        curl_setopt ($chCURLOPT_POST1);
                        curl_setopt ($chCURLOPT_POSTFIELDS'usr_login=<benutzer>&usr_pwd=<passwort>');
                        curl_setopt ($chCURLOPT_REFERER"http://www.zeitung.tld");
                        curl_setopt($chCURLOPT_RETURNTRANSFER,1); 
                        curl_setopt($chCURLOPT_HEADER0); 
                        curl_setopt($chCURLOPT_FOLLOWLOCATIONtrue);
                        //curl_setopt($ch, CURLOPT_AUTOREFERER, 1);
                        curl_setopt($ch,CURLOPT_COOKIEFILE,'cookies.txt'); 
                        curl_setopt($chCURLOPT_COOKIEJAR'cookie.txt');
                        curl_setopt ($chCURLOPT_RETURNTRANSFER1);

                        // Login tätigen
                        $store curl_exec ($ch);
                        // echo curl_exec ($ch); # Funktioniert bzgl. der oben erwähnten Weiterleitung besser, für meine Problemstellung aber nicht sinnvoll.

                        // Datei downloaden
                        curl_setopt($chCURLOPT_URL'http://www.zeitung.tld/epaperzip.zip');
                        $content curl_exec ($ch);

                        // CLOSE CURL
                        curl_close ($ch); 
                        ?>
                        Also, wie oben beschrieben funktioniert der Login nur, wenn ich den Login per echo curl_exec über den Browser ausführe. Dann wird bei aktiviertem Base die relative meta-refresh Weiterleitung der Zeitung ausgeführt, was offensichtlich notwendig ist, um eingeloggt zu werden. Im Übrigen werden mit Followlocation keine Get-Variablen in der URL übergeben. Hier scheint eine Art Session-ID übergeben werden.

                        An dieser Stelle komme ich leider nicht weiter und benötige Hilfe. Ich hoffe sehr, dass ich in diesem Forum Rat bekomme.

                        Herzlichen Dank und viele Grüße

                        jcf

                        Das Einloggen, so wie

                        Ich habe gerade einen eigenen Thread erstellt und stelle fest, dass dieser eigentlich hierhin gehört, weil ich genau das gleiche Vorhaben habe, mit der Lösung aber festsitze, weil ein einfacher Login per cURL nicht ausreicht. Hier die URL zu meinem Thread: [hierher verschoben, Amica]

                        Vielen Dank!
                        Zuletzt geändert von jcf; 05.03.2010, 11:31.

                        Kommentar


                        • #13
                          Hallo jcf,

                          bitte brich doch deinen Code um, damit man diesen Thread wieder vernünftig lesen kann. (Siehe Signatur)

                          Edit: Kannst du bitte nochmal genauer drauf eingehen, warum du an der genannten Stelle nicht weiterkommst? Wie liefe die Sitzung im Browser im Detail ab? Wann wird wie wohin umgeleitet? (Das LiveHTTPHeaders für Firefox kann dir da helfen.)

                          Gruß,

                          Amica
                          Zuletzt geändert von AmicaNoctis; 05.03.2010, 08:25.
                          [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
                          Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
                          Super, danke!
                          [/COLOR]

                          Kommentar


                          • #14
                            Danke für den Hinweis. Der Code ist umgebrochen. Inzwischen bin ich doch weiter gekommen und das Skript ist fertig. Das Problem war, dass nach der Weiterleitung Cookies in Form von Bildern gesetzt wurden. Ich musste also erst die URLs zu diesen Cookies extrahieren und mit CURL aufrufen. Jetzt funktioniert es. Die dargestellte Lösung ist zwar nur für einen speziellen Zweck, aber vielleicht hat ja jemand noch Interesse sein E-Paper Abo bei einer Frankfurter Zeitung etwas angenehmer für iPhone und iPad zu gestalten...

                            PHP-Code:
                            <?php
                            // CURL initiieren
                            $ch curl_init();

                            curl_setopt($chCURLOPT_URL'<login-url>');
                            curl_setopt($chCURLOPT_USERAGENT"Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.3) Gecko/20070309 Firefox/2.0.0.3");
                            curl_setopt ($chCURLOPT_POST1);
                            curl_setopt ($chCURLOPT_POSTFIELDS'usr_login=<benutzer>&usr_pwd=<passwort>');
                            curl_setopt($chCURLOPT_RETURNTRANSFER,1); 
                            curl_setopt($chCURLOPT_HEADER0); 
                            curl_setopt($chCURLOPT_FOLLOWLOCATION0);
                            curl_setopt($chCURLOPT_AUTOREFERER1);
                            curl_setopt($ch,CURLOPT_COOKIEFILE,'cookies.txt'); 
                            curl_setopt($chCURLOPT_COOKIEJAR'cookie.txt');
                            curl_setopt ($chCURLOPT_RETURNTRANSFER1);

                            // Login Prozess
                            $store curl_exec ($ch);
                            curl_setopt($chCURLOPT_URL'<cookie-url>');
                            $store2 curl_exec ($ch);

                            // Cookies extrahieren und aufrufen
                            $pattern '/<\s*img [^\>]*src\s*=\s*[\""\']?([^\""\'\s>]*)/i';
                            preg_match_all($pattern$store2$matches); 
                            curl_setopt($chCURLOPT_URL$matches[1][2]);
                            $store3 curl_exec ($ch);
                            curl_setopt($chCURLOPT_URL$matches[1][3]);
                            $store4 curl_exec ($ch);
                            curl_setopt($chCURLOPT_URL$matches[1][4]);
                            $store5 curl_exec ($ch);

                            // Seite mit Download-Button aufrufen
                            curl_setopt($chCURLOPT_URL'<zugangzudownload-url>');
                            $store6 curl_exec ($ch);

                            // Popup mit Download-Möglichkeiten aufrufen
                            preg_match_all("/(window[.]open[[:blank:]]*[(])[[:blank:]]*[\'\"]?(([[a-z]{3,5}:\/\/(([.a-zA-Z0-9-])+
                            (:[0-9]+)*))*([+:%\/?=&;\\\(\),._ a-zA-Z0-9-]*))(#[.a-zA-Z0-9-]*)?[\'\" ]?/i"
                            $store6$matches2PREG_SET_ORDER); 
                            curl_setopt($chCURLOPT_URL$matches2[1][2]);
                            $store7 curl_exec ($ch);

                            // Direkten Download-Link für Zip Archiv extrahieren
                            $pattern2 '#<a\s+href=[\'"]([^\'"]+)[\'"]\s*(?:title=[\'"]([^\'"]+)[\'"])?\s*>((?:(?!</a>).)*)</a>#i';
                            preg_match_all($pattern2$store7$matches3); 

                            // ZIP-Archiv downloaden und zwischenspeichern
                            curl_setopt($chCURLOPT_URL$matches3[1][0]);
                            $fp fopen('temp.zip''w');
                            curl_setopt($chCURLOPT_FILE$fp);
                            curl_exec ($ch);
                            curl_close ($ch);
                            fclose($fp);

                            // ZIP-Archiv entpacken
                            $zip = new ZipArchive;
                            $res $zip->open('temp.zip');
                            if (
                            $res === TRUE) {
                              
                            $zip->extractTo('.');
                              
                            $zip->close();
                              } else {
                            }

                            // PDF-Dokumente im Verzeichnis auflisten
                            $oeffnen opendir(".");
                            for(
                            $i 0$datei[] = readdir($oeffnen); $i++) {
                            if(
                            strtolower(substr($datei[$i], -3)) == "pdf") {
                            $pdfs .= '<li><a href="http://<eigene-url>/'.$datei[$i].'">FAZ vom '.substr($datei[$i],6,2).
                            '.'.substr($datei[$i],4,2).'.'.substr($datei[$i],0,4).'</a></li>';
                            }
                            }
                              
                            // E-Mail verschicken
                            require("temp/class.phpmailer.php");

                            $mail = new PHPMailer();  // Instantiate your new class
                            $mail->IsSMTP();          // set mailer to use SMTP
                            $mail->SMTPAuth true;   // turn on SMTP authentication
                            $mail->Host "smtp.gmail.com"// specify main and backup server
                            $mail->SMTPSecure"ssl"//  Used instead of TLS when only POP mail is selected
                            $mail->Port 465;        //  Used instead of 587 when only POP mail is selected

                            $mail->Username "<benutzer>@gmail.com";  // SMTP username, you could use your google apps address too.
                            $mail->Password "<gmail-passwort>"// SMTP password

                            $mail->From "<versender-e-mail-adresse>"//Aparently must be the same as the UserName
                            $mail->FromName "<versender-name>";
                            $mail->AddAddress("empfänger-e-mail-adresse""<empfänger-name>");
                            $mail->Subject 'Aktuelle Ausgabe';
                            $mail->IsHTML(true);
                            $mail->Body "<ul>".$pdfs."</ul>";

                            if(!
                            $mail->Send())
                            {
                              echo 
                            "There was an error sending the message:" $mail->ErrorInfo;
                              exit;
                            }
                            ?>

                            Kommentar


                            • #15
                              Danke

                              Schön das es auch Leute gibt, die Ihre Probleme lösen und die Lösung für andere zur Verfügung stellen.

                              Schönes Wochenende
                              fotos :

                              http://www.flickr.com/photos/rassloff/collections/

                              Kommentar

                              Lädt...
                              X