Mechanizeで全フォロワーをフォロバ。

#Mechanizeで自動でフォローバックするスクリプト

TwitterAPIなどを使わずに、email, password, アカウント名(どのアカウント名でも可能)のみでそのアカウントをフォローしている全フォロワーをフォローすることができるプログラムです。

1.Twitterのアカウントにログイン
2.フォロワーページへ移動
3.フォローしてないユーザーをフォロー

フォロワーページは一度に15ユーザーくらいしか表示されないので、2と3を繰り返す感じになります。

##コード
```ruby:auto-follow.rb
#coding: utf-8
require 'rubygems'
require 'mechanize'


# Mechanizeクラスを継承するTwitterAgentクラスを定義
class TwitterAgent < Mechanize

  # 引数にログイン名（メアド）とパスワードを渡してログイン
  def login(user_name, password)
    uri = "https://mobile.twitter.com/session/new"
    page = self.get(uri)
    unless page.meta_refresh.empty?
      page = self.get(page.meta_refresh[0].uri.to_s)
    end
    forms = page.form[0]
    forms['session[username_or_email]'] = user_name
    forms['session[password]'] = password
    page = forms.submit
    return page
  end

  # アカウント名を渡してフォロワーページを取得
  def to_followers_page(account_name)
    uri = "https://mobile.twitter.com/#{account_name}/followers"
    return self.get(uri)
  end

  # フォロワー一覧ページを渡して次のフォロワーページへ移動
  def move_next_page(page)
    if page.link[-5].text.include?("ユーザーを表示")
      page = page.links[-5].click
    else
      page = nil
    end
    return page
  end

  # フォロワー一覧ページを渡して、そこにいるフォローしていないユーザーを全員フォローする
  def follow_back_all(page)
    page.forms.each do |form|
      if form.action.include("/follow")
        button = form.buttons[0]
        self.submit(form, button)
      end
    p "FOLLOW!!"
    end
  end
end

```

以上のコードでフォロバする準備が整いました。

##コード解説

###gem, class定義
```ruby
require 'mechanize'

# Mechanizeクラスを継承するTwitterAgentクラスを定義
class TwitterAgent < Mechanize
```

自分の代わりにweb上を移動してくれるエージェントを作るためにMechanizeというgemを使います。
http://seesaawiki.jp/ruby_mechanize/
に細かなクラス、メソッドの解説がありますので参考にしてください。

今回はMechanizeクラスを継承したTwitterAgentクラスを定義していきます。

###ログイン
```rb
# 引数にログイン名（メアド）とパスワードを渡してログイン
  def login(user_name, password)
    uri = "https://mobile.twitter.com/session/new"
    page = self.get(uri)
    unless page.meta_refresh.empty?
      page = self.get(page.meta_refresh[0].uri.to_s)
    end
    forms = page.form[0]
    forms['session[username_or_email]'] = user_name
    forms['session[password]'] = password
    page = forms.submit
    return page
  end
```

 ユーザ名とパスワードを渡してエージェントをログインさせるloginメソッドを定義します。
 Mechanizeクラスの、指定したurlの情報を取得するgetメソッドでtwitterのログイン画面のformなどを取得してpageに代入します。
取得したページにmeta_refreshが設定されている場合はそちらのページをpageに代入しましょう。*[meta_refresh](http://www.newcredge.com/IT/www/html/tag/page/jump.html)
 page.form[0]でログインページのフォームを取得します。
formのemail,password欄にログイン名とパスワードを入力してsubmitでログインします。

###フォロワー一覧ページ

```rb

 # アカウント名を渡してフォロワーページを取得
  def to_followers_page(account_name)
    uri = "https://mobile.twitter.com/#{account_name}/followers"
    return self.get(uri)
  end

 # フォロワー一覧ページを渡して次のフォロワーページへ移動
  def move_next_page(page)
    if page.link[-5].text.include?("ユーザーを表示")
      page = page.links[-5].click
    else
      page = nil
    end
    return page
  end
```

引数にアカウント名を渡して、フォロワー一覧ページに飛びます。
move_next_pageメソッドで、一覧ページを渡して次の一覧ページに飛びます。
下から5番目のリンクが次のユーザーページへのリンクなので、そこに"ユーザーを表示"という文字列が含まれる場合そのリンクをクリックして次のページを取得します。

###フォローバック

```rb
 # フォロワー一覧ページを渡して、そこにいるフォローしていないユーザーを全員フォローする
  def follow_back_all(page)
    page.forms.each do |form|
      if form.action.include("/follow")
        button = form.buttons[0]
        self.submit(form, button)
      end
    p "FOLLOW!!"
    end
  end

```

フォロワー一覧ページを渡してそのページ上のフォローしていないユーザーをフォローします。
page.formsでフォームを取得して、/followという文字列を含む場合にsubmitしてフォローします。

##実行

```
user = {
	:account   => "アカウント名",
	:email     => "ログイン名",
	:password  => "パスワード"
}


agent = TwitterAgent.new
agent.login(user[:email], user[:password])
page = agent.to_followers_page(user[:account])
while !page.nil?
	agent.follow_back_all(page)
	page = agent.move_next_page(page)	
end
```

以上で、あるアカウントをフォローしている全ユーザーをフォローし返すことができます。
自動的にこれを実行したい場合はcronで定期的に実行するなどの方法が考えられます。