1日のfollowerの増減をメールで送信
最近というか前から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の数と実際の数が合わないのはなんででしょうか?
ブロックを複数窓でするとなるのでしょうか?