XML-RPC を使って更新 Ping を送信する機能をこのブログに実装してみました。

■ 更新 Ping とは?
ブログの更新をブログ検索サイト(Google のブログサーチとかテクノラティとか)に伝えるときに送信するメッセージのことです。これを送信すると、検索サイト(情報サイト)は、新着情報にそのブログの最新記事を載せてくれます。

■ メカニズム
検索サイトなどでは、更新 Ping を受け付けるための Web サービス(XML-RPC)を公開しているので、ブログからはその Web サービスを実行すればよいということになります。
※ weblogUpdates という統一規格があるようです。

ちなみに、REST 形式(POX over HTTP 形式)の Web サービスを公開しているサイトもあるので、XML-RPC 以外の方法も存在します。

■ 実装コード
require 'xmlrpc/client'
server = XMLRPC::Client.new2('http://pingoo.jp/ping/')
server.call("weblogUpdates.ping", 'あかさたのページ', 
    'http://www.rmake-labo.com/akasata/')

Web サービスを公開しているサイトとして、「http://pingoo.jp/ping/」を指定していますが、これは Pingoo! というサイトで、テクノラティなど有名な更新 Ping 受信サイトに更新 Ping を再転送してくれるサービスです。このサービスを使うと、更新 Ping を受け付けるサーバを一つ一つ調べる必要がないので楽です。

■ 動作の説明
動作としては、次のとおりです。
1. XML-RPC で更新ブログ名と URL 名を伝える
2. Pingoo! は、送信元ブログを参照して RSS を取得し、最新の更新情報を取得する(※)
3. Pingoo! は登録してある更新 Ping を受け付けるサーバに最新情報を送信する

※ このため、送信元ブログの HTML のヘッダには、以下のような RSS を指定するコードを実装しておく必要があります。

Posted by あかさた
第一回で説明したとおり、トラックバックは以下のパラメータを持った HTTP POST リクエストです。
・ title(記事のタイトル)
・ excerpt(記事の要約)
・ url(記事の URL)
・ blog_name(ブログ名)

そこで、以下のようなコードを書いてやれば、トラックバックを送信できます。このメソッドを、記事を生成するメソッドか更新するメソッドから呼び出してやればよいでしょう。

require 'net/http'
require 'uri'
def send_trackback(url, article)
  Net::HTTP.version_1_2
  uri = URI.parse(url)
  http = Net::HTTP.new(uri.host, 80)
  data = 'title=' + Article_Title + 
    '&url=' + Url
    '&blog_name=' + Title + 
    '&excerpt=' + Article_Content
  
  response = http.post(uri.path, data)
end


ひとつ注意してほしいことは、同じ記事(URL)に対して同じ内容のトラックバックを複数回送信すると相手先に迷惑になるので、そのような実装は避けてください。

Posted by あかさた
Ruby on Rails におけるトラックバックの受信に関する実装のポイントを説明します。

(0) 前提知識
トラックバックの仕様を説明します。トラックバックを、受信するということは、以下のパラメータを持った HTTP POST リクエストを受信するということです。
・ title(記事のタイトル)
・ excerpt(記事の要約)
・ url(記事の URL)
・ blog_name(ブログ名)
※ url 以外は省略される場合があります。

ですから、トラックバックは以下のような流れで実装することができます。
(1) 受信したトラックバックを貯めるためのテーブルを準備する
(2) トラックバックを受け取るコントローラにメソッドを作る
(3) レスポンスを返す


(1) 受信したトラックバックをためるためのテーブルを準備する


以下のようなカラムを含むテーブル(例:trackbacks)を作成します。
・ id
・ title
・ excerpt
・ url
・ blog_name
・ article_id
・ date

article_id は、トラックバックを受信した記事の ID です。date は、トラックバックを受信した日時です。

(2) トラックバックを受け取るコントローラにメソッドを作る


以下は、このブログのトラックバックを受け取る URL の例です。説明すると、コントローラ「articles」、メソッド「trackback」、ID は記事の ID です。
http://www.rmake-labo.com/akasata/articles/trackback/34


以下のように書くことで、受信したトラックバックの情報を取得することができます。受信したトラックバックの情報に基づいて、記事の view などを変更してください。

def trackback
  @title = params[:title]
  @excerpt = params[:excerpt]
  @url = params[:url]
  @blog_name = params[:blog_name]
  
  # ここに、DB に受信したトラックバックを挿入するコードを書く。
end


(2.1) 補足


トラックバックは通常の HTTP GET メソッドではなく、POST メソッドで送られてきます。ですから、以下のように、HTTP POST のみを受け付けるように、Controller に記述してやる必要があります。
verify :method => :post, :only => :trackback, 
    :redirect_to => { :controller => :application, :action => :index }


(3) レスポンスを返す


トラックバックを受けたら以下のようなレスポンスを返す必要があります。View(trackback.rhtml)に記述すると良いでしょう。

○ 正常なレスポンス
<?xml version="1.0" encoding="iso-8859-1"?>
<response>
<error>0</error>
</response>

