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=&#x5b;perl&#x5d; ヤフオクの出品商品のアクセス数とかを監視する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);
?>

使用配布は自由ですが、それにおけるいかなる問題も責任はおえませんゆえ。よろしくお願いします。