Jog2witter

JogNoteについた走行を記録をtweetするよ!
JogNoteのIDとTwitterのIDとPASSをいれてcronでぐるぐる回せばオーケー。
例によって例外処理はテキトー。
あんまりまだ回してないのでエラーが出たらごめんね!

# tweet jognote data
APP_NAME = 'JOGTTER'

JOGNOTE_ID = '000000'
TW_ID = 'id'
TW_PASS = 'pass'

JOG_DATA = 'jog2tw.dat'
LOG_FILE = 'jog2tw.log'

require 'logger'
$log = Logger.new(LOG_FILE)
$log.level = Logger::DEBUG
MAX_RETRY = 10


class JogNote
	require 'open-uri'
	require 'rexml/document'
	JOGNOTE_XML_URI = 'http://www.jognote.com/charts/main?format=xml&type=jogs&user_id=' + JOGNOTE_ID + '&days_count=30'
	def initialize
		@datafile = JOG_DATA
	end
	def get_last_jog_id
		tmp = File.open(@datafile).read
		return 0.to_i if tmp.to_s.length < 1
		tmp.to_i
	end
	def get_recent_post
		result = Hash.new
		rc = 0
		begin
			page = URI.parse(JOGNOTE_XML_URI).open.read
			xml = REXML::Document.new(page)
			xml.elements.each('/settings/data/chart/graphs/graph[@gid="0"]/value') do |v|
				result[v.attributes['xid'].to_s] = { :jog => v.attributes['description'] }
			end
			xml.elements.each('/settings/data/chart/series/value') do |v|
				if result[v.attributes['xid'].to_s] then
					result[v.attributes['xid'].to_s][:date] = v.text
				end
			end
			xml.elements.each('/settings/data/chart/graphs/graph[@gid="99"]/value') do |v|
				if result[v.attributes['xid'].to_s] then
					result[v.attributes['xid'].to_s][:kmh] = v.attributes['description']
				end
			end
		rescue
			$log.error $!.to_s + 'cant get xml from jognet, retry'
			rc += 1
			sleep(10)
			if rc > MAX_RETRY then
				$log.error 'cant get xml from jognet, raise'
				raise
			end
			retry
		end
		result
	end
	def get_new_jog
		@recent_jogs = get_recent_post
		save_jog_id = get_last_jog_id
		@recent_jogs.delete_if{ |xid, data| xid.to_i <= save_jog_id }
	end
	def update
		return false if !@recent_jogs or @recent_jogs.empty?
		last_xid = @recent_jogs.keys.sort{|a,b| a<=>b}.last
		$log.debug last_xid.to_s
		File.open(@datafile, "w"){ |f| f.print last_xid.to_s }
	end
end

class Twitter
	require 'rubygems'
	require 'rubytter'
	def initialize(id, pass)
		raise if !id or !pass
		@id = id
		@pass = pass
	end
	def jog_hash2array(hash)
		result = Array.new
		hash.keys.sort{ |a,b| a <=> b }.each do |xid|
			result << hash[xid][:date].to_s + ' 走ったぜ! ' + hash[xid][:jog].to_s + 'km(' + hash[xid][:kmh].to_s + 'km/h) [from JogNote]'
		end
		result
	end
	def post_jog2tw
		jn = JogNote.new
		rc = 0
		jog_texts = jog_hash2array(jn.get_new_jog)
		begin
			tw = Rubytter.new(@id, @pass, {:app_name => APP_NAME})
			jog_texts.each do |text|
				$log.info(text)
				tw.update(text)
			end
		rescue
			$log.error $!.to_s + 'cant post twitter, retry'
			rc += 1
			sleep(10)
			if rc > MAX_RETRY then
				$log.error 'ccant post twitter, raise'
				raise
			end
			retry
		end
		jn.update
	end
end

Twitter.new(TW_ID, TW_PASS).post_jog2tw