PHPでYahoo!Japanにログインする
2012.07.02 PHPでヤフーにログインする - Digitarhythm
こちらでアップデートしました
以下昔の内容です
Yahoo!にはYahoo!デベロッパーネットワーク(YDN)というのがあって、とても便利なのだが、YDNでは取得できない情報を取得したかったのでその時のメモです。ちなみに取得したかったのはヤフーオークションの自分の出品物のウォッチリストとアクセス数、検索キーワードです。これらはログインしたあとページを開かないといけないので、そのためのログインです。
Perlならid:iizukawさんの[perl] ヤフオクの出品商品のアクセス数とかを監視するPerlスクリプトが参考になるかもです。
このページ(PHPのCookieについて質問です。)の内容を参考に作りました。エラーや問題がある場合は教えてもらえると助かります。PEAR::HTTP_requestを使ってます。PEAR::HTTP_request2をつかわなかったのは、参考にしたページから変更を極力加えなかったからです。今後の課題ですね。
ヤフーのページにログインしページソースを取得するクラス
<?php // ディレクトリはPEAR設定に合わせてください require_once 'HTTP/Request.php'; class ScrapYahoo { /** * ログイン処理 */ function login($id, $pw, $referer_url = '') { { $url = 'https://login.yahoo.co.jp/config/login?.src=auc&.intl=jp&.pd=&.partner=&.protoctl=&.done=http%3A//auctions.yahoo.co.jp/jp'; $request =& new HTTP_Request(); // ログインページを開く $request->setURL($url); // ヘッダ設定 $request->addHeader('User-Agent', 'Mozilla/5.0 (Windows; U; Windows NT 6.0; ja; rv:1.9.1.1) Gecko/20090715 Firefox/3.5.1 (.NET CLR 3.5.30729)'); $request->addHeader('Keep-Alive', 115); $request->addHeader('Connection', 'keep-alive'); $request->addHeader('Referer', $url); // HTMLソースの取得 $response = $request->sendRequest(); if (PEAR::isError($response)) { echo $response->getMessage(); exit; } $html = $request->getResponseBody(); // POSTする項目とデータをを取得 preg_match_all('/<input type="hidden" name="(.*?)" value="(.*?)">/', $html, $matches, PREG_SET_ORDER); // 認証ページを開く $request->setURL('https://login.yahoo.co.jp/config/login?'); // ヘッダ設定 $request->addHeader('User-Agent', 'Mozilla/5.0 (Windows; U; Windows NT 6.0; ja; rv:1.9.1.1) Gecko/20090715 Firefox/3.5.1 (.NET CLR 3.5.30729)'); $request->addHeader('Keep-Alive', 115); $request->addHeader('Connection', 'keep-alive'); $request->addHeader('Referer', $url); // POSTデータのセット $request->setMethod(HTTP_REQUEST_METHOD_POST); foreach ($matches as $entry) { $request->addPostData($entry[1], $entry[2]); } // ID $request->addPostdata('login', $id); // パスワード $request->addPostdata('passwd', $pw); // ログイン状態を保存 $request->addPostdata('.persistent', 'y'); // POSTデータの送信 $response = $request->sendRequest(); if (PEAR::isError($response)) { echo $response->getMessage(); exit; } // Cookieの取得 $cookies = $request->getResponseCookies(); if ($cookies) { return $cookies; } else { echo 'Cannot log in.'; exit; } } /** * 各商品ページのHTMLソースの取得 */ function getBody($setURL, $cookies, $referer_url = '') { $request =& new HTTP_Request(); $request->setURL($setURL); // ヘッダ設定 $request->addHeader('User-Agent', 'Mozilla/5.0 (Windows; U; Windows NT 6.0; ja; rv:1.9.1.1) Gecko/20090715 Firefox/3.5.1 (.NET CLR 3.5.30729)'); $request->addHeader('Keep-Alive', 115); $request->addHeader('Connection', 'keep-alive'); $request->addHeader('Referer', $referer_url); // Cookieをセット foreach ($cookies as $cookie) { $request->addCookie($cookie['name'], $cookie['value']); } $response = $request->sendRequest(); if (PEAR::isError($response)) { echo $response->getMessage(); exit; } return $request->getResponseBody(); } } ?>
これをScrapYahoo.class.phpとかいう名前で保存したとして、使うときはこんな感じです。あと、パスワードをphp本文内に書いてるのでセキュリティ的にあれだと思います。
<?php // ディレクトリはお使いの環境に合わせてください require_once 'ScrapYahoo.class.php'; // ログインのための設定 $id = '<使用するYahooID>'; $pass = '<使用するYahooID>'; $referer_url = 'https://login.yahoo.co.jp/config/login?.src=auc&.intl=jp&.pd=&.partner=&.protoctl=&.done=http%3A//auctions.yahoo.co.jp/jp'; // 取得したいページ $setURL = '<取得したいページのURL>'; $ScrapYahoo = new ScrapYahoo.class(); // ログイン後のクッキーの取得 $cookies = $ScrapYahoo->login($id, $pw, $referer_url); // HTMLソースの取得 $html = $ScrapYahoo->getBody($setURL, $cookies, $referer_url); ?> <|| 使用配布は自由ですが、それにおけるいかなる問題も責任はおえませんゆえ。よろしくお願いします。 *t+1*id:fuukenさんのご指摘のとおり、スペル間違いscrap -> scrapeを修正。 Yahoo!には[http://developer.yahoo.co.jp/:title=Yahoo!デベロッパーネットワーク(YDN)]というのがあって、とても便利なのだが、YDNでは取得できない情報を取得したかったのでその時のメモです。ちなみに取得したかったのはヤフーオークションの自分の出品物のウォッチリストとアクセス数、検索キーワードです。これらはログインしたあとページを開かないといけないので、そのためのログインです。 Perlならid:iizukawさんの[http://d.hatena.ne.jp/iizukaw/20080604/p1:title=[perl] ヤフオクの出品商品のアクセス数とかを監視するPerlスクリプト]が参考になるかもです。 [http://q.hatena.ne.jp/1255541518:title=このページ(PHPのCookieについて質問です。)]の内容を参考に作りました。エラーや問題がある場合は教えてもらえると助かります。PEAR::HTTP_requestを使ってます。PEAR::HTTP_request2をつかわなかったのは、参考にしたページから変更を極力加えなかったからです。今後の課題ですね。 **ヤフーのページにログインしページソースを取得するクラス >|php| <?php // ディレクトリはPEAR設定に合わせてください require_once 'HTTP/Request.php'; class ScrapeYahoo { /** * ログイン処理 */ function login($id, $pw, $referer_url = '') { { $url = 'https://login.yahoo.co.jp/config/login?.src=auc&.intl=jp&.pd=&.partner=&.protoctl=&.done=http%3A//auctions.yahoo.co.jp/jp'; $request =& new HTTP_Request(); // ログインページを開く $request->setURL($url); // ヘッダ設定 $request->addHeader('User-Agent', 'Mozilla/5.0 (Windows; U; Windows NT 6.0; ja; rv:1.9.1.1) Gecko/20090715 Firefox/3.5.1 (.NET CLR 3.5.30729)'); $request->addHeader('Keep-Alive', 115); $request->addHeader('Connection', 'keep-alive'); $request->addHeader('Referer', $url); // HTMLソースの取得 $response = $request->sendRequest(); if (PEAR::isError($response)) { echo $response->getMessage(); exit; } $html = $request->getResponseBody(); // POSTする項目とデータをを取得 preg_match_all('/<input type="hidden" name="(.*?)" value="(.*?)">/', $html, $matches, PREG_SET_ORDER); // 認証ページを開く $request->setURL('https://login.yahoo.co.jp/config/login?'); // ヘッダ設定 $request->addHeader('User-Agent', 'Mozilla/5.0 (Windows; U; Windows NT 6.0; ja; rv:1.9.1.1) Gecko/20090715 Firefox/3.5.1 (.NET CLR 3.5.30729)'); $request->addHeader('Keep-Alive', 115); $request->addHeader('Connection', 'keep-alive'); $request->addHeader('Referer', $url); // POSTデータのセット $request->setMethod(HTTP_REQUEST_METHOD_POST); foreach ($matches as $entry) { $request->addPostData($entry[1], $entry[2]); } // ID $request->addPostdata('login', $id); // パスワード $request->addPostdata('passwd', $pw); // ログイン状態を保存 $request->addPostdata('.persistent', 'y'); // POSTデータの送信 $response = $request->sendRequest(); if (PEAR::isError($response)) { echo $response->getMessage(); exit; } // Cookieの取得 $cookies = $request->getResponseCookies(); if ($cookies) { return $cookies; } else { echo 'Cannot log in.'; exit; } } /** * 各商品ページのHTMLソースの取得 */ function getBody($setURL, $cookies, $referer_url = '') { $request =& new HTTP_Request(); $request->setURL($setURL); // ヘッダ設定 $request->addHeader('User-Agent', 'Mozilla/5.0 (Windows; U; Windows NT 6.0; ja; rv:1.9.1.1) Gecko/20090715 Firefox/3.5.1 (.NET CLR 3.5.30729)'); $request->addHeader('Keep-Alive', 115); $request->addHeader('Connection', 'keep-alive'); $request->addHeader('Referer', $referer_url); // Cookieをセット foreach ($cookies as $cookie) { $request->addCookie($cookie['name'], $cookie['value']); } $response = $request->sendRequest(); if (PEAR::isError($response)) { echo $response->getMessage(); exit; } return $request->getResponseBody(); } } ?>
これをScrapeYahoo.class.phpとかいう名前で保存したとして、使うときはこんな感じです。あと、パスワードをphp本文内に書いてるのでセキュリティ的にあれだと思います。
<?php // ディレクトリはお使いの環境に合わせてください require_once 'ScrapeYahoo.class.php'; // ログインのための設定 $id = '<使用するYahooID>'; $pass = '<使用するYahooID>'; $referer_url = 'https://login.yahoo.co.jp/config/login?.src=auc&.intl=jp&.pd=&.partner=&.protoctl=&.done=http%3A//auctions.yahoo.co.jp/jp'; // 取得したいページ $setURL = '<取得したいページのURL>'; $ScrapeYahoo = new ScrapeYahoo.class(); // ログイン後のクッキーの取得 $cookies = $ScrapeYahoo->login($id, $pw, $referer_url); // HTMLソースの取得 $html = $ScrapeYahoo->getBody($setURL, $cookies, $referer_url); ?>
使用配布は自由ですが、それにおけるいかなる問題も責任はおえませんゆえ。よろしくお願いします。