○ エラーのレスポンス
<?xml version="1.0" encoding="iso-8859-1"?>
<response>
<error>1</error>
<message>The error message</message>
</response>

■ 参考
トラックバックを実装した
http://www.rmake-labo.com/akasata/articles/show/34

トラックバック技術仕様書
http://lowlife.jp/yasusii/stories/8.html


Posted by あかさた
Ruby on Rails では、Scaffold を生成して、ブログの記事やコメントの追加削除をできるようにするところまでは、Rails に慣れていない人でも数時間で到達します。しかし、それ以上の機能を持ったブログを開発しようとすると、ブログに関する知識がないとスムーズには進みません。

この連載では、Rails(Ruby)を使ってブログの実装を行っている人向けに、ブログに関する周辺知識を交えながら、実装に有用な情報を掲載していきます。

■ 対象読者
・ Ruby の文法の知識は初級 ~ 中級
・ Ruby on Rails の Scaffold を生成したことがある
・ ブログの実装はしたことがない、あるいはそれほど詳しくはない
・ 今、Rails を使ってブログを実装しようとしている

■ 連載
第一回 トラックバックを受信する(2007/1/8)
第一回【補足】 トラックバックを受け付けるために、文字コードを変更する
第二回 トラックバックを送信する(2007/1/8)
第三回 RSS を配信する(Coming soon)
第四回 XML-RPC を使って、更新 Ping を送信する(2007/1/8)

■ 番外編
Ruby on Rails を使用できる国内ホスティングサーバについて(Coming soon)

Posted by あかさた
このブログ(Ruby on Rails)をモバイル対応をしてみました。といっても、まじめにやったわけではなく、before_filter に以下のコードを埋め込んで、携帯ブラウザの場合は左右のメニューを隠したり、一度に表示する記事の量を抑えたりしています。

if user_agent.index(/DoCoMo|J-PHONE|Vodafone|KDDI|UP\.Browser/)

is_mobile = true
end


いくつかバグがあって、大きな画像を記事中に埋め込んでいるときは、容量オーバーで表示が途切れたり、文字コードは UTF8 にしているので、古い携帯や機種によっては見られない(というか見られない機種のほうが多い)という現象が発生します。

テストは AU の W43S で行いました。コメントを書くとかそういうことは一切テストしていないので、ものすごい不具合があるかも・・・。テストしてみました。普通に書き込めました。顔文字とか機種依存文字とか使うとだめだと思いますが、普通に書くぶんには問題なさそうです。

以下、2007/1/7 に追記。
私なりに調べた携帯対応のポイントを書き連ねておきます。(このブログではほとんどできていませんが・・・。)
・ 携帯の機種によって必要な対応項目が異なるので、user_agent を調べて、機種ごとに適切な対応をとる必要があります。(HTML の形式、文字コード、一度に読み込めるページのサイズなど。)
・ 文字コードは昔は Shift-JIS が一般的でしたが最近はいろいろです。私の携帯では UTF8 も対応しています。
・ 携帯は読み込める容量が少ないので、大きな画像は縮小、文章も適切なところで切ってやる必要があります。
・ 携帯は画面サイズ(というか解像度)が小さいので、画面を有効活用するために、カタカナは半角にする必要があります・・・という話がありますが、個人的にはそろそろいいのではないかと考えています。最近の携帯は VGA(昔の PC のディスプレイ)位の解像度はあるので・・・。
・ パケット代を節約するためにも、余分な情報(このサイトで言えば、左右のメニューとか)は極力表示しないようにします。
・ Rails で作ったアプリは、割とそのままでも表示されました。でもこれは、au だけかな・・・?

以上です。

Posted by あかさた
以前の記事でトラックバック(受信のみ)を実装したと記述しましたが、ようやく送信も実装しました。要約の作成をちゃんとやっていない(今は全文を送信するという非常に迷惑な仕様になっている)とか問題は残っていますが。今のところ、はてなダイアリーへの送信には成功しています。

問い合わせ文字列に、title、url、blog_name、excerpt を指定して、post で送れば良いだけなのですが、Ruby の http 回りで少々てこずってしまいました。情報が少ないのです。

コードとしては以下のような感じです。
def send_trackback(url, article)

Net::HTTP.version_1_2
uri = URI.parse(url)
http = Net::HTTP.new(uri.host, 80)
data = 'title=' + article.title +
'&url=' + Base_Url + 'articles/show/' + article.id.to_s +
'&blog_name=' + Title +
'&excerpt=' + article.content

response = http.post(uri.path, data)
end


Posted by あかさた
そういえば、島根県松江市で「Ruby City MATSUE プロジェクト」なんてやってましたね。まつもとさんのブログで読んだことがあったような気がします。ITpro のニュースで紹介されていました。

そういえば、いつかの日経新聞にも Ruby が載っていました。勢いがあるなぁ・・・。私もとある事情で来年は Ruby on Rails をたくさん使うことになりそうなので、Ruby 周りも調べておかないと!

Posted by あかさた