いろいろ直してリリース。使っている Perl モジュールの変更,トラックバック先がある場合にはチェックしない,その他バグ修正など。
前のバージョンでは,リンク先のチェックに,HTTP::SimpleLinkChecker を使用していたが (nlog(n): リンク切れチェックプラグイン 0.3),これを止め,LWP::UserAgent を使うようにした。LWP::UserAgent は,Movable Type のオプションモジュールだからである (必要インストール環境、動作環境 | Movable Type 4 ドキュメント)。オプションの Perl モジュールは,mt-check.cgi でチェックされる。MT 2.661 でもインストールが推奨されている。
Encode モジュールは,Perl 5.8.0 より標準となったので (Jcode.pm),必要なモジュールの記述からは外した。
直前に HTTP でアクセスすると,トラックバックを拒否するサイトがある。これは,迷惑トラックバックが「短い時間間隔で連続アクセス」をするという性質を判断材料にしている。このプラグインを使うと,トラックバックの直前に HTTP アクセスをしてしまうため,連続アクセスになってしまい,トラックバックに失敗してしまうのである。そこで,トラックバック先がある場合は,記事内のすべてのリンクをチェックしないことにした。連続アクセスを迷惑トラックバックと判断するのは SpamLookup プラグインかも知れない。詳しい記事がある (hxxk.jp - Movable Type の HTTP error: 403 Throttled に関するまとめ)。
トラックバック先は,to_ping_urls で参照されるので,これが空の場合は処理をせず,すぐに返すようにした。コードは次の通り。
「defined($ctx->stash('entry')」は,テンプレートが個別記事でない場合でも動作するようにするためのチェックである。個別記事でない場合は,to_ping_urls が存在しないので,to_ping_urls をチェックしないようにしている。
前のバージョンでは,タイムアウトを設定しなかったため,デフォルトの 180 秒となっていた (LWP::UserAgent - Web user agent class - search.cpan.org)。前のバージョンで使っていた HTTP::SimpleLinkChecker のオブジェクトは LWP::UserAgent から継承されているので,タイムアウトの設定方法は同じになる。リンク切れのサイト1つにつき3分間待つのは長すぎなので,5秒にした。
前バージョンでは,HTTP リターンコードを調べ,400 以上であれば「リンク切れ」と判定していた。今回のバージョンでは,LWP::UserAgent が is_error のときに「リンク切れ」であると判定するように変更した。
バージョン0.3 には,それほど重要ではないが,既知のバグがあった。プラグイン紹介のページには次のように示していた。
リンク切れの場合,問答無用に「class="badlink"」を追加します。もともと何かの class 属性がある場合でも,その後に別に class 属性を追加してしまいます。'a' タグ内に class 属性がない場合は問題ありません。
これを修正した。例えば,<a> タグ内に class="someclass" という記述があり,このリンクが切れている場合は,class="someclass badlink" となるようにした。ただし,class="badbadlink" のように「badlink」を含む文字列がある場合は,「badlink」を追加しないというバグは残る。しかし,これはさらに重要度は低いだろうから無視の方向で。
バグは修正したが,コードが汚くなってしまった。もっと美しく書けるといいのだが。
<a> タグの属性や要素に,「&, <, >」がある場合,これをデコードして「&, <, >」に変換してしまっていたのを修正。これは重大なバグ。エンティティは変換しないようにした。コードとしては,HTML::Parser から継承しているオブジェクト $p に対し,次のメソッドを追加する (HTML::Parser - HTML parser class - search.cpan.org)。
上記を修正し,BadLinkFinder plugin 0.4 としてリリースする (nlog(n) - リンク切れチェックプラグイン)。
動作確認は,MT 2.661, EUC-JP の環境と,MTOS 4.1, UTF-8 の環境で行った。MTOS 4.1 では,システムプラグインとして動作する。
Posted by n at 2008-02-25 23:17 | Edit | Comments (0) | Trackback(0)
Master Archive Index
Total Entry Count: 1957