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

まめ畑

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

1日のfollowerの増減をメールで送信

Ruby Twitter

最近というか前からTwitterからfollowメールが来ないので、何かいい手は無いかと思っていたり。
自分は1日にどんくらいremoveされてるのかがすっごく気になったの1日のfollowerの増減をメールで送ってくれるスクリプトを書いてみた。


正直removeが多かったら涙目になりますね。わかってます。


今回はRubyにて作成したので、前からBot作成用に落としておいたtwitter4rを使おうかと思ったのですが、こいつではfollowerを100人まで(APIの1ページ分)しか取得出来なかったのでしょうがないので、WEBから取得する事に。
でも、ログイン方法で悩み困っていたらhttp://d.hatena.ne.jp/beatinaniwa/20080118を発見。
mechanizeといういいものを知る。


そこで、こちらのエントリーのソースを使わせていただきメール送信部分を追加しました。多謝。
また、本家Twitterの構造が若干変わっていたのでPathをすこーし変更しました。
こちらは、mechanizeとtmailがいるのでgemって下さい。


あと、余談ですがtwitter4rの0.3.0を使おうとしたら、model.rbでエラーが出るのです。
ソースみたら、require timeがなかったので追加したらエラーでなくなりました。


ソースを晒してみます。
汚いし書き方おかしいですが、一応動きます。
もっと綺麗に書きたいです。
日々勉強

  • fuetter.rb
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['username_or_email'] = $id
	login_form['password'] = $pass
	my_home = agent.submit(login_form)
	agent
end

def get_my_followers(isFileExists = false)
	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
end

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

	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"))


同じディレクトリにfuetter.yamlを以下のフォーマットで書きます。

user:
  id: twitterのID
  pass: twitterのPASS

mail:
 server: smtpサーバーアドレス
 to: 送信先アドレス
 from: 送信元アドレス


これをcronで1日に一回実行しています。
0時に実行は

00 00 * * * ruby fuetter.rb

こんな感じです。


fuetterという名前ですが、減る事もあるので注意です。



それと、WEBで表示されているfollowerの数と実際の数が合わないのはなんででしょうか?
ブロックを複数窓でするとなるのでしょうか?