Python3のtweepyを使ってTwitter上で相互フォローになっていないユーザーのフォローを外す

TwitterにてPython3でフォローバックしてくれていないユーザーのフォローを解除する(アンフォロー)方法を紹介します。

Webアプリケーションの中には同等のことができるサービス「片思いったー」が公開されています。 しかし、コマンドライン上で簡単に実行でき、拡張性がある方が便利なので作成しました。

こちらで紹介する方法はPythonモジュールのtweepyを使用します。

tweepyが導入されていない場合は導入してください。tweepyを用いるとTwitterのAPIを簡単に扱うことができます。

こちらの環境

  • OS:Windows10 64bit
  • Python 3.6.0 :: Anaconda 4.3.1 (64-bit)
  • tweepy 3.5.0

事前準備

tweepyのインストール

Anacondaを使用している場合は、コマンドプロンプトでこちらを入力することでインストールできます。

conda install -c conda-forge tweepy=3.5.0

その他の場合はこちら。

pip install tweepy

TwitterのAPIキーを取得する

まずは、https://dev.twitter.com/にアクセスして新しいアプリケーションを作成します。

詳しいアクセストークン取得方法は、こちらの記事がわかりやすいかと思いますので参考にしてください。

Twitter API Key を取得する方法

アクセストークンが取得できたら[manage keys and access tokens]にアクセスします。

コード

#! /usr/bin/python
import tweepy

keys = dict(
    screen_name =         'xxxxxxxx',
    consumer_key =        'xxxxxxxxxxxxxxxx',
    consumer_secret =     'xxxxxxxxxxxxxxxx',
    access_token =        'xxxxxxxxxxxxxxxx',
    access_token_secret = 'xxxxxxxxxxxxxxxx',
)

SCREEN_NAME = keys['screen_name']
CONSUMER_KEY = keys['consumer_key']
CONSUMER_SECRET = keys['consumer_secret']
ACCESS_TOKEN = keys['access_token']
ACCESS_TOKEN_SECRET = keys['access_token_secret']
 
auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET)
auth.set_access_token(ACCESS_TOKEN, ACCESS_TOKEN_SECRET)
api = tweepy.API(auth)
    
followers = api.followers_ids(SCREEN_NAME)
friends = api.friends_ids(SCREEN_NAME)
 
for f in friends:
    if f not in followers:
        print("ID:{}のフォローを解除しますか?".format(api.get_user(f).screen_name))
        if input("Y/N?") == 'y' or 'Y':
            api.destroy_friendship(f)

5行目にはご自身のTwitterIDを入力します。

6行目から9行目のxxxxの部分は、下記記載の画像を参考にご自身で作成したTwitterAPIキーに書き換えてください。

  • 5行目: Screen Name (Twitter ID)
  • 6行目: Consumer Key (API Key)
  • 7行目: Consumer Secret (API Secret)
  • 8行目: Access Token
  • 9行目: Access TokenSercret

APIキーの書き換えが終了したらunfollow.pyと名前を付けて保存します。

その後コマンドプロンプトに以下を入力:

python unfollow.py

実行すると、現在自身がフォローしているユーザーの中でフォロワー以外のフォローを解除します。

実用的に書き換えたコード

# coding: utf-8
#! /usr/bin/python
import tweepy
import time

def get_api():
    keys = dict(
        screen_name = 'XXXXXXXXX',
        consumer_key = 'XXXXXXXXX',
        consumer_secret = 'XXXXXXXXX',
        access_token =  'XXXXXXXXX',
        access_token_secret = 'XXXXXXXXX',
    )
    
    SCREEN_NAME = keys['screen_name']
    CONSUMER_KEY = keys['consumer_key']
    CONSUMER_SECRET = keys['consumer_secret']
    ACCESS_TOKEN = keys['access_token']
    ACCESS_TOKEN_SECRET = keys['access_token_secret']

    auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET)
    auth.set_access_token(ACCESS_TOKEN, ACCESS_TOKEN_SECRET)
    api = tweepy.API(auth)
    return api, SCREEN_NAME

def unfollow(api,followers, friends):
    unfollow_cnt = 0
    for f in friends:
        if f not in followers:
            if unfollow_cnt <= 50:
                api.destroy_friendship(f)
                print("{0}のフォローを解除しました。".format(api.get_user(f).screen_name))
                time.sleep(10)
                unfollow_cnt += 1
            else:
                print('一度に解除可能な人数(50人)に達したため処理を中断します。')
                break
    return unfollow_cnt

def follow(api, followers, friends):
    follow_cnt = 0
    for followerId in followers:
        count=0
        for friendId in friends:
            if followerId == friendId:
                break
            count += 1
        if count == len(friends):
            try:
                api.create_friendship(followerId, True)
                print("ID:{0}をフォローしました。".format(api.get_user(followerId).screen_name))
                time.sleep(10)
                follow_cnt += 1
            except tweepy.error.TweepError:
                print('フォローが失敗しました。')
    return follow_cnt

def yes_no_input(choice):
    while True:
        if choice in ['y', 'Y']:
            return True
        else:
            return False

if __name__ == "__main__":
    u_cnt = 0
    f_cnt = 0
    api, SCREEN_NAME = get_api()
    followers = api.followers_ids(SCREEN_NAME)
    friends = api.friends_ids(SCREEN_NAME)
    choice = input("フォロー解除を実行しますか? [y/N]: ").lower()
    if yes_no_input(choice):
        u_cnt = unfollow(api, followers, friends)
    choice = input("フォローを実行しますか? [y/N]: ").lower()
    if yes_no_input(choice):
        f_cnt = follow(api, followers, friends)
    print('{}人をフォロー解除、{}人をフォローしました。'.format(u_cnt,f_cnt))
    input()

機能としてはフォロー外しと、フォロー返しの2点です。

間隔をあけずに連続でフォロー、アンフォローを繰り返すと、スパム認定やBANが来る可能性があるので余裕をもって10秒のディレイを設けています。

同じくスパム認定対策として一度の実行でアンフォローする上限人数を50人に設定しました。

スリープ時間や上限人数に関しては各自で調節してください。

2 件のコメント

  • コメントする