読者です 読者をやめる 読者になる 読者になる

まめ畑

ゆるゆると書いていきます

TwitterのFollowerをお知らせするスクリプト

Ruby Twitter


以前のエントリで書いた、Twitterで自分をフォローしてくれた人をお知らせするスクリプトなんですが、今日お知らせをしてくれなくなって少し調べてみたら、ログインの処理でこけてました。


で、何か変更があったのかとおもったら、ログインフォームのメルアドとパスのテキストボックスのNameが変わっていました。

username_or_email -> session[username_or_email]
password -> session[password]

こんな感じで変更されていました。
英語版・日本語版どちらもでした。

そこで少しスクリプトを修正しました。
YAMLの書き方は1日のfollowerの増減をメールで送信を見てください。


あと、今日OSC2008 in Kansaiに行きます。
shibuya.jsの講演楽しみです!

require 'rubygems'
require 'mechanize'
require 'tmail'
require 'net/smtp'
require 'date'
require 'time'
require 'yaml'


def read_yaml
	settings = YAML::load(File.open('fuetter.yaml'))
	$id = settings['user']['id']
	$pass = settings['user']['pass']
	$smtp_server = settings['mail']['server']
	$mail_to = settings['mail']['to']
	$mail_from = settings['mail']['from']
end

def login
	agent = WWW::Mechanize.new
	agent.max_history = 1
	agent.user_agent_alias = 'Windows IE 6'
	login_page = agent.get('http://twitter.com/')
	login_form = login_page.forms[1]
	login_form['session[username_or_email]'] = $id
	login_form['session[password]'] = $pass
	my_home = agent.submit(login_form)
	agent
end

def get_my_followers(isFileExists = false)
    begin
	agent = login
	my_follower_page = agent.get('http://twitter.com/followers')
	followers_count = (my_follower_page/"html/body/div[2]/div[3]/div/h2").inner_text
	followers = followers_count.match(/\d+/)[0].to_i
	last_page_index =  (followers%20 != 0) ? (followers/20 + 1) : (followers/20)

	if isFileExists == true
	   before_followers = []
	   now_followers = []

	  (1..last_page_index).each do |n|
	    my_follower_page = agent.get("http://twitter.com/followers?page=#{n}")
	    follower = my_follower_page/"a.url"
	    follower.each { |f| now_followers << f.inner_text }
	  end
	  f = open("followers.txt","r")
	  while line = f.gets
	    before_followers << line.chomp
	  end

	  new_follower = now_followers - before_followers
	  remove = before_followers - now_followers
	  make_body(new_follower, remove)
	end

	  f = open("followers.txt","w")
	  if isFileExists == false
	    (1..last_page_index).each do |n|
	      my_follower_page = agent.get("http://twitter.com/followers?page=#{n}")
	      follower = my_follower_page/"a.url"
	      follower.each { |fr| f.puts(fr.inner_text) }
	    end
	  else
	      now_followers.each { |fr| f.puts(fr) }
	  end
	   f.close
    rescue
	get_my_followers(isFileExists)
    end
end

def make_body(add_follower, bye_follower)
	mail_body = "*Your Followers Report*\n\n"
	mail_body << "*** New Follower(s) ***\n"
	if(add_follower.length == 0)
	  mail_body << "No New Follower\n"
	else
	  add_follower.each { |fr| mail_body << fr +"\n" }
	end
	mail_body << "\n"
	mail_body << "*** Remove Follower(s) ***\n"
        if(bye_follower.length == 0)
          mail_body << "No Bye Follower\n\n"
        else
          bye_follower.each { |fr| mail_body << fr +"\n" }
        end

	mail_body.chomp
	send_mail(mail_body)
end

def send_mail(body)
	today = Date.today
	mail = TMail::Mail.new
	mail.to = $mail_to
	mail.from = $mail_from
	mail.reply_to = $mail_from
	mail.subject = "Fuetter Report "+ today.strftime("%Y/%m/%d")
	mail.body = body

	mail.date = Time.now
	mail.mime_version = "1.0"
	mail.set_content_type 'text', 'plain', {'charset'=>'iso-2022-jp'}

	mail.write_back

	Net::SMTP.start($smtp_server) do |smtp|
	  smtp.sendmail(mail.encoded, mail.from, mail.to)
	end
end

read_yaml
get_my_followers(File.exists?("followers.txt"))