ホリデープログラミング入門

ホリデーにプログラミングを楽しむための入門 by 船木信宏

全体表示

[ リスト ]

http://farm4.static.flickr.com/3280/2638831430_afc0b9108f.jpg

【3】スパムコメントに汚染されたYahoo!ブログを救う


今回の山場であるログイン処理に入ります。
世の中にはログインする必要のあるウェブサービスがたくさんありますが、Yahoo!ブログもそのひとつです。そして現状のブラウザを用いたログインにはCookieが欠かせません。ログイン処理は大まかに
・ログインするフォームの表示
・ユーザ名とパスワードを送信
・ログイン後のページへ
となります。
ユーザ名とパスワードを送信した後、パスワードをいちいち入力することなくログイン後のページを何ページもアクセスできるのは、裏でパスワードの代わりとなるCookieを送信しているからです。ブラウザは勝手にやってくれますが、今回のような自作プログラムでログインする際には自分でCookieの制御をする必要あり、です。

HTTPのやり取りには前回に引き続きZend FrameworkのZend_HTTP_Clientを使います。
出来上がったプログラムは以下のようになりました。コマンドラインから引数にユーザ名とパスワードを与えて実行してみてください。

<?php

ini_set('include_path', '/usr/local/src/ZendFramework-1.6.0-minimal/library');
require_once 'Zend/Http/Client.php';

$client = new Zend_Http_Client;
$client->setConfig(array(
'keepalive' => true,
'useragent' => 'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.0.3) Gecko/2008092414 Firefox/3.0.3',
));
$client->setCookieJar();

// preset
$client->setUri('https://login.yahoo.co.jp/config/login?.src=blog&;.done=http%3A//blogs.yahoo.co.jp/');
$response = $client->request();
$result = mb_convert_encoding($response->getBody(), 'UTF-8', 'EUC-JP');

if (!preg_match('@<form method="post" action="https://login\;.yahoo\.co\.jp/config/login[^>]*>(.*)</form>@s', $result, $match)) {
die("cannot get login parameters.\n");
}
$c = preg_match_all('@<input type="hidden" name="([^"]*)" value="([^"]*)"[^>]*?>@', $match[1], $match);
$params = array();
for ($i = 0; $i < $c; $i++) {
$params[$match[1][$i]] = $match[2][$i];
}
$params['.persistent'] = 'y';
$params['login'] = $argv[1];
$params['passwd'] = $argv[2];

// login
$client->setUri('https://login.yahoo.co.jp/config/login?');
$client->setParameterPost($params);
$client->request('POST');

$client->resetParameters();

$cookieJar = $client->getCookieJar();
$strCookie = '';
foreach ($cookieJar->getAllCookies() as $cookie) {
$strCookie .= $cookie->getName() . "=" . $cookie->getValue() . ";";
}
$client->setCookieJar(false);
$client->setCookie($strCookie);

// logined
$client->setUri('http://blogs.yahoo.co.jp/');
$response = $client->request('GET');
echo $client->getLastRequest(), "\n";
$result = mb_convert_encoding($response->getBody(), 'UTF-8', 'EUC-JP');
echo $result, "\n";

と言いつつこれだけでは動きません。Cookie name cannot contain these characters と例外が発生してしまうはずです。
最初は面倒なCookieの制御はsetCookieJar()を最初に呼ぶだけでOKだろう、と思ったらうまくいきませんでした。
FirefoxのLiveHTTPheadersを使って、ブラウザでログインする際のHTTP通信を見るときのCookieと、プログラムで$client->getLastRequest();で表示されるCookieの内容が異なっていました。よく見るとプログラムの方では=が余計にurlencodeされています。

というわけでsetCookieを使うことに。
しかし上記の例外が出てしまいます。どうもYahoo!ブログのCookieの仕様の方がちょっとおかしいような気がしますが、、仕方ないので Zend/Http/Client.php の620, 621行目をコメントアウトしました。ライブラリを直接変更するのは気持ち悪いですが、urlencodeした状態のCookieだとうまくいかないので仕方ありません。

ちなみにresetParameters()の呼び出しも重要です。これがないと前の引数などが引き継がれていてうまくいきません。
また、実行するPHPはSSLをサポートしている必要があります。( --with-openssl ) これがないとhttpsのページにアクセスできません。

さて最後のechoで出力される文字列の中に自分のYahoo!IDが含まれていれば成功です。

これでだいたいのパーツが揃いました。いよいよスパムコメント削除を実行です。

閉じる コメント(1)

顔アイコン

原因は特定できていないのですが、
時間によって、ログインに失敗することがあるようです。

今も、ログイン処理に失敗しています。

前回(日曜)、同じ現象が起きたときには、
いろいろ調べようとしてもわからず、
そのままにしていたら、
月曜には何事もなかったように、
きちんと削除できたりしました。

情報まで。

2009/5/30(土) 午後 5:15 無宗だ 返信する

コメント投稿

顔アイコン

顔アイコン・表示画像の選択

名前パスワードブログ
絵文字
×
  • オリジナル
  • SoftBank1
  • SoftBank2
  • SoftBank3
  • SoftBank4
  • docomo1
  • docomo2
  • au1
  • au2
  • au3
  • au4
投稿

.


プライバシー -  利用規約 -  メディアステートメント -  ガイドライン -  順守事項 -  ご意見・ご要望 -  ヘルプ・お問い合わせ

Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved.

みんなの更新記事