PHP x cURLでログインが必要なページのHTMLを取得する

f:id:tsubasa123:20170621170607j:plain

こんにちは、つばさ(@tsubasa123)です。

ちょっと備忘録。プログラム要素高めでお届けします。あんまり面白い内容ではございません、が、気になってる人もいるかもですので綴っておきます。

ログインが必要なページの情報が欲しい

もうタイトルそのままなんですが、ログインが必要なページに掲載されている情報をシステムで扱いたかったんですよね。具体例を申し上げますと、はてなフォトライフで管理されている、ブログで利用している画像を一括してダウンロードしたい。

ググればいくつかやり方は出てくるんですがどうもうまくいかなくて。情報が古いのか、はてな運営が仕様を変更したのか、原因まではわかりませんが、ログインしてからじゃないとページの情報(RSSの情報)を取得できないようになってしまったのかな。さて、どうしたものか。

ログインしてからリクエストすればいい

PHPではcURLというコマンドを組み込みの関数を介して実行することができます。これを使えばできるはず。

qiita.com

やり方はこちらのサイトがわかりやすかったかな。ログイン情報は基本的にブラウザのCookieに保存されているはずなので、一回目のリクエストでログイン情報を送信してその情報をブラウザのかわりにサーバ側で保存。二回目のリクエストでその情報を利用してログイン済みのユーザが閲覧できるコンテンツにアクセス。

天才のそれですね。

ちょっと雑ですが

動くことは動く、と。

<?php
class CurlParser {
private $loginUri = 'https://www.hatena.ne.jp/login';
private $targetUri = 'http://f.hatena.ne.jp/tsubasa123/Hatena%20Blog/rss';
private $tmpCookie;
private $user;
private $password;
public function __construct($user, $password) {
$this->init($user, $password);
}
private function init($user, $password) {
$this->user = $user;
$this->password = $password;
$this->tmpCookie = tempnam(sys_get_temp_dir(), 'CKI');
$this->setCookie();
}
public function run() {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $this->targetUri);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_COOKIEFILE, $this->tmpCookie);
curl_setopt($ch, CURLOPT_COOKIEJAR, $this->tmpCookie);
$html = curl_exec($ch);
curl_close($ch);
print_r($html);
}
private function setCookie() {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $this->loginUri);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt(
$ch,
CURLOPT_POSTFIELDS,
http_build_query(
array(
'name' => $this->user,
'password' => $this->password
)
)
);
curl_setopt($ch, CURLOPT_COOKIEFILE, $this->tmpCookie);
curl_setopt($ch, CURLOPT_COOKIEJAR, $this->tmpCookie);
curl_exec($ch);
curl_close($ch);
}
}
$cp = new CurlParser('user', 'password'); // ここにはてなのログイン情報
$cp->run();

これを応用すればはてなフォトライフに登録した画像を全て取得する処理の完成です。ちなみに私のブログでは357枚の画像が3サイズにリサイズされていました。約1,000枚ですね、まぁ手作業ではちょっとしんどいかな。

さいごに

なんでこんなことをしたかというと、なんかツイッターで皆さまがSSL関連の話で盛り上がっていたからです。備えあれば患いなしですね。この辺をうまくこねくり回してあれしたりこれしたりできるようになれば、いざという時にデータロスで困ることは回避できるようになります。

ここがクリアできたのでまぁ勝ち戦ですね、大満足の一日でした。はてな運営さん、SSL対応もお願いします。

ではでは、最後までお付き合いいただきありがとうございました。