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($chCURLOPT_RETURNTRANSFER1);
  
curl_setopt($chCURLOPT_FOLLOWLOCATION1);
  
curl_setopt($chCURLOPT_POSTTRUE);
  
curl_setopt($chCURLOPT_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($chCURLOPT_RETURNTRANSFER1);
  
curl_setopt($chCURLOPT_FOLLOWLOCATION1);
  
curl_setopt($chCURLOPT_COOKIEJAR"cookie");
  
curl_setopt($chCURLOPT_POSTTRUE);
  
curl_setopt($chCURLOPT_POSTFIELDS$params);
  
curl_setopt($chCURLOPT_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($chCURLOPT_RETURNTRANSFER1);
  
curl_setopt($chCURLOPT_FOLLOWLOCATION1);
  
curl_setopt($chCURLOPT_COOKIEJAR"cookie");
  
curl_setopt($chCURLOPT_COOKIEFILE"tmp");
  
curl_setopt($chCURLOPT_POSTTRUE);
  
$output curl_exec($ch);
  
print_r(curl_getinfo($ch));
  
curl_close($ch);
  print 
"CURL OUTPUT:\n{$output}\n";

?>

このスクリプトでは、COOKIE情報を tmp というファイルに保存して引き継いで います。成功すると、ログイン後のページに続いてポイント使用履歴のページが表示され るはずです。使えるワザですのでぜひ一度試してみてください。

バックナンバーについて

TIPS-MLは、毎週金曜日に更新され、新しい記事が掲載されます。

Tipsꗗy[W 

Pick Up Q&A

Q
ログファイルの中の空のデータ行を削除したい
 このエントリーをはてなブックマークに追加 
A
ログのデータ個数(列数)が固定で、空のログが"<><><>"だと既知であれば if ($line === "<><><>") { continue; } で読み飛ばしてもいいのでは? ...

>>続きを読む

まずは配列や文字列の扱いから、じっくり勉強して行きましょう。

▲解説者:岡本(アシアル株式会社 教育コーディネーター兼 システムエンジニア)

Q&A掲示板 新着情報