岩波書店の「今日の名言」をPOSTするtwitterBot IwanamiQuote を作った(ソースコード付き)


IwanamiQuote
http://twitter.com/IwanamiQuote

これは何?

岩波書店今日の名言を1日1回POSTするtwitterBotです
1日1回しかPOSTしないのでtwitterで見るより、RSSreaderで見たほうが良い感じです

経緯

今日の名言を見たいけど、毎日見に行くのは面倒なのでtwitterBot化しました
前回(ニコニコ動画の毎時ランキングをつぶやくtwitterBotを作った)作ったbotのおかげで、
スクレイピングtwitterにPOSTという流れが簡単に作れるようになったので、15分そこいらで完成
しばらく動かしてみて安定しているっぽいので公開しました

ソース

ライセンスはNYSLでお願いします(要はフリーです)
これを雛形にすれば、多分簡単にtwitterBotを作る事が出来るはずです

本体
#!/usr/local/bin/ruby

require 'rubygems'
require 'twitter'		# twiter
require 'mechanize'		# ログイン自動化
require 'scrubyt'		# スクレイパ
require 'pp'			# dumpぽいの
require 'xmlsimple'		# xmlをhashに
require 'sqlite3'		# SQLite

$KCODE = 'UTF-8'		# 2バイト文字をFTF-8として扱う
require 'jcode'			# 2バイト文字対応

require 'Log'			# ログファイル出力(自作ライブラリ)

# http://www.iwanami.co.jp/meigen/heute.html

# カレントディレクトリをソースのあるディレクトリに変更
Dir::chdir(File.expand_path(__FILE__).sub(/[^\/]+$/,''))

# 固定値
# http://twitter.com/IwanamiQuote
TwitterMail = '********'// 出力するtwitterのメールアドレス
TwitterPass = '********'// パスワード

# ログ
LogFileName = './log.txt'
log = Kaseisan::Log.new("#{LogFileName}");

begin
	# 名言取得
	result = Scrubyt::Extractor.define do
		fetch 'http://www.iwanami.co.jp/meigen/heute.html'

		Quote '/html' do
			text '//td[@class="bg_standard"]/div', :example_type => :xpath
			book '//td[@class="bg_standard"]/a', :example_type => :xpath
		end
	end

	# メッセージを生成
	hash = result.to_hash[0]
	message = "#{hash[:text].toutf8} : #{hash[:book].toutf8}"
	
	# twitterに送信!
	twit = Twitter::Base.new(TwitterMail, TwitterPass)
	twit.update(message)

rescue => e
	log.puts "エラー発生:\n#{e}"
	exit
ensure

end
ログ出力用ライブラリ
require 'date'

# オレオレ名前空間
module Kaseisan
	# ログファイル出力
	class Log
		# コンストラクタ
		def initialize(filePath)
			# ディレクトリ存在確認
			@filePath = filePath
			fileDir = filePath.sub(/\/[^\/]+$/,'/')
			raise "対象のPathが存在しません:#{filePath}" unless File.exist?(fileDir) 
			raise "対象のPathはディレクトリです:#{filePath}" if File.exist?(filePath) && File.directory?(filePath)
		end
		
		# ログファイル書き込み
		def puts(msg)
			begin
				if File.exist?(@filePath) then
					File::open("#{@filePath}","a") {|f| f.puts "[#{DateTime.now}]\n#{msg}"}
				else
					File::open("#{@filePath}","w") {|f| f.puts "[#{DateTime.now}]\n#{msg}"}
				end
			
			# ダメだったら、標準エラー出力に書き込み
			rescue => e
				STDERR.puts "[#{DateTime.now}]ログファイル書き込みエラー:#{msg}"
				STDERR.puts e
				return false
			end
			return true
		end
	end
end

技術メモ

  • 自作ライブラリは、環境変数 RUBYLIB の直下に置けばどっからでも require 可


そんな感じー