印刷用表示へ切り替え 通常表示へ切り替え 更新履歴を表示 更新履歴を隠す
DownloadMovableTypePlugin リンク切れチェックプラグイン 0.4

いろいろ直してリリース。使っている Perl モジュールの変更,トラックバック先がある場合にはチェックしない,その他バグ修正など。

■ ■ ■

変更点

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 で参照されるので,これが空の場合は処理をせず,すぐに返すようにした。コードは次の通り。

return $out if (defined($ctx->stash('entry')) && $ctx->stash('entry')->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> タグの属性や要素に,「&amp;, &lt;, &gt;」がある場合,これをデコードして「&, <, >」に変換してしまっていたのを修正。これは重大なバグ。エンティティは変換しないようにした。コードとしては,HTML::Parser から継承しているオブジェクト $p に対し,次のメソッドを追加する (HTML::Parser - HTML parser class - search.cpan.org)。

$p->attr_encoded(1);

まとめ

上記を修正し,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)
Trackbacks

  • 「手違いで複数トラックバックを送ってしまった!」という場合でも気にしないでください (重複分はこちらで勝手に削除させていただきます)
  • タイムアウトエラーは,こちらのサーバの処理能力不足が原因です (詳細は トラックバック送信時のエラー をご覧ください)
  • トラックバックする記事には,この記事へのリンクを含めてください(詳細は 迷惑トラックバック対策 をご覧ください)
Comments
Post a comment
  • 電子メールアドレスは必須ですが,表示されません (気になる場合は「メールアドレスのような」文字列でもOKです)
  • URL を入力した場合はリンクが張られます
  • コメント欄内ではタグは使えません
  • コメント欄内に URL を記入した場合は自動的にリンクに変換されます
  • コメント欄内の改行はそのまま改行となります
  • 「Confirmation Code」に表示されている数字を入力してください (迷惑コメント対策です)


(必須, 表示されます)


(必須, 表示されません)


(任意, リンクされます)


Confirmation Code (必須)


Remember info (R)?