備忘録のような何か

何か += 備忘録( 日々のこと, 妄想, IT, DIY, 畑仕事 );

はてなブログでping送信する

移転しました。

約5秒後に自動的にリダイレクトします。



ブログの集客用にランキングサイトとか登録してますか?
このブログもとりあえず「にほんブログ村」に登録をしてたりします。
集客といってもブログ村からのお客さんは1日あたり2、3人ぐらいですけどね。
なにもしないよりはマシでしょう。

今日のネタはそういう集客手段の話ではなくて。。。

ブログ村で最新記事を紹介してもらうには、
pingを送信するということが必要なのです。
ブログ更新しましたよーっていう連絡ですね。

なかにはブログを更新したら自動でping送信をしてくれるブログサービスもあるらしいのですが、はてなブログは自動で送信してくれないので自分でブログ村のサイトに行って送信ボタンをポチッとやる必要があるのです。
まあ、大した手間というわけでもないのだけど、、、
やっぱり毎回となると面倒ですよね。

プログラマってやつは面倒くさがりな人種なのです!
そして、面倒なことは自動化してしまおうとするものなのです!!

ということで、前置きが長くなりましたが、、、
はてなブログの更新をping送信するプログラムを書いたので載せときます。
きっと既に誰かが作ってるだろうから何番煎じか分かりませんがw


www.mk-mode.com

ベースはこちらのサイトに載ってるソースをいただきました。

で、出来上がったプログラムはこちら。

# -*- coding: utf-8 -*-
require 'open-uri'
require 'rexml/document'
require 'xmlrpc/client'

# 更新間隔(分)
UPDATE_INTERVAL = 30   # ---【1】

#--------------------
# サイト情報
#--------------------
class SiteInfo
  def initialize(name, url)
    @name = name          # サイト名
    @url = url            # サイトURL
    @pingServers = []     # PING送信先URL
  end

  def addPingServers(url)
    @pingServers.push(url)
  end

  attr_accessor :name, :url, :pingServers
end

#--------------------
# サイト登録
#--------------------
siteInfos = []

# ---【2】
# 備忘録のような何か
siteInfo = SiteInfo.new("備忘録のような何か", "http://m-uta.hatenablog.com/feed")
siteInfo.addPingServers(<ブログ村の専用Ping送信先URL>)
siteInfos.push(siteInfo)

#--------------------
# 開始メッセージ出力
#--------------------
puts "### Send Update Ping [ START ] --#{Time.now}--"

#--------------------
# Ping送信処理
#--------------------
begin
  siteInfos.each do |info|
    puts "- #{info.name}"

    doc = REXML::Document.new(open(info.url))
    updateTime = Time.strptime(doc.elements["feed/updated"].text, "%Y-%m-%dT%H:%M:%S")

    # 前回の送信処理実行後に更新があった場合のみPing送信
    if updateTime >= Time.now - UPDATE_INTERVAL*60
      info.pingServers.each do |svr|
        puts "-- #{svr}"
        client = XMLRPC::Client.new2(svr)
        begin
          res = client.call("weblogUpdates.ping", info.name, info.url)
          puts "  [SUCCESS]"
        rescue XMLRPC::FaultException => e
          puts "  [ERROR] #{e.faultCode} - #{e.faultString}"
        rescue Exception => e
          # ---【3】
          if e.message.start_with?("Wrong content-type (received 'text/html' but expected 'text/xml')")
            puts "  [SUCCESS(text/html)]"
          else
            puts "  [ERROR] #{e.class} - #{e.message}"
          end
        end
      end

    else
      puts "  [SKIP]Don't updated from #{updateTime}"
    end
  end
rescue => e
  STDERR.puts "[ERROR]" + e.to_s
  exit 1
end

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


【1】
これをサーバーに置いて30分ごとに動くようにする予定。
直近の30分でブログに更新があればping送信される。

【2】
ブログを複数登録できるようにしてみた。
さらに1つのブログに対して複数ping送信先を設定できるようにした。

【3】
ブログ村ping送信したらcontent-typeが"text/html"ですよっていうエラーが出るんだけど、ちゃんと送信は出来ているみたいなのでエラーにしないことにした。
けど、このハンドリングはイケてないよなぁ。。。

(。・ω・)ノシ