|
以前からちょくちょくスパムコメントは来ていました。その都度消していましたし、コメントチェッカーなるツールも導入済みです。しかし、Yahoo!ブログにはコメントを承認制にしたり一括削除する機能がないので一度大量にやられてしまうと、消す気も失せてしまいました。 手動でやるから大変なのであって、コメントの一覧を見る画面があってチェックして一括削除ができたり日本語の含まれないコメントは自動消去できればだいぶ楽になるはずです。というわけで少々面倒そうですが作ってみることにしました。 そもそも、通常はどう消すかというとYahoo!ブログにログインした状態で各コメントの下についている×印をクリックして削除します。機械的にやるときも手動のときと同じ通信をすればよいので実現は可能です。(参考:HTTPの生通信に慣れる) まず、コメントの一覧を取得する必要があります。これは全記事のURLを取得してから、コメント部分を正規表現で抜き出してやればよいでしょう。 次に実行環境ですがこれはちょっと迷います。おそらくYahoo!ブログを使っていてスパムコメントに悩まされている人はある程度いると思われるので、使いやすい形が望ましいです。しかし、サーバ側でやろうとするとコメント一覧の取得に時間がかかりそうです。クライアント側で動くアプリならYahoo!ブログへの同時アクセス数とか通信速度をあまり考えなくてよいので比較的早く取得できるでしょう。ログイン用のパスワードもサーバ側で保存するのは抵抗があります。 悩ましいところなので両方用意することにします。 このページはどのYahoo!ブログにもあるのでここから全記事のURLを拾うのが手っ取り早そうです。 今回はバージョン1.6が最近リリースされたZend Frameworkを使います。 <?php
/** * Y!ブログの全記事URLを取得する * * @since 2008.9.15 */ ini_set('include_path', '/usr/local/src/ZendFramework-1.6.0-minimal/library'); require_once 'Zend/Cache.php'; require_once 'Zend/Http/Client.php'; $frontendOptions = array( 'lifetime' => 86400, 'automatic_serialization' => true, ); $backendOptions = array( 'cache_dir' => './tmp/', ); $cache = Zend_Cache::factory('Core', 'File', $frontendOptions, $backendOptions); $client = new Zend_Http_Client; $client->setConfig(array( 'keepalive' => true )); $baseUrl = 'http://blogs.yahoo.co.jp/%s/MYBLOG/yblog.html?m=l&p=%d'; $yahooId = $argv[1]; $urls = array(); $p = 1; do { try { $url = sprintf($baseUrl, $yahooId, $p); $cacheId = md5($url); fwrite(STDERR, $url . "\n"); if (!$result = $cache->load($cacheId)) { $client->setUri($url); $response = $client->request(); $result = mb_convert_encoding($response->getBody(), 'UTF-8', 'EUC-JP'); $cache->save($result, $cacheId); } $c = preg_match_all('@http://blogs\;.yahoo\.co\.jp/' . $yahooId . '/\d+\.html@', $result, $match); for ($i = 0; $i < $c; $i++) { $urls[] = $match[0][$i]; } ++$p; } catch (Exception $e) { fwrite(STDERR, $e->getMessage() . "\n"); } } while (strpos($result, "<a href=\"http://blogs.yahoo.co.jp/$yahooId/MYBLOG/yblog.html?m=l&p=$p\">次のページ</a>") !== false); $urls = array_unique($urls); foreach ($urls as $url) { echo "$url\n"; } ちょっと長くなりましたがこれで全URLが取得できます。 ただ、Yahoo!ブログのレスポンスが悪いので時々全部取得できずに失敗することが。。 実行は以下のようにコマンドラインから。 % php yahoo_blog_article_list.php nob_ll 1>/tmp/nob_ll.txt
公開するときはウェブから実行できるようにまた少し修正します。 各記事のページからコメントを抽出する正規表現を書きます。
|

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





