| PHP Developer Forum Hier habt ihr die Möglichkeit, eure Skriptprobleme mit anderen Anwendern zu diskutieren. Seid so fair und beantwortet auch Fragen von anderen Anwendern. Dieses Forum ist sowohl für ANFÄNGER als auch für PHP-Profis! Post your PHP questions here! |
 |

22-02-2010, 21:10
|
|
amenz
Registrierter Benutzer
|
|
Registriert seit: Feb 2010
Beiträge: 5
|
|
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.
|

22-02-2010, 21:25
|
wahsaga
 Moderator
|
|
Registriert seit: Sep 2001
Beiträge: 24.486
|
|
Zitat:
Zitat von amenz
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.
Zitat:
|
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.
|

24-02-2010, 22:46
|
|
amenz
Registrierter Benutzer
|
|
Registriert seit: Feb 2010
Beiträge: 5
|
|
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.
|

25-02-2010, 00:03
|
AmicaNoctis
 Moderatorin
|
|
Registriert seit: Jul 2009
Beiträge: 5.550
|
|
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
__________________
Hast du die Grundlagen zur Fehlersuche gelesen? Hast du Code-Tags benutzt? 
Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
Super, danke! 
|

25-02-2010, 22:09
|
|
amenz
Registrierter Benutzer
|
|
Registriert seit: Feb 2010
Beiträge: 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:
Zitat:
|
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!
|

25-02-2010, 22:18
|
AmicaNoctis
 Moderatorin
|
|
Registriert seit: Jul 2009
Beiträge: 5.550
|
|
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
__________________
Hast du die Grundlagen zur Fehlersuche gelesen? Hast du Code-Tags benutzt? 
Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
Super, danke! 
|

25-02-2010, 22:39
|
|
amenz
Registrierter Benutzer
|
|
Registriert seit: Feb 2010
Beiträge: 5
|
|
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!
|

25-02-2010, 22:45
|
AmicaNoctis
 Moderatorin
|
|
Registriert seit: Jul 2009
Beiträge: 5.550
|
|
Zitat:
Zitat von amenz
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?
__________________
Hast du die Grundlagen zur Fehlersuche gelesen? Hast du Code-Tags benutzt? 
Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
Super, danke! 
|

26-02-2010, 00:49
|
|
rossixx
Registrierter Benutzer
|
|
Registriert seit: Jul 2003
Ort: Berlin
Beiträge: 461
|
|
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.
|

26-02-2010, 07:52
|
|
amenz
Registrierter Benutzer
|
|
Registriert seit: Feb 2010
Beiträge: 5
|
|
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. =)
|

26-02-2010, 10:14
|
AmicaNoctis
 Moderatorin
|
|
Registriert seit: Jul 2009
Beiträge: 5.550
|
|
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
__________________
Hast du die Grundlagen zur Fehlersuche gelesen? Hast du Code-Tags benutzt? 
Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
Super, danke! 
|

05-03-2010, 07:24
|
|
jcf
Registrierter Benutzer
|
|
Registriert seit: Mar 2010
Beiträge: 4
|
|
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($ch, CURLOPT_URL, 'http://www.zeitung.tld/d/login/login.aspx');
curl_setopt ($ch, CURLOPT_POST, 1); curl_setopt ($ch, CURLOPT_POSTFIELDS, 'usr_login=<benutzer>&usr_pwd=<passwort>'); curl_setopt ($ch, CURLOPT_REFERER, "http://www.zeitung.tld"); curl_setopt($ch, CURLOPT_RETURNTRANSFER,1); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); //curl_setopt($ch, CURLOPT_AUTOREFERER, 1); curl_setopt($ch,CURLOPT_COOKIEFILE,'cookies.txt'); curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookie.txt'); curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
// 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($ch, CURLOPT_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!
Geändert von jcf (05-03-2010 um 11:31 Uhr)
|

05-03-2010, 08:19
|
AmicaNoctis
 Moderatorin
|
|
Registriert seit: Jul 2009
Beiträge: 5.550
|
|
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
__________________
Hast du die Grundlagen zur Fehlersuche gelesen? Hast du Code-Tags benutzt? 
Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
Super, danke! 
Geändert von AmicaNoctis (05-03-2010 um 08:25 Uhr)
|

05-03-2010, 11:41
|
|
jcf
Registrierter Benutzer
|
|
Registriert seit: Mar 2010
Beiträge: 4
|
|
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($ch, CURLOPT_URL, '<login-url>');
curl_setopt($ch, CURLOPT_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 ($ch, CURLOPT_POST, 1);
curl_setopt ($ch, CURLOPT_POSTFIELDS, 'usr_login=<benutzer>&usr_pwd=<passwort>');
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 0);
curl_setopt($ch, CURLOPT_AUTOREFERER, 1);
curl_setopt($ch,CURLOPT_COOKIEFILE,'cookies.txt');
curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookie.txt');
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
// Login Prozess
$store = curl_exec ($ch);
curl_setopt($ch, CURLOPT_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($ch, CURLOPT_URL, $matches[1][2]);
$store3 = curl_exec ($ch);
curl_setopt($ch, CURLOPT_URL, $matches[1][3]);
$store4 = curl_exec ($ch);
curl_setopt($ch, CURLOPT_URL, $matches[1][4]);
$store5 = curl_exec ($ch);
// Seite mit Download-Button aufrufen
curl_setopt($ch, CURLOPT_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, $matches2, PREG_SET_ORDER);
curl_setopt($ch, CURLOPT_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($ch, CURLOPT_URL, $matches3[1][0]);
$fp = fopen('temp.zip', 'w');
curl_setopt($ch, CURLOPT_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;
}
?>
|

05-03-2010, 14:42
|
|
rossixx
Registrierter Benutzer
|
|
Registriert seit: Jul 2003
Ort: Berlin
Beiträge: 461
|
|
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
|
|
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
|
|
|
| Themen-Optionen |
|
|
| Thema bewerten |
|
|
Forumregeln
|
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.
HTML-Code ist aus.
|
|
|
|
PHP News
|