昨今一大ブームとなったブログ。 その中で主な機能の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つの役割があったわけです。