重複トラックバック防止プラグイン(3.3版)
同一エントリーへの重複トラックバックを抑止するプラグインです。
Movable Type は、バージョン 3.2 まで重複トラックバックに対する制御は行われていませんでしたが、3.3 以降、 重複トラックバック(送信元URL・タイトル・概要が同一のトラックバック)を受信した場合、その内容を過去に受信したトラックバックに上書きするよう、処理が変更されました。
追加された処理は、トラックバック送信後に送信元記事のタイトルあるいはトラックバックの概要を変更してトラックバックを再送信するようなケースを考えた場合、非常に有効です。
現在「重複トラックバック防止プラグイン」を公開しておりますが、上記の理由で 3.3 では重複トラックバック防止プラグインが不要となりました。
ただし、全く同一の内容が再送信された場合ー例えば初回のトラックバック送信がタイムアウトになり(送信が完結しないと Movable Type では「トラックバック送信先のURL」にデータが残ります)、エントリーを再保存(つまり再送信)してしまったケース等ーでも上書き処理が行われ、再構築が発生します。
本プラグインは、内容が全く同一のトラックバックのみをフィルタリングし、再構築を発生させないことを目的としたものです。 *1
1.プラグインのダウンロード
下記の duplicateTBPingThrottlefilter.zip または duplicateTBPingThrottlefilter.lzh をダウンロードしてください。
duplicateTBPingThrottlefilter.zip
duplicateTBPingThrottlefilter.lzh
2.プラグインのアップロード
ダウンロードしたアーカイブを解凍してください。解凍すると中に duplicateTBPingThrottlefilter フォルダがありますので、Movable Type の plugins ディレクトリにフォルダごとアップロードしてください。
アップロード後、管理画面の
メイン・メニュー > システム・メニュー > プラグイン
の画面に利用中のプラグイン一覧が表示されますので、その中に「Duplicate Trackback Ping Throttle Filter Plugin ?」が表示されていればOKです。
3.設定
特にありません。2項でプラグインが表示されていれば有効です。
4.ログ
トラックバックがフィルタリングされた場合、ログに
Filter duplicate trackback ping from the following URL:http://?
というメッセージを出力します。
*1:というのは建前で、「過去に作った重複トラック防止バックプラグインを無駄にしたくない」というのが本音。
Movable Type 3.31-ja の重複トラックバック処理について
当サイトで配布中の duplicateTBPingfilter が Movable Type 3.31 に適用可能かどうか、トラックバック処理を調べてみました。
lib/MT/App/Trackback.pm のトラックバック受信処理を見ると、
sub ping {
:
(略)
:
my $ping;
# Check for duplicates...
my @pings = MT::TBPing->load({ tb_id => $tb->id });
foreach (@pings) {
if ($_->source_url eq $url) {
return $app->_response() if $_->is_junk;
if ($app->remote_ip eq $_->ip) {
$ping = $_;
last;
} else {
# return success to quiet this pinger
return $app->_response();
}
}
}
if (!$ping) {
$ping ||= MT::TBPing->new;
$ping->blog_id($tb->blog_id);
$ping->tb_id($tb_id);
$ping->source_url($url);
$ping->ip($app->remote_ip || '');
$ping->junk_status(0);
$ping->visible(1);
}
:
(略)
:
というコードが新たに追加されており、送信元URLが同一のトラックバックについては、受信済の同一URLのトラックバックデータに上書きしています。
例えば、自ブログのあるエントリーで
- タイトル:今日は暑かった
- 概要:東京都心は36.1度と今年最高を記録しました。
- 送信元URL:http://hogehoge/2006/07/post.html
というトラックバックを受信済の状態で、
- タイトル:今年最高気温
- 概要:静岡県浜松市で38.4度を観測しました。
- 送信元URL:http://hogehoge/2006/07/post.html
というトラックバックを新たに受信すると、先のトラックバックは後のトラックバックの内容で上書きされます。そして最初のトラックバックのタイトルと概要は
- タイトル:今年最高気温
- 概要:静岡県浜松市で38.4度を観測しました。
という内容に置き代わります。内容の相違に関わらず、送信元URLが同一であれば一律上書きを行い、トラックバック処理を続行します。
duplicateTBPingfilter は受信済のトラックバックと新たに受信したトラックバックを比較して重複を判断していますが、Movable Type で旧トラックバックに上書きしてしまうため、比較自体ができなくなり、つまり 3.3 以降は不要となります。アップグレードによって登録されたままの場合でも特に問題ありませんが、トラックバック検索処理が動作するため、外しておくことを推奨します。
エントリー・アーカイブで同一カテゴリーのトラックバックを表示する
Movable Type のエントリー・アーカイブで同一カテゴリーのトラックバックだけを表示するカスタマイズです。ご質問を頂きましたので本エントリーにて紹介致します。
基礎知識として、エントリー・アーカイブで MTPings タグを普通に利用するだけでは、該当エントリーのトラックバックしか表示されません(アーカイブページに「最近のコメント」「最近のトラックバック」を表示する参照)。そういう訳でプラグインをいくつか試してみましたが、そのまま使うことで表示を満足するものはありませんでした(あったらすいません)。
で、自分でプラグインを作成するスキルもないので、勝手ながら Ogawa::memoranda さんの Recently pinged on Plugin を下記の通り改変させて頂き、表示させることができました。
プラグイン:Recently pinged on Plugin
改変内容:エントリー・アーカイブで同一カテゴリーのトラックバックだけを表示する
プラグインのダウンロード、インストール等につきましては配布元の記事を参照ください。
1.プラグインの修正
recently-pinged-on.pl に下記のパッチをあててください。パッチ適用前にファイルのタブ文字を半角空白8文字に変換してください。
--- recently-pinged-on.pl.bak Tue May 30 01:14:15 2006
+++ recently-pinged-on.pl Tue May 30 01:16:35 2006
@@ -41,7 +41,7 @@
my $blog_id = $ctx->stash('blog_id');
my ($start, $end) = ($ctx->{current_timestamp},
$ctx->{current_timestamp_end});
- my $cat = $ctx->stash('archive_category');
+ my $cat = $ctx->{current_archive_type} eq 'Individual' ? $ctx->stash('entry')->category : $ctx->stash('archive_category');
require MT::TBPing;
my $iter = MT::TBPing->load_iter({ blog_id => $blog_id },
@@ -63,6 +63,7 @@
my $entry = MT::Entry->load($entry_id) or next;
next if $entry->status != MT::Entry::RELEASE();
+ next if !$cat && $ctx->{current_archive_type} eq 'Individual';
next if $cat && !$entry->is_in_category($cat);
next if $start && $end && ($entry->created_on < $start || $entry->created_on > $end);
パッチの利用方法が分からない方は、下記の recently-pinged-on.pl の抜粋を参考に、赤色部分を削除して青色の行を追加してください。*1
:
my $blog_id = $ctx->stash('blog_id');
my ($start, $end) = ($ctx->{current_timestamp},
$ctx->{current_timestamp_end});
my $cat = $ctx->stash('archive_category');
my $cat = $ctx->{current_archive_type} eq 'Individual' ? $ctx->stash('entry')->category : $ctx->stash('archive_category');
:
(中略)
:
require MT::Entry;
my $entry = MT::Entry->load($entry_id) or next;
next if $entry->status != MT::Entry::RELEASE();
next if !$cat && $ctx->{current_archive_type} eq 'Individual';
next if $cat && !$entry->is_in_category($cat);
next if $start && $end && ($entry->created_on < $start || $entry->created_on > $end);
:
一応確認したつもりですが、改変内容に不備(他のアーカイブで仕様通りに動作しない等)がございましたらご指摘ください。
2.テンプレートの設定
エントリー・アーカイブのサイドバーの任意の位置に「最近のトラックバック」を表示する下記のタグを設定します。これまで表示していた「最近のトラックバック」のタグは削除してください。
あまり差異はありませんが、デフォルトテンプレートと公開テンプレートの2種類を挙げておきます。
2.1 デフォルトテンプレートの場合
<div class="module-archives module">
<h2 class="module-header">Entries of this Category</h2>
<div class="module-content">
<MTEntries recently_pinged_on="5">
<a href="<$MTEntryLink$>"><$MTEntryTitle$></a>
<ul>
<MTPings lastn="5">
<li><a href="<$MTPingURL$>" rel="nofollow"><$MTPingTitle$></a><br />
[<$MTPingBlogName$>] <$MTPingDate format="%m/%d %X"$></li>
</MTPings>
</ul>
</MTEntries>
</div>
</div>
2.2 公開テンプレートの場合
<div class="sidetitle">
Recent Comments
</div>
<div class="side">
<MTEntries recently_pinged_on="5">
<a href="<$MTEntryLink$>"><$MTEntryTitle$></a>
<ul>
<MTPings lastn="5">
<li><a href="<$MTPingURL$>" rel="nofollow"><$MTPingTitle$></a><br />
[<$MTPingBlogName$>] <$MTPingDate format="%m/%d %X"$></li>
</MTPings>
</ul>
</MTEntries>
</div>
*1:色覚障害等で色が識別できない場合は、サイト右上の「Styles」メニューにある Gray Scale をクリックしてください。IEではグレースケール表示され、青色部分が下線表示、赤色部分が二重下線で表示されます。Firefox/Opera ではカラー表示のままですが下線表示に切り替わります。なお設定の都合上、リンクとテキスト表示が判断できなくなりますので予めご容赦ください。
label 要素を用いてトラックバックURLを1クリックで選択状態にする
Tag:[Customize, JavaScript, label, MovableType, TrackbackURL, Usability, XHTML]
Permalink
個別エントリーアーカイブに表示されたトラックバックURLを、ドラッグせずに1クリックで選択する方法は既にスタンダードなカスタマイズとして確立していますが、label 要素を加えてさらに取得しやすくしてみました。label 要素は、それで括られた説明文をクリックした時やアクセスキーを押した時、本来の部分をクリックした時と同じ動作をさせる働きをもっています。
デフォルトテンプレートにおけるトラックバックURL表示のHTMLタグは下記のようになっています。
<h2 id="trackbacks">トラックバック</h2>
<p class="techstuff">このエントリーのトラックバックURL:<br />
<$MTEntryTrackbackLink$></p>
このタグでは下のような表示になり、トラックバックURLをコピーする場合、マウスでドラッグする必要があります。
- トラックバック
- このエントリーのトラックバックURL:
- http://www.koikikukan.com/cgi-bin/blog/koikikukan/mt-tb.cgi/1216
このタグに対してURL表示部分を input 要素に変更し、さらに onfocus イベントを加えて1クリックでURL全体が選択できるようにします。
<h2 id="trackbacks">トラックバック</h2>
<p class="techstuff">このエントリーのトラックバックURL:<br />
<input tabindex="1" accesskey="x" name="tb_url" value="<$MTEntryTrackbackLink$>" readonly="readonly" onfocus="this.select()" /></p>
ここまでが従来のカスタマイズで、テキストエリアのURLを1クリックで選択状態にすることができます。ここでは省略していますがIEのみ有効なコピーボタンをつけるというカスタマイズもあります。
- トラックバック
- このエントリーのトラックバックURL:
input 要素には name 属性が必要です。また tabindex 属性と accesskey 属性の付与が推奨されています。
ここからさらに input 要素に任意の id 属性を追加し、その id 属性を指定する label 要素で説明文「このエントリーのトラックバックURL:」を括ります。
<h2 id="trackbacks">トラックバック</h2>
<p class="techstuff"><label for="tb_url">このエントリーのトラックバックURL:</label><br />
<input tabindex="1" accesskey="x" name="tb_url" id="tb_url" value="<$MTEntryTrackbackLink$>" readonly="readonly" onfocus="this.select()" /></p>
これで「このエントリーのトラックバックURL:」の部分をクリックしても選択状態にできるようになります。
- トラックバック
URLの周囲に他の説明文を加えている場合はそこに label 属性を付与することでさらにマウスでURLを狙う精度を低くすることができます。
label 要素に accesskey 属性を付与することで、ALT キー+「accesskey属性で指定した値」で選択することもできます。Movable Type ではデフォルトテンプレート・メインページの検索部分にこのテクニックを用いていますので、そちらも参考にされると良いと思います。
2005.06.17 追記
typo がありました(誤:lable→正:label)ので修正しました。すいません。
トラックバック表示方法変更&テンプレート修正
世間は Movable Type 3.11で盛り上がってますが(私もか(笑))、自サイトのトラックバック表示をポップアップ画面から同一画面で開くように変更しました。
ブログを始めた当初はコメントやトラックバックがポップアップで開くサイトに憧れて(?)カスタマイズしたのですが、コメントはマルチカラム化との整合性の面でポップアップから同一画面表示に変更し、トラックバックも同一画面で開く方に傾いてきていたので修正しました。
修正のきっかけは当テンプレートご利用の198さんからのご質問です。私がサイトで表示を確認していたところ、トラックバック部分のデザインがきちんとできていないことに気がつき、直しました。
それに伴い公開中のテンプレートも勝手ながら一部修正致しました。修正したのはMT 3カラム テンプレート(サイズ固定)の個別アーカイブ(1カラム・3カラムとも)および、Movable Type 3.01D-ja 個別アーカイブテンプレートです(こちらは3カラム用を追加しました)。MT 3カラム テンプレートの変更は今回見送りました。
スタイルシートの変更はありません。
どのように表示されるかは、このサイトの任意のエントリーでご確認ください(横着ですいません)。オリジナルのテンプレートにある表示内容も下記のように修正しました。
- トラックバックURLとトラックバックの表示を分割。トラックバックがないエントリーはトラックバックURLのみ表示します
- 「このリストは?を参照しています」という文言を削除しました
テンプレートの修正内容は下記の通りです。
Individual Entry Archive の
<div class="blogbody">
:
(40行くらい)
:
<MTEntryIfAllowComments>
の部分を下記のものにごっそり取り替えれば(多分)OKです(修正前のコードはエントリーによってタグの位置やコメントの文言等が異なっていたので割愛させて頂きました)。
<div class="blogbody">
<h3 class="title">●<$MTEntryTitle$></h3>
<$MTEntryBody$>
<div id="a<$MTEntryID pad="1"$>more"><div id="more">
<$MTEntryMore$>
</div></div>
<div class="posted">投稿者 <$MTEntryAuthor$> : <$MTEntryDate$>
<!-- トラックバックを別ウィンドウに表示する場合ここから
<MTEntryIfAllowPings>
| <a href="<$MTCGIPath$><$MTTrackbackScript$>?__mode=view&entry_id=<$MTEntryID$>" onclick="OpenTrackback(this.href); return false">トラックバック</a>
</MTEntryIfAllowPings>
トラックバックを別ウィンドウに表示する場合ここまで -->
</div><!-- posted -->
</div><!-- blogbody -->
<!-- トラックバックを同一ウィンドウに表示する場合ここから -->
<MTEntryIfAllowPings>
<a name="trackbacks"></a>
<div class="comments-head">トラックバックURL</div>
<div class="comments-body">
<p class="techstuff">このエントリーのトラックバックURL:<br />
<$MTEntryTrackbackLink$></p>
</div>
<MTIfNonZero tag="MTEntryTrackbackCount">
<div class="comments-head">トラックバック</div>
<MTPings>
<div class="comments-body">
<p id="p<$MTPingID$>">
≫ <a href="<$MTPingURL$>"><$MTPingTitle$></a> from <$MTPingBlogName$><br />
<$MTPingExcerpt$> <a href="<$MTPingURL$>">[続きを読む]</a>
</p>
<div class="comments-post">トラックバック時刻: <$MTPingDate$></div>
</div><!-- comments-body -->
</MTPings>
</MTIfNonZero>
</MTEntryIfAllowPings>
<!-- トラックバックを同一ウィンドウに表示する場合ここまで -->
<MTEntryIfAllowComments>
以上です。ご参考になれば幸いです。
Trackbackの連続投稿を受け付けない
Movable Typeでは同一IPからの連続したコメントおよびTrackbackを受け付けない設定になっています。
#今頃気づきました…
といってもデフォルトでは「20秒間受け付けない」という設定になっているので、Trackbackについてはほぼ無条件に受け付けているようなものでしょう。
ということで任意の秒数を設定することができます。例えば10分(=600秒)間受け付けない設定にする場合は、mt.cfg の48行目
# ThrottleSeconds 20
の赤字部分とその横の半角空白を削除して
ThrottleSeconds 600
とします。
この変更に際しては注意点が2点あります。
まず、この値はコメントとTrackbackで共用しているので、秒数を長くし過ぎると異なるコメントを連続投稿する場合に影響が出てしまいます。
これを回避するための作戦として、エレガントではありませんが
- lib/MT/App/Comments.pm
の136行目
my $throttle_period = $app->{cfg}->ThrottleSeconds;
を
my $throttle_period = $app->{cfg}->ThrottleSeconds / 10;
のように割算の式を追加すればコメントのタイミングだけ短くすることができます。ThrottleSeconds に600(秒)を指定しているのであれば、この例では10で割っているので60秒となります。
もう一点ですが、このプログラムでは送信IPアドレス(厳密にはblog_idも?)しかチェックしていないため、他の記事への異なるコメントやTrackbackも受け付けられません。
トラックバックのタイムアウトについて
エントリーを投稿してトラックバックを送信した時、トラックバックの失敗を促すエラーが時々発生します。これはトラックバックping送信処理のタイムアウトが主な原因のようです。
例えばAサイトからBサイトにトラックバックを送信すると、Bサイトの mt-tb.cgi が起動されます。Bサイトではトラックバック受信処理を行い、成功すれば処理が正常に完了したことをAサイトに返送します。AサイトではBサイトからの応答を一定のタイミングで待ってまして、このBサイトからの返送が遅いとAサイトでトラックバックタイムアウトが発生します。
タイムアウトになっても相手サイトにトラックバックは正常に送信されていますので再送の必要はありません。送信サイトの表示を更新して確認されると良いでしょう。
タイムアウトにしたくない場合、タイムアウト時間を送信サイト側で変更することで多少回避することができます。変更箇所は Movable Type 3.01D-ja /3.1x の場合、mt.cfg の259行目です。3.2 では mt-config.cgi の300行目辺りです。
# PingTimeout 20
先頭の "#" と半角空白を削除して、値を
PingTimeout 30
等の任意の秒数に変更します。エントリーの登録時間に影響しますのであまり長くしないようにしましょう。デフォルトでは15秒に設定されています。
タイムアウトが発生した場合、ログを確認することでどのサイトへのpingが成功しなかったかが分かります。エントリー登録完了画面でpingタイムアウトが発生していたらログへのリンクが表示されます。それをクリックすると下記のようなログが表示されます。
2004.10.xx 15:12:23 xxx.xxx.xxx.xxx Ping 'http://rpc.weblogs.com/RPC2' failed: HTTP error: 500 read timeout
2004.10.xx 15:12:24 xxx.xxx.xxx.xxx Ping 'http://ping.blo.gs/' failed: HTTP error: 500 read timeout
上記2サイトは、「管理メニュー」→「ウェブログの設定」→「ウェブログの設定」(3.2 では「設定」→「新規投稿」)の真中辺りにある「広報 / リモートインターフェイス / トラックバック」(3.2 では「更新Ping/トラックバックの設定」)で「Movable Typeが自動的に通知するサイト」の
- blo.gs
- weblogs.com
にチェックボックスがつけられた場合に送信されます(3.2 では technorati.com もあります)。個人的には(多分)上記2サイトのエラーしか発生したことがありません。
エントリー登録時以外にログを参照したい場合は、メインメニュー画面右下にある「Movable Type のログの確認」というリンクをクリックすれば表示されます。3.2 ではメインメニュー画面右下にある「ログ」または、各ブログの管理メニューに「ログ」で確認できます。
参考サイトは下記です。ありがとうございました。
2006.05.23 追記
3.2 の記述を追加しました。また「Trackback」を「トラックバック」に統一しました。
Trackback元記事表示
変更してからかなり日が経ってますが表題のカスタマイズを実施しました。これまでの状態でも不便は感じてなかったのですがTrackback元が分からないTrackbackを頂いたので導入することにしました。Blog開始当初はTrackbackなんて無縁でしたし、あるはずもないと思ってましたが人生何が起こるか分からないものです。
リンクされている方で使われている方が結構多いので「こちらから参照しました」の掲載は割愛させて頂きました。すいません。
オリジナルの記事は下記です。
上記のエントリーより「MTPingedEntry」をダウンロードして解凍、mt-pingedentry.pl を plugins ディレクトリに配置し、テンプレートのTrackback部分の設定を変更するだけです。
レイアウトは元記事と変えてみました。そのままでも良かったのですがTrackbackを視覚的に表現できないかなという試みです。何かいいレイアウトが思いついたらまた変更します。
Trackback文字化け対処
Trackbackの文字化けを対処しました。遅くなってすいません > いつもTB頂いているMagic Whiteさん
これは文字コードの異なるBlog(例えばサイトAがUTF-8、サイトBがShift_JIS等)同士でTrackbackを行うと文字化けが発生(サイドメニューのRecent Trackbackの部分)し、これに対する対処です。Trackbackを受信するサイトが対処します。ちなみに現在このサイトはMT3.0Dなのですが、MT3.01D-jaでUTF-8とShift_JISの試験サイトをそれぞれ作ってUTF-8側をTrackback受信サイトとした場合、この対処なしでも文字化けは発生しませんでした(間違ってたらすいません)。
という訳でいつもの手順メモ。
Jcode.pmのダウンロード
Comprehensive Perl Archive NetworkよりJcode-0.86.tar.gzをダウンロード(現在はこのURLにあり、0.83/0.86/0.87があったので0.86を選択)。
Jcode.pmの配置
ダウンロードしたファイルを解凍し、その中の Jcode.pm と Jcode フォルダを extlib フォルダ直下に配置。
TrackBack.pmの編集
lib/MT/App/TrackBack.pm を任意のエディタで開き、下記に青色部分のコードを追加。
sub no_utf8 {
require Jcode;
for (@_) {
next if !defined $_;
$_ = pack 'C0A*', $_;
$_ = Jcode->new($_)->utf8;
}
}
"utf8"の部分は自blogの文字コード("euc"、"sjis"等)を設定。
動作確認
自サイトの任意のエントリーに表示されているTrackback URLをブラウザに設定して、下記のXMLが表示されればOKみたいです。
<?xml version="1.0" encoding="iso-8859-1" ?>
-<response>
<error>1</error>
<message>Need a Source URL (url).</message>
</response>
参考サイトは下記です。ありがとうございました。
2004/09/15追記
2004/09/11に Movable Type 3.01D-jaにしたため、この対処は現在使用しておりません。
