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

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

全体表示

[ リスト ]

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


前回Yahoo!ブログへのログイン処理をプログラムで自動化しました。プログラムを書いているとき、さすがに1回でうまくいったわけではなく何度も失敗してやり直しました。どうやらそれが原因で、今日普通にブラウザでログインしようとしたら「不正なアクセスがあった可能性があるのでパスワードを変更してください」というメッセージが出ました。さすがYahoo!、しっかりしています。

さて、今回は試しに1つスパムコメントを削除してみます。

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

$url = $argv[1]; // an article url
$username = $argv[2];
$password = $argv[3];

$comments = array();

try {
$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',
'timeout' => 120,
));

// === login ===

$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'] = $username;
$params['passwd'] = $password;

// 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);

fwrite(STDERR, "login complete.\n");

$client->setUri($url);
$response = $client->request('GET');
$result = mb_convert_encoding($response->getBody(), 'UTF-8', 'EUC-JP');
echo "last: ", $client->getLastRequest(), "\n";
$c = preg_match_all('@<p class="comentBody">(.*?)<a href="javascript:void\(0\)" onClick="javascript:del_cmt3\((\d+),(\d+),(\d+),@s', $result, $match);
for ($i = 0; $i < $c; $i++) {
$comments[] = array('body' => $match[1][$i], 'pid' => $match[2][$i], 'id' => $match[3][$i], 'fid' => $match[4][$i]);
}
//echo "result: $result\n";
if (!preg_match('@var jscrumb\s*= \'(.*?)\';@', $result, $match)) {
throw new Exception("crumb does not find.");
}
$crumb = $match[1];
fwrite(STDERR, "crumb: $crumb\n");
print_r($comments[0]);

// delete a comment
$client->resetParameters();
$client->setUri("http://post.blogs.yahoo.co.jp/{$username}/MYBLOG/delete.html");
$client->setConfig(array('maxredirects' => 0));
$client->setParameterGet(array(
'sopt' => 'cmt',
'fid' => $comments[0]['fid'],
'id' => $comments[0]['id'],
'pid' => $comments[0]['pid'],
'p' => &&,
'update' => 1,
'm' => &&,
'crumb' => $crumb,
's' => 'art_cmt',
'.done' => $url,
));
$client->setHeaders('Referer', $url);
$response = $client->request('GET');
echo "last: ", $client->getLastRequest(), "\n";
//echo "body: ", mb_convert_encoding($response->getBody(), 'UTF-8', 'EUC-JP'), "\n";
//var_dump($response->getHeaders());
if ($response->getHeader('Location') != '') {
echo "OK!\n";
} else {
throw new Exception("cannot delete a comment.");
}


} catch (Exception $e) {
fwrite(STDERR, $e->getMessage() . "\n");
fwrite(STDERR, $e->getTraceAsString() . "\n");
}

引数にコメントのある記事URLとログイン名、パスワードを渡して実行します。
今までのソースに若干バグもありました。

あとこの部分は下手にキャッシュを取ると動かなくなります。そのせいでコメント削除に失敗してずいぶん時間を食ってしまった。。
JavaScriptも多少は見て、削除時の通信を忠実に再現しているだけです。

ソース全体の解説は出来上がってからにするとしましょう。
これでコメントの削除もできるようになったので、インターフェイスを整えていきます。今まではデバッグのしやすさからコマンドライン上で作業しましたが、次からはウェブのformを使っていきます。

閉じる コメント(0)

コメント投稿

顔アイコン

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

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

.


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

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

みんなの更新記事