mk-mode BLOG

このブログは自作の自宅サーバに構築した Debian GNU/Linux で運用しています。
PC・サーバ構築等の話題を中心に公開しております。(クローンサイト: GitHub Pages

ブログ開設日2009-01-05
サーバ連続稼働時間
Reading...
Page View 合計
Reading...
今日
Reading...
昨日
Reading...

Ruby - XML-RPC でサイト更新 Ping 送信!

[ プログラミング ] [ Ruby, XML ]

こんばんは。

Ruby で XML-RPC を使用して、ブログの更新状況を Ping サーバに送信する方法についてです。

WordPress のような動的サイトなら、記事投稿時にプラグインで指定の Ping サーバに更新情報を Ping 送信してくれますが、 Octopress のような静的サイトでは通常そのようなことができません。

という訳で、Ruby で作成してみました。
取り敢えず手動ですが、サーバで cron 起動するなりすれば、自動になります。

0. 前提条件

  • Ruby 1.9.3-p327 で作成・動作確認。

1. Ruby スクリプト作成

作成した Ruby スクリプトは以下の通り。
実際使用する際は、「Ping サーバ一覧」に URL を記入する。

send_update_ping.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
# -*- coding: utf-8 -*-
require 'xmlrpc/client'

SITE_NAME = "hogehoge BLOG"          # 自サイト名称
SITE_URL  = "http://xxxxxxxx/blog/"  # 自サイト URL
# Ping サーバ一覧 ( 以下に送信先を設定する )
PING_SERVERS = [
  "http://api.my.yahoo.co.jp/RPC2",
  "http://blogsearch.google.co.jp/ping/RPC2"
]

# 処理クラス
class Main
  # サイト更新 Ping 送信処理
  def send
    begin
      PING_SERVERS.each do |svr|
        puts "- #{svr}"
        client = XMLRPC::Client.new2(svr)
        begin
          res = client.call("weblogUpdates.ping", SITE_NAME, SITE_URL)
        rescue XMLRPC::FaultException => e
          puts "  [ERROR] #{e.faultCode} - #{e.faultString}"
        rescue Exception => e
          puts "  [ERROR] #{e.class} - #{e.message}"
        end
      end
    rescue => e
      str_msg = "[ERROR][" + self.class.name + ".send] " + e.to_s
      STDERR.puts str_msg
      exit 1
    end
  end
end

################

####  MAIN  ####

################

# 開始メッセージ出力
puts "#### Send Update Ping [ START ]"

# 処理クラスインスタンス化
obj_main = Main.new

# サイト更新 Ping 送信
obj_main.send

# 終了メッセージ出力
puts "#### Send Update Ping [ E N D ]"

GitHub にもアップしている。( komasaru/SendUpdatePing )

2. Ruby スクリプト実行

以下のようにして Ruby スクリプトを実行する。

1
$ ruby send_update_ping.rb

失敗した場合のみ、メッセージを表示するようにしているが、成功した場合は XMLRPC::Client#call の返り値として以下のような内容が返ってるはず。

1
{"flerror"=>{"_value"=>[0], "_signature"=>[], "_type"=>"boolean", "_attr"=>{}}, "message"=>"Thanks for the ping"}

3. その他

今回は weblogUpdates.ping を使用しましたが、Ping サーバによっては、拡張された weblogUpdates.extendedPing を使用できる場合があります。
引数に、サイトURLとは別に記事のURLとRSSのURLを追加して使用します。

当方は実際には、 weblogUpdates.extendedPing で一旦 Ping 送信し、失敗した場合に weblogUpdates.ping で Ping 送信し直すような処理にしています。

4. 問題点

Ruby で XML-RPC を使った場合、content-typetext/xml 以外だとエラーになるようです。
実際には、以下のようなエラー。

1
RuntimeError - Wrong content-type (received 'text/html' but expected 'text/xml'):

このエラーについては、対策していません。
ライブラリを直接修正すれば、対応可能のようですが、他に複数の Ping サーバも利用しているので、今のところは放っています。

5. 参考サイト


さらに、当方はサーバで定期(cron)起動(エラー時にはメールで通知)するようにしています。
そして、エラーメールをチェックし、無効な Ping サーバ等には Ping 送信しないように整理したりしています。

以上。

Comments