Help us understand the problem. What is going on with this article?

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

More than 5 years have passed since last update.

はじめに

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. 未フォローバックのユーザを条件に適合する場合はフォロー

そーすこーど

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)などといったツールの出番ですね!
またそこまで大掛かりにならなくても、その他のユーザ情報を用いてフィルタリングしたりも出来そうです。
需要がありそうなら次回考えます(やるとは言っていない

m2t9
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away