岩波書店の「今日の名言」をPOSTするtwitterBot IwanamiQuote を作った(ソースコード付き)
IwanamiQuote
http://twitter.com/IwanamiQuote
経緯
今日の名言を見たいけど、毎日見に行くのは面倒なので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