【PHP】file_get_contents関数でセッションやCOOKIEを送信する
file_get_contents関数を使って相手ページにセッションやCOOKIEを持ってアクセスする方法をまとめています。
これを活用すると、ログインが必要なサイトや複次的なアクセスをしないと得られないコンテンツを取得することが可能になります。
セッションやCOOKIEを送信
file_get_contents関数でセッションやCOOKIEを送信するには次のようなコードを書けばOKです。
<?php
//初回アクセス
//コンテンツ取得先
$url = "";
//ヘッダーの設定
$header = array(
"Content-Type: application/x-www-form-urlencoded",
);
//オプション設定
$options =array(
'http' =>array(
'method' => "GET",
'header' => implode("\r\n", $header),
)
);
//コンテンツ取得
$contents = file_get_contents($url, false, stream_context_create($options));
//2回目のアクセス
//COOKIE情報を格納する配列を定義
$array_cookie = array();
//レスポンスヘッダーからCOOKIE情報を取り出して一つずつ配列に格納する
foreach($http_response_header as $value){
if(preg_match( "/Set-Cookie: (.*?);/", $value, $matches)){
$array_cookie[] = "Cookie: {$matches[1]}";
}
}
//コンテンツ取得先
$url = "";
//ヘッダーの設定
$header = array(
"Content-Type: application/x-www-form-urlencoded",
);
//ヘッダーにCOOKIE情報を追加
$header = array_merge($header, $array_cookie);
//オプション設定
$options =array(
'http' =>array(
'method' => "GET",
'header' => implode("\r\n", $header),
)
);
//コンテンツ取得
$contents = file_get_contents($url, false, stream_context_create($options));
//出力
print_r($contents);
?>
このコードをみてわかるように、処理の流れが複雑なので、なるべく簡単にして流れを追っていきたいと思います。
概要
まず処理の流れをまとめるとこのようになります。
- 初回アクセス
file_get_contents関数で相手ページ①にアクセスする - 相手側ページ①
アクセスしてきたユーザーにセッションやCOOKIEを渡す - 2回目アクセス
渡されたセッションIDやCOOKIEを抽出して、それを保持して相手ページ②にアクセスする - 相手側ページ②
アクセスしてきたユーザーのセッションやCOOKIEを表示する
文章だと頭に入ってこないので図示します。
※実際は相手側ページは一つの場合が多いですが、ここでは説明上分けます
セッションやCOOKIEを受け取る
まずは画像の上半分の処理を順に説明していきます。
自分側のコード
自分側には次の2つの処理を行うコードを記述します。
- file_get_contents関数で相手側にアクセスする
- アクセス後にレスポンスヘッダー($http_response_header)を確認する
<?php
//コンテンツ取得先
$url = "";
//ヘッダーの設定
$header = array(
"Content-Type: application/x-www-form-urlencoded",
);
//オプション設定
$options =array(
'http' =>array(
'method' => "GET",
'header' => implode("\r\n", $header),
)
);
//コンテンツ取得
$contents = file_get_contents($url, false, stream_context_create($options));
//レスポンスヘッダーの確認
print_r($http_response_header);
?>
相手側ページ①のコード
相手側ページ①にはアクセスがあった場合にセッションとCOOKIEを発行するコードを書きます。
<?php
//セッションスタート
session_start();
//セッション設定
$_SESSION["sports1"] = "soccer";
$_SESSION["sports2"] = "baseball";
//セッションエンド
session_write_close();
//COOKIEの設定
setcookie("fruits1", "banana", time()+60*60*24);
setcookie("fruits2", "orange", time()+60*60*24);
?>
これをみるとわかるように、アクセスしてきたユーザーには次の情報を渡します。
- セッション名「sports1」、値「soccer」
- セッション名「sports2」、値「baseball」
- COOKIE名 「fruits1」、値「banana」
- COOKIE名 「fruits2」、値「orange」
実際の場合、セッション情報はサーバー内で保管し、相手にはセッションIDのみ渡すので次のようになります。
- セッションID(ランダムな文字列)
- COOKIE名 「fruits1」、値「banana」
- COOKIE名 「fruits2」、値「orange」
ここまでを実行
実際に、自分側→相手側へアクセスすると、レスポンスヘッダーには次の情報が入ります。
Array
(
[0] => Cookie: PHPSESSID=bakokni5ade6qhh13ag8s3aj92
[1] => Cookie: fruits1=banana
[2] => Cookie: fruits2=orange
)
つまり、file_get_contents関数でセッションやCOOKIEを送信するには、次のアクセス(2回目のアクセス)で上の情報を保持してアクセスする必要があります。
セッションやCOOKIEを保持してアクセスする
次に、画像の下半分の処理を説明します。
自分側のコード(追記)
セッションやCOOKIEを保持してアクセスする方法ですが、自分側に次のコードを追記します。
<?php
//COOKIE情報を格納する配列を定義
$array_cookie = array();
//レスポンスヘッダーからCOOKIE情報を取り出して一つずつ配列に格納する
foreach($http_response_header as $value){
if(preg_match( "/Set-Cookie: (.*?);/", $value, $matches)){
$array_cookie[] = $matches[1];
}
}
//コンテンツ取得先
$url = "https://2pqq.c.time4vps.cloud/000program/ysklog-tool/test/index3.php";
//ヘッダーの設定
$header = array(
"Content-Type: application/x-www-form-urlencoded",
);
//ヘッダーにCOOKIE情報を追加
if(count($array_cookie) >= 1) $header[] = "Cookie: " . implode("; ", $array_cookie);
//オプション設定
$options =array(
'http' =>array(
'method' => "GET",
'header' => implode("\r\n", $header),
)
);
//コンテンツ取得
$contents = file_get_contents($url, false, stream_context_create($options));
//出力
print_r($contents);
?>
相手側ページ②のコード
相手側ページ②には送信されてきたセッション情報とCOOKIEを出力するコードを書きます。
<?php
//セッションスタート
session_start();
//セッションエンド
session_write_close();
echo "<p>【セッション一覧】</p>";
print_r($_SESSION);
echo "<p>【COOKIE一覧】</p>";
print_r($_COOKIE);
?>
ここまでを実行
ここまでを実行すると、しっかりと相手側にセッションIDとCOOKIEを送信できていることがわかります。
【セッション一覧】
Array
(
[sports1] => soccer
[sports2] => baseball
)
【COOKIE一覧】
Array
(
[PHPSESSID] => an7s7tmg9vlan9ai64pbimt195
[fruits1] => banana
[fruits2] => orange
)
以上、簡単にfile_get_contents関数でCOOKIE(セッションID含む)を送信する方法でした。
あわせて読んでほしい!
コメント
2:みやびプリン:2021/12/03 13:35:35
$http_response_header
の定義が記載されていないので、
当ソースコードはエラーとなります。
$http_response_headerの定義も記載してください。
1:名無しさん:2020/10/30 19:03:53
管理人様。
こんばんは、「ツイートの一括削除ツール」を使わせていただいているものです。
素敵なツールを開発して下さり大変Twitterで活動するのが快適になり、管理人様には大変感謝しております。
その「ツイートの一括削除ツール」なのですが、今年5月頃からJavaScriptファイルをアップロード仕様とすると正常に処理されない状況が続いており、先ほどはツールを開いた瞬間「データ通信に失敗しました。もう一度お試しください」のメッセージがポップアップで表示され、延々リロードが続き、コメント欄へのアクセスやサイト内の他のページへのジャンプすらままならない状況となっております。
私が昨年こちらのツールを利用した際にはエラーは発生せず、皆様のコメントと個人の実感ですと今年5月からJavaScriptの正常アップロードができず、9、10月には延々リロードの状態になったように感じます。
7月、8月に管理人様のTwitterへご報告させていただいていたのですが、つい最近ブログの更新をされておりましたので再度こちらにてご連絡させていただきました。
大変便利なツールで、私含め利用の再会を待ち望んでいる方も多くおられると思います。
管理人様もお忙しい中大変恐縮ですが、ご返答の方何卒よろしくお願いいたします。
長文失礼いたしました。