PHPプロ!TIPS+
CURLのセッションを引き継ぐ方法
WebサイトのHTML情報を取得する際にcurlを使用することがあります。curlとはWebブラウザのコマンドライン版のようなもので、与えられたコマンドを元にページ情報を取得する機能です。curlを使用すれば、ログインフォームにPOSTでデータを渡してログイン 処理を行い、ログイン後のページ情報を取得するようなことも可能です。ですが、ログイン処理を行った後、ログイン後にしか行けないような別のページの情報を取得しようとすると、セッションが引き継げずHTMLが取得できない場合があります。今回はそのような場合に対処する方法をお教えします。
まずは、curlを使用してログイン処理を行い、ログイン後のページを表示するスクリプトです。ここではPHPプロ!にログインする処理を記述しています。
<?php
$params = array(
"login-name" => "name",
"login-pass" => "pass"
"submit" => "ログイン",
);
$ch = curl_init("http://www.phppro.jp/members/login.php");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_POST, TRUE);
curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
$output = curl_exec($ch);
curl_close($ch);
print $output;
?>
これが成功すると、ログイン後のページが出力されるはずです。「PHPプロ!」メンバーページへようこそ! の文字が表示されていると思います。
それでは次は、ログイン後に別のページに遷移し、そのページのHTMLを取得するスクリプトを書いて見ましょう。ここではPHPプロ!にログイン後にポイント使用履歴のページを取得するスクリプトを作成しています。
<?php
$params = array(
"login-name" => 'nakamuraya',
"login-password" => 'gerogero',
"submit" => "ログイン"
);
$fp = fopen("tmp", "w");
$ch = curl_init("http://www.phppro.jp/members/login.php");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_COOKIEJAR, "cookie");
curl_setopt($ch, CURLOPT_POST, TRUE);
curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
curl_setopt($ch, CURLOPT_WRITEHEADER, $fp); $
output = curl_exec($ch);
fclose($fp); curl_close($ch);
print "CURL OUTPUT:\n{$output}\n";
$ch = curl_init("http://www.phppro.jp/members/history.php");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_COOKIEJAR, "cookie");
curl_setopt($ch, CURLOPT_COOKIEFILE, "tmp");
curl_setopt($ch, CURLOPT_POST, TRUE);
$output = curl_exec($ch);
print_r(curl_getinfo($ch));
curl_close($ch);
print "CURL OUTPUT:\n{$output}\n";
?>
このスクリプトでは、COOKIE情報を tmp というファイルに保存して引き継いで います。成功すると、ログイン後のページに続いてポイント使用履歴のページが表示され るはずです。使えるワザですのでぜひ一度試してみてください。
バックナンバーについて
TIPS-MLは、毎週金曜日に更新され、新しい記事が掲載されます。
まずは配列や文字列の扱いから、じっくり勉強して行きましょう。