tweepyを用い、条件指定してフォローバック

## はじめに
 Twitterではフォローされることがしばしば有りますが、その度にユーザを確認してフォローを返すのは手間が掛かり面倒です。なので適当な条件を指定して、一括でフォロー出来れば便利だなってことで記事を投稿しました（きっとn番煎じ)。

## ほんきじのないよう
 pythonのモジュールでTwitterのAPIを手軽に扱うことが出来るtweepyを用いて、フォローをしてくれているけど、フォローを返していないユーザをフォローする（フォローバック）方法について紹介します！

#### 今回フォローバックする条件は以下の2つ
* フォロー相手の相互フォロー数が2000アカウント以下
* 1日の平均ツイート数が50ツイート以下

（他にもフォロー数とフォロワー数の差、趣味嗜好など、色々なフォローバック基準はあると思いますが……）
 

## かいはつかんきょう
 OS X 10.9.4 (Marvericks)
 python 2.7.5
 tweepy 2.3   http://www.tweepy.org/


## じぜんじゅんび
#### Twitter Developersからアクセストークンを取得
 Twitter Developers
 https://dev.twitter.com/

 アクセストークンの取得方法については下記のURLが非常に分かりやすいです。手順1と2に従い、アクセストークンを取得します。
http://syncer.jp/twitter-api-how-to-get-access-token

#### tweepy 2.3を導入
 pythonのパッケージ管理システムpipでtweepyを導入します（pyenvが使える方はそちらも使って）
 基本的に最新版のインストール推奨ですが、tweepyは頻繁に仕様が変更されるので一応バージョン指定方法を記載。
 `pip install tweepy==2.3`
 
## しょりのながれ
1. 認証後のapiを取得
2. 自分と相互フォローの全ユーザオブジェクトを取得
3. 自分のフォロワーの全ユーザオブジェクトを取得
4. 未フォローバックのユーザを条件に適合する場合はフォロー

## そーすこーど

```python:follow_back.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import datetime
import logging

import tweepy


def get_api():
    API_KEY = "api key"
    API_SECRET = "api secret"
    ACCESS_TOKEN = "access token"
    ACCESS_TOKEN_SECRET = "access token secret"

    auth = tweepy.OAuthHandler(API_KEY, API_SECRET)
    auth.set_access_token(ACCESS_TOKEN, ACCESS_TOKEN_SECRET)

    return tweepy.API(auth_handler=auth, wait_on_rate_limit=True)

def get_all_my_friends(api):
    all_my_friends = list()
    for friend in tweepy.Cursor(api.friends).items():
        logger.warning('Retrieving data from Twitter.')
        all_my_friends.append(friend)
    return  all_my_friends

def get_all_my_followers(api):
    all_my_followers = list()
    for follower in tweepy.Cursor(api.followers).items():
        logger.warning('Retrieving data from Twitter.')
        all_my_followers.append(follower)
    return all_my_followers

def follow_user_with_conditions(target_user, upper_limit_of_friends=2000, upper_limit_of_crazy=50):
    twitter_experience_days = (datetime.datetime.now() - target_user.created_at).days
    crazy = target_user.statuses_count * 1. / twitter_experience_days

    if target_user.friends_count < upper_limit_of_friends and crazy < upper_limit_of_crazy:
        target_user.follow()
        print u"ユーザ名:{0:15}  ツイート数:{1:<9d}  廃人度(tweets/a day):{2:.2f}".format(target_user.screen_name, target_user.statuses_count, crazy)
        return True
    return False


if __name__ == "__main__":

    FORMAT = '%(asctime)s - %(name)s - %(message)s'
    logging.basicConfig(format=FORMAT)
    logger = logging.getLogger('twitter_api')

    api = get_api()

    all_my_friends = get_all_my_friends(api)

    all_my_followers = get_all_my_followers(api)

    #　フォロワーで相互フォローしていないユーザをフォローする
    for unknown_follower in all_my_followers:
        if unknown_follower not in all_my_friends:
            follow_user_with_conditions(unknown_follower)

```

## ほそく
* 関数get_api()の定数には事前準備で取得したアクセストークンなどを入力してください
* TwitterのAPIには時間幅における取得上限が設定されているため、終了までに時間がかかる場合があります

## おわりに
 本記事ではtweepyを用いてフォローバックする方法について紹介してみました。フォローバック条件には相互フォロー数、一日のツイート数を設定しました。

## こんごのてんぼう
今後の拡張方法としては、頻繁にAPIを叩くことになり規制されて時間がかかってしまいますが、フォローするユーザの発言数を最大3200件取得し、スパムかどうか調べたり、趣味嗜好の傾向が自分と似ているか、などあるとおもいます。ここからはnltk(自然言語処理)やscikit-learn(機械学習), orange(Data Mining)などといったツールの出番ですね！
またそこまで大掛かりにならなくても、その他のユーザ情報を用いてフィルタリングしたりも出来そうです。
需要がありそうなら次回考えます（やるとは言っていない