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

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

全体表示

[ リスト ]


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


残念なことに現在当ブログはスパムコメントだらけです。
例えばこのページ

以前からちょくちょくスパムコメントは来ていました。その都度消していましたし、コメントチェッカーなるツールも導入済みです。しかし、Yahoo!ブログにはコメントを承認制にしたり一括削除する機能がないので一度大量にやられてしまうと、消す気も失せてしまいました。

手動でやるから大変なのであって、コメントの一覧を見る画面があってチェックして一括削除ができたり日本語の含まれないコメントは自動消去できればだいぶ楽になるはずです。というわけで少々面倒そうですが作ってみることにしました。

ざっくりとした完成イメージを思い描く


そもそも、通常はどう消すかというとYahoo!ブログにログインした状態で各コメントの下についている×印をクリックして削除します。機械的にやるときも手動のときと同じ通信をすればよいので実現は可能です。(参考:HTTPの生通信に慣れる

まず、コメントの一覧を取得する必要があります。これは全記事のURLを取得してから、コメント部分を正規表現で抜き出してやればよいでしょう。

次に実行環境ですがこれはちょっと迷います。おそらくYahoo!ブログを使っていてスパムコメントに悩まされている人はある程度いると思われるので、使いやすい形が望ましいです。しかし、サーバ側でやろうとするとコメント一覧の取得に時間がかかりそうです。クライアント側で動くアプリならYahoo!ブログへの同時アクセス数とか通信速度をあまり考えなくてよいので比較的早く取得できるでしょう。ログイン用のパスワードもサーバ側で保存するのは抵抗があります。

悩ましいところなので両方用意することにします。

全記事のURLを取得



このページはどの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

公開するときはウェブから実行できるようにまた少し修正します。

次回


各記事のページからコメントを抽出する正規表現を書きます。

閉じる コメント(0)

コメント投稿

顔アイコン

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

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

.


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

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

みんなの更新記事