« joyfulexif にトラックバック機能を実装 | メイン | デビルズ・ファイヤー »

2004年12月31日

Net::Trackback を用いたトラックバック機能

Category: joyfulexif

概要

トラックバック機能を実装を可能にするモジュール (Net::Trackback モジュール) が CPAN から入手可能です。同時に Class::ErrorHandler, LWP モジュールも必要 ですので、最低限この3つのモジュールを使えるようにしておきましょう。

新しいモジュールからなのか Net::Trackback モジュールの使い方を検索しても なかなか出てきません。もちろんいくつかあったのですが、古いバージョン (昔のバージョンは Net::TrackBack だったらしい)のもので、仕様が変わっている ようであまり役に立ちませんでした。

ということで、ここではモジュール添付のマニュアルとソースをもとに トラックバックを送る場合と受け取る場合について以下に紹介をしたいと思います。 間違っていましたらコメントを下さい。直します。

トラックバックの送信

トラックバックは Contetn-type が application/x-www-form-urlencoded として HTTP で送信するデータのことです。送る内容は最低限

  • ブログ名 ( $BlogName )
  • 記事のタイトル ( $Title )
  • 記事の要約 ( $Message )
  • 送信元 URL ( $URL )

となります(括弧内はサンプルスクリプトで紹介する変数名)。まずは Jcode モジュール などを用いて文字列は UTF-8 に変換をしておきます。そして、 Net::Trackback::Ping, Net::Trackback::Client モジュールを用いて 必要な設定後送信します。以下にサンプルスクリプトを紹介します。

#!/usr/bin/perl use Jcode; use Net::Trackback::Ping; use Net::Trackback::Client; use Net::Trackback::Message; # 送信する値の定義 $BlogName = 'ブログ名'; $Title = 'タイトル'; $Message = '要約'; $URL = 'http://xxx.xxx.xxx/xxx.html'; $TB_URL = 'http://xxx.yyy.zzz/.../hoge-tb.cgi/30'; # UTF-8 に変換 Jcode::convert( \$BlogName, 'utf-8' ); Jcode::convert( \$Title , 'utf-8' ); Jcode::convert( \$Message , 'utf-8' ); # トラックバックの情報を $ping に定義する my $ping = new Net::Trackback::Ping; $ping->title( $Title ); $ping->url( $URL ); $ping->ping_url( $TB_URL ); $ping->excerpt( $Message ); $ping->blog_name( $BlogName ); # Net::Trackback::Client::send_ping を利用してトラックバックの送信 my $client = new Net::Trackback::Client; my $return = $client->send_ping( $ping ); # 正常に送信できたかどうかのチェック my $msg = new Net::Trackback::Message; $msg->message( $return ); print $msg->to_xml;

ただし、$TB_URL はトラックバックを送信する URL を表しています。 Net::Trackback::Ping にてトラックバック送信に必要な 情報を記述して、Net::Trackback::Clientにて実際に トラックバックを送信します。正常に送信したかどうかをチェックするために Net::Trackback::Messageを利用します。

トラックバックを受信する

トラックバックを受け取るための CGI をここでは http://xxx.yyy.zzz/tb.cgi とします。ある記事(ID: 50)にトラックバックをするためには http://xxx.yyy.zzz/tb.cgi/50 としてトラックバックが送信されます。 これを受け取って処理します。以下にそのサンプルを紹介します。

#!/usr/bin/perl use CGI qw/:standard/; use Net::Trackback::Ping; use Net::Trackback::Server; # CGI モジュールを利用してデータを受信 $CGI = new CGI; # Net::Trackback::Ping::parse を利用してトラックバックの内容をチェック $ping = new Net::Trackback::Ping; eval { $ping->parse( $CGI ) }; # CGI データより必要な情報を読み込む $BlogName = $CGI->param( 'blog_name' ); $Message = $CGI->param( 'excerpt' ); $Title = $CGI->param( 'title' ); $URL = $CGI->param( 'url' ); # ID 番号の処理 $ping->parse がうまくいかない場合、PATH_INFO より値を得る if( $parse->{__stash}->{id} ){ $ID = $parse->{__stash}->{id}; }else{ $ID = $CGI->path_info(); $ID =~ s/^\///; } # トラックバック送信元に結果を送信する unless( $ping->errstr ){ Net::Trackback::Server->send_success( 0 ); }else{ Net::Trackback::Server->send_error( 1 ); }

受け取る方は、一般的な CGI モジュールで特に問題ないと思います。 ただし、最後にトラックバックを送った相手に結果を送信してあげる ことだけを忘れないようにしましょう。上の例では send_success あるいは send_error を利用して結果を送信しています。この時送る Cotent-type は text/xml です。

$ping->parse の行が eval で囲んでいるのは、不確実な経験ですが Perl 5.8.x ではうまくいかないっぽいのです。ひょっとすると CGI モジュール の仕様がすこし違うのかも知れません…説明が出来る人がいましたら 教えてください。

投稿者 kato : 2004年12月31日 21:06

コメント

こちらを参考に、ウェブログサイト以外からの
トラックバックを受付ける方法についての記事を書かせて頂きました。
トラックバックできませんでしたのでコメントで失礼いたしますm(_ _)m

投稿者 ぴろり : 2005年8月 8日 16:42

ご丁寧に報告ありがとうございます。Open MagicVox での記事ですね
(昨日のコメントでは違うサイトを書いてしまいました…)

http://www.magicvox.net/archive/2005/08081310.php

私の記事よりもまとまっていて(かつ見やすくて)分かりやすいですね。
私もあのような文章が書けるよう精進したいものです。

投稿者 きゃちゅ : 2005年8月 8日 23:00

こんにちは。
トラックバック受信のコードを使って
ブログ形式じゃないサイトでもTBが受けられるようにしてはどうだろう?
なんてネタをふと思いついてしまいました…
これが実現できれば、ブログ形式非ブログ形式に係わらず
サイトはTBという規格で相互リンクを貼れるようになるんじゃないか、と。
…うーん、思いつきレベルで実用性がイマイチですねorz

# コメントにURLを残して頂いていますのでTBは控えておきました

投稿者 ぴろり : 2005年8月20日 11:27

返事が大変遅くなりました。

相互リンク自体がどのくらい必要性があるのか分かりませんが、CGI が利用できるという
縛りがありますが、トラックバックによってそのようなことが実現可能ですね。

難しいのは「リンクを貼る」ことは自由だと思いますが、「リンクを(勝手に)貼る」ことが
自由なのかどうかということですね。また、第3者が自由にリンクを貼れてしまうために
スパムやら宣伝の格好の標的になってしまうことも問題なのでしょうね。

そういう部分がうまく解決されるとトラックバックは非常に強力な機能となるのかも
しれませんね。

投稿者 きゃちゅ : 2005年8月28日 12:13

コメントしてください




保存しますか?