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

2009/02/15

トラックバックを実装するのはそんなに難しくない。
仕組みをちょっと勉強すればわかります。

トラックバックの仕様

トラックバックの仕様は、

  • 送信側:blog_nameやurlなどの決められたパラメータをトラックバックURLにPOSTする。

  • 受信側:受け取ったデータを保存し、レスポンスは決められた形式のXMLで返す。リンクを張る。


という意外とシンプルなものです。

XMLも以下のように非常に小さくてシンプルです。
※成功レスポンスの例
<?xml version="1.0" encoding="iso-8859-1"?>
<response>
<error>0</error>
</response>


僕はこの本
自分で作る blog ツール自分で作る blog ツール
石川 直人

ソフトバンククリエイティブ  2005-03-30
売り上げランキング : 72696

Amazonで詳しく見る
by G-Tools

のトラックバックの説明の箇所で学びました。
この本は、トラックバックの他にもRSSなどの説明もわかりやすいので、そのへんに興味がある人にはおすすめです。

あと、このへん
トラックバック技術仕様書
を軽く読むといいかもしれない。
(僕は読んでませんが)


送信側の実装

送信側は、決められたパラメータを揃えてPOSTしなければなりません。
決められたパラメータとは、

  • blog_name・・・ブログの名前

  • title・・・記事のタイトル

  • url・・・記事のURL

  • excerpt・・・記事の要約


です。
必須なのはURLで、残りは受け取る側のブログの仕様によります。

で、POSTする方法ですが、
トラックバック専用フォームをつくってPOSTするのが一番簡単です。
が、記事を保存するときにトラックバックも一緒に送信したいっなど、
サーバーサイドでPOSTを発生させたい場合は、
PHPでサーバーサイドでPOSTする方法が、
とても簡単にPHPからPOSTリクエストを送信する方法 [PHP, Tips] - Programming Magic
にいろいろまとまっているので、どれか気に入ったもの、環境的に可能なものを採用するとよいでしょう。


受信側の実装

受信側は、決められたパラメータを受け取り、保存し、XMLでレスポンスを返します。
urlは必須として、他のパラメータをどう扱うかは自由に決めていいと思います。
このブログではとりあえず全部必須にしてしまっています。

あとはデータをDBに保存、それをもとにビューでリンクをはる、
となります。

Akelosだったら以下のような感じになると思います。
/*
* トラックバック受信メソッド
*/
function trackback() {
  //パラメータが足りなかったらエラーレスポンスを返す
  if (empty($this->params['blog_name']) ||
      empty($this->params['title']) ||
      empty($this->params['url']) ||
      empty($this->params['excerpt']) ||
      empty($this->params['id'])) {
    $this->renderText($this->createTrackbackResponse(1, "parameter error"));
  }

  //trackbackモデルの生成
  $trackback = new Trackback($this->params);

  //DB更新
  if ($trackback->save()) {
    //成功レスポンスを返す
    $this->renderText($this->createTrackbackResponse(0, ""));
  } else {
    //失敗レスポンスを返す
    $this->renderText($this->createTrackbackResponse(1, "receive error"));
  }
}

/*
* トラックバック元に返却するレスポンスを生成する
*/
private function createTrackbackResponse(&$error, &$message) {
  $xml = "<?xml version=\"1.0\" encoding=\"iso-8859-1\"?>";
  $xml .= "<response>";
  $xml .= "<error>".$error."</error>";
  if ($error == 1) {
    $xml .= "<message>".message."</message>";
  }
  $xml .= "</response>";
  return $xml;
}

xml生成部分はライブラリを使うといいのかもしれないが、小さいから文字列結合でやってしまってます。
これを作成時点のAkelosではまだrenderXml()がありそうでなかったので、renderText()しています。
最新版には実装されてるかな?

ウソだった。renderXml()あった。なぜrenderText()にしてしまったのか・・・忘れてしまった。。。


PHP and Akelos | コメント(0) | トラックバック(0)
トラックバック
トラックバックURL:
コメントをどうぞ
名前 (入力しなければ「通りすがり」):

メールアドレス (入力しても公開されません):

URL (入力すればリンクが張られます):


コメント:

(コメントにタグなどを使ってもタグがそのままが表示されます)