|
前回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を使っていきます。 |

- >
- コンピュータとインターネット
- >
- インターネット
- >
- その他インターネット





