トラックバックを実装する

昨今一大ブームとなったブログ。 その中で主な機能の1つである、トラックバック。 ブログツールを導入すれば、予め実装されていると思いますが、 単独でトラックバックの機能を使いたい場合も、あると思います。

トラックバックシステムの開発元であるmovaletypeでは、 スタンドアロン版のトラックバックを、 http://www.movabletype.org/downloads/tb-standalone.tar.gz に用意しています。

環境を整える

さっそくファイルを展開してみましょう。tb.cgiというファイルが見つかるはずです。 トラックバックは、このcgiのみで実現されます。 まずはサーバにアップロードして、動作させてみて下さい(エラーメッセージ確認のため、コマンドラインから叩いた方が便利です)。 もし、特にエラーも出ず、動作をした場合は、必要なモジュールが既に組み込まれています。 しかし、何かしらのエラーが出た場合は、モジュールが不足している可能性があります。 メッセージを見て、必要なモジュールを組み込んでください。

# perl -MCPAN -e shell
(初回起動時は、色々質問を受けます)
cpan > install LWP
cpan > Storable
cpan > q
# 

環境にもよると思いますが、うちのサーバ上では、tb.cgiそのままでは動きませんでした。 なので、tb.cgiの中身を確認していきます。

my $DataDir = "./tb_data";
my $GenerateRSS = 0;

特にRSSは必須ではないので、無効にしておきます。 また、$DataDirで指定されたディレクトリは、予め作成しておきます。

    if ($ping =~ /\?/) {
        $req = HTTP::Request->new(GET => $ping . '&' . join('&', @qs));
    } else {
        $req = HTTP::Request->new(POST => $ping);
        $req->content_type('application/x-www-form-urlencoded');
        $req->content(join('&', @qs));
    }
#[追加]--------------------------------
	$req->header(Accept => "*/*");
#--------------------------------------
    my $res = $ua->request($req);
リクエストヘッダのAcceptフィールドを、全てのメディアタイプに指定しておきます。 ちなみにこのフィールドは、レスポンスで受け入れ可能なメディアタイプを指定するものです。

仕組み

なぜリクエストをtb.cgiに送り、 tb.cgiが目的のpingURLへアクセスするという手順を取るのでしょうか。

トラックバックの仕様では、データのやり取りはxmlで行われる必要があります。 しかし、ブラウザに直接xmlを返されても、適切な処理をすることは出来ません。 そこで、ブラウザが理解できるように、htmlへ変換しないといけません。 その対応させるための処理を、tb.cgiが行なっているから、 トラックバックの前に一度tb.cgiを介しているのです。 つまり、tb.cgiには、トラックバックを受け取る処理と、 入力からxmlデータ、xmlデータからhtmlというデータ変換処理という、 2つの役割があったわけです。

トラックバック