net/imapでGMailのメールを取得

自動でfollowするように、GMailに届いたfollow通知からユーザ名を取り出してみる。IMAPでやってみた版。

参考:katoy: cocolog: ruby で gmail (imap) にアクセスする練習

require 'net/imap'

followers = []
username = "hoge"
password = "hogehoge"

port = 993
usessl = true

begin
imap = Net::IMAP.new("imap.gmail.com", port, usessl)
p imap.greeting
imap.login(username, password)
imap.examine("inbox")
imap.fetch(1..-1, "ENVELOPE").each do |f|
messageNo = f.seqno
subject = f.attr["ENVELOPE"].subject
to_mailbox = f.attr["ENVELOPE"].to[0].mailbox
if to_mailbox == "hoge+bot" && # To:がhoge+bot@gmail.comのものを取り出す
/is now following you on Twitter/ =~ subject
imap.fetch(messageNo, "RFC822").each do |m|
# ユーザ名を得る
if /http:\/\/twitter\.com\/(\w+)/ =~ m.attr["RFC822"]
p $1
followers << $1
end
end
end
end
followers.each { |u|
follow(u)
}
p "success"
rescue
p "failed"
end

twitter4r その2

例のBotがFollowされるたびに、手動でFollowをする必要があった*1ので、twitter4rのfriend関連の機能を使って、自動Followを実装してみた。

def follow(friend_name)
config_file = File::join(File.dirname(__FILE__), "conf_m.yaml")
twitter = Twitter::Client.from_config(config_file, "prod")
fri = twitter.my(:friends)
fri.each { |user|
return if user.screen_name == friend_name
}
twitter.friend(:add, friend_name)
end

ログインしているところは前と同じ。my(:friends)でログインユーザのFollowing一覧を取得して、既に登録している人は弾く。friend(:add, ユーザ名)で指定したユーザをFollowする。

メールサーバを動かしていないので、一定間隔でGMailを見て新規Followerを取得してます。こっちは毎分動かしているわけではないのですぐにFollow返しはできません><

*1:大変けまらしい勢いでした

twitter/Hinnyu

Twitter / Hinnyu

Followingの特定の言葉に激しく反応します。手動Botと言われてる人に対抗するために作ってみました。現在自動Followを行っていないので登録まで時間がかかります。自動Followのテスト中です。登録まで大体1時間ほどかかります。

胸板が厚いのでPicture書いてくれる人募集中。

以下、実装の詳細とか。

反応するのは以下の正規表現。

reg = /(貧乳|ひんにゅう|ひんぬー|ひんにゅー|ペチャパイ|まな板|胸ぺったん|ベニア板|洗濯板)/

語尾のパターンはこんだけ。あんまりパターンがないのでこれも案募集中。

message = ["と申されたか!", "と申されたな!", "は正義!", "はステータスだ 希少価値だ", "と申しましたな!?", "はいいものだ"]

以下の2つには反応しない。

  • マッチする正規表現+”bot” (大文字小文字無視)
  • /^@w+s/

2番目のように、今のところBot本体に@投げられても無視します。

あと、同じ発言に何回も反応しないように、最新の発言のidを記録しておいて、それ以上昔の発言は追わないようになってます。

元ネタの手動Botから引き継いだ機能として、一部の人にはまったく違う反応をします。下のコメント欄とかtwitterで@やDMいただければ一部の人に追加する対応もします(Botの名前とは全然関係なくなりますが)。