Heute hatte ich den Wunsch, die Inhalte eines kleinen Forums als RSS-Feed anzubieten. Die Umwandlung der Daten in RSS ging mittels Regular Expressions recht einfach, jedoch liegen die Seiten des Forums hinter einer Login-Seite, die Benutzernamen und Passwort in einem HTML-Formular abfragt. Danach wird ein Cookie gesetzt und die Forumsseiten sind zugänglich. Wie kann ich diesen Login-Vorgang nun mit PHP in einem Script durchführen, dass dann per Cronjob automatisch aufgerufen wird?
Eigentlich recht einfach mittels curl. Zunächst gilt es, die Packages zu installieren:
apt-get install curl php5-curl
Danach sollte das folgende Script laufen und die Forenseiten jeweils als HTML-Datei abspeichern:
// die Foren werden über eine einheitliche URL aufgerufen,
// die lediglich den Parameter ID bekommt
$url = "http://adresse.des.forums/forum.php?id=";
// die Foren sollen als HTML-Datei abgelegt werden,
// um später geparst zu werden
$ids = array(
"123" => "Forum123.htm",
"234" => "NochEinForum.htm"
);
$curl = curl_init();
curl_setopt($curl, CURLOPT_HEADER, 0);
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)");
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
// diese Datei wird zum Speichern des Cookies verwendet
curl_setopt($curl, CURLOPT_COOKIEFILE, "cookiefile");
curl_setopt($curl, CURLOPT_COOKIEJAR, "cookiefile");
// der Aufruf der Login-Seite
curl_setopt($curl, CURLOPT_URL, "http://adresse.des.forums/login.php");
// hier müssen die Benutzerdaten eingetragen werden
curl_setopt($curl, CURLOPT_POSTFIELDS, "login=Benutzername&passwort=geheim");
$xxx = curl_exec($curl);
foreach ($ids as $id=>$name)
{
echo "Hole " . $name . "...\n";
// hier wird die URL des Forums zusammengesetzt
curl_setopt($curl, CURLOPT_URL, $url . $id);
$xxx = curl_exec($curl);
file_put_contents("/pfad/zum/script/" . $name, utf8_encode($xxx));
}
curl_close ($curl);
Nun noch den ganzen Kram in die /etc/crontab eingetragen und es kann losgehen (jede dritte Stunde werden die Seiten geladen):
0 */3 * * * root /pfad/zum/script/getPages.php