仮想サーファーの波乗り

仮想サーファーの日常

プログラミング・SNS分析・仮想通貨・自動化などに関してよく書く雑記ブログ

Pythonでwebアプリケーション開発⑦ ~TwitterAPIで自動フォロー/アンフォロー改良版~


以前、TwitterのAPIを触ってみよう企画第3回目でTwitterAPIを使って特定のユーザーをフォロー/アンフォローする機能をご紹介しましたが、そのコードを改良してより実践的なものにしたので、ご紹介しておきます。これを実行するだけで、フォロー/アンフォローをボタンからポチポチすることは1度も無くなりました。(早く自動実行も実装しなきゃ。。。)


TwitterのAPI利用準備

まだTwitterのAPI準備をしていない方は、こちらを参考にAPIを使える状態にしておいてください。


特定条件でのアカウントのフォロー外す

まずは、フォローしていてもリフォローしてくれなさそうなアカウントのフォローを外していく以下のプログラムを、任意のファイルに記述します。

import tweepy
import os
import time

# TwitterAPIの認証データを取得して認証
CONSUMER_KEY = os.environ['CONSUMER_KEY']
CONSUMER_SECRET = os.environ['CONSUMER_SECRET']
ACCESS_TOKEN = os.environ['ACCESS_TOKEN']
ACCESS_TOKEN_SECRET = os.environ['ACCESS_TOKEN_SECRET']
auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET)
auth.set_access_token(ACCESS_TOKEN, ACCESS_TOKEN_SECRET)

api = tweepy.API(auth)
my_screen_name = "virtual_techX"

# 自分がフォローしているアカウントをチェックして、特定人数を上限に、フォロー返してくれなさそうなアカウントのフォローを外していく。
delete_count = 0
loop_out = False
for loop_count in range(2):
    print("----------------------------------")
    print(str(loop_count + 1) + "回目のループ開始!")
    print("----------------------------------")

    following_ids = api.friends_ids(my_screen_name)
    followers_ids = api.followers_ids(my_screen_name)
    check_count = 0
    # 同じ人たちを判定しなくていいように、逆からチェックしていく。
    if loop_count == 0:
        following_ids.sort()
    elif loop_count == 1:
        following_ids.reverse()

    for following_id in following_ids:
        check_count += 1
        if check_count > 400:
            break
        print("----------------------")
        print(str(check_count) + "人目のアカウントチェック!今んとこ" + str(delete_count) + "人のフォロー外した")
        print("following_id:" + str(following_id) + "に関してチェック!")
        if delete_count > 400:
            loop_out = True
            print(str(delete_count) + "人フォロー外したから抜ける!")
            break
        for followers_id in followers_ids:
            if following_id == followers_id:
                print("following_id:" + str(following_id) + "にはフォローされてたからOK!")
                break
        following = api.get_user(following_id)
        user_follower_count = following.followers_count
        user_following_count = following.friends_count
        # 「フォロワー数が2000より小さい」もしくは「フォロワー数がフォロー数の1/2以下」の場合はフォロー削除
        if user_follower_count < 2000 or user_following_count / user_follower_count > 0.5:
            user_id = following.id
            user_name = following.name
            screen_name = following.screen_name
            location = following.location
            api.destroy_friendship(user_id)
            print(user_id, ":",
                  user_name + "@" + screen_name + "(" + location + ")はフォロワー:" + str(user_follower_count) + "人,フォロー:" + str(
                      user_following_count) + "人だったからフォロー外した")
            delete_count += 1
        else:
            print("following_id:" + str(following_id) + "はフォローしすぎてなかったからOK!")

    print("----------------------------------")
    print(str(loop_count + 1) + "回目のループ終了!")
    print("----------------------------------")

    # 特定人数フォロー外したから抜ける
    if loop_out:
        print(str(delete_count) + ":人フォロー外したし、処理終わるよ!!")
        break

    # まだ処理続けるなら、次のループまで7.5分休む
    print(str(check_count) + "回連続でAPIアクセスしたから、7.5分休みますわ...。")
    time.sleep(450)

プログラムが書けたら、自分好みに変数を一部書き換えるなどして実行してみてください(実行方法が分からない方はコチラを参考にどうぞ)。一応、何か不具合が起きた時にどこで問題が起きたか、フォロー外したのが何人なのかを確認するために、コンソールに情報が表示されるようにしています。

上述のフォロー外す処理の頻度に関して。これは何回か試していく中で発見したことでもあるのですが、基本的に2日間フォローしている状態でフォローバックがない場合、それ以降にフォローバックが行われる可能性は超低かったです。なので、2日(48時間)に1回程度の頻度で以上のプログラムを実行してフォローを外していくと、効果が最大化されるなぁという実感を現状持ってます。


特定単語での検索結果アカウントをフォロー

次に、特定の単語でつぶやいているもしくはプロフィールにその単語が含まれているアカウントを順次フォローしていきます。以下のプログラムを任意のファイルに書いて実行します。

import tweepy
import os
import time

# TwitterAPIの認証データを取得して認証
CONSUMER_KEY = os.environ['CONSUMER_KEY']
CONSUMER_SECRET = os.environ['CONSUMER_SECRET']
ACCESS_TOKEN = os.environ['ACCESS_TOKEN']
ACCESS_TOKEN_SECRET = os.environ['ACCESS_TOKEN_SECRET']
auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET)
auth.set_access_token(ACCESS_TOKEN, ACCESS_TOKEN_SECRET)

# 特定の単語でつぶやいているユーザーを5人検索して、フォローされておらず、フォロワーが200人以上いればフォロー。
api = tweepy.API(auth)

follow_count = 0
loop_out = False
for loop_count in range(7):
    print("----------------------------------")
    print(str(loop_count + 1) + "回目のループ開始!")
    print("----------------------------------")
    if loop_count == 0:
        query = "ブロックチェーン"
    elif loop_count == 1:
        query = "仮想通貨取引所"
    elif loop_count == 2:
        query = "coincheck"
    elif loop_count == 3:
        query = "bitFlyer"
    elif loop_count == 4:
        query = "資産運用"
    elif loop_count == 5:
        query = "個人事業"
    elif loop_count == 6:
        query = "Dapps"
    elif loop_count == 7:
        query = "イーサリアム"
    # Max100人までしか検索できないぽい。また、単語検索結果で検索結果出てきたアカウント数が上限となる。
    search_count = 100
    my_screen_name = "virtual_techX"

    followers_ids = api.followers_ids(my_screen_name)
    following_ids = api.friends_ids(my_screen_name)
    check_count = 0
    search_results = api.search(q=query, count=search_count)
    for result in search_results:
        # フォロー人数が特定人数以上になったらループ抜けて処理終了。
        if follow_count > 500:
            loop_out = True
            break
        user_id = result.user.id
        check_count += 1
        print("-----------------------------------------")
        print("[" + str(loop_count + 1) + "ループ目] 現状" + str(follow_count) + "人を新規フォロー。" + str(check_count) + "人目のアカウント(following_id:" + str(user_id) + ")をチェック開始!")
        # 検索結果のユーザーにすでにフォローされていたら、フォロー処理をせずにループを次に進める。
        if user_id in followers_ids:
            print("following_id:" + str(user_id) + ")からはすでにフォローされてたからスルー!")
            continue
        # 検索結果のユーザーをフォローしていたら、フォロー処理をせずにループを次に進める。
        if user_id in following_ids:
            print("following_id:" + str(user_id) + ")はすでにフォローしてたからスルー!")
            continue
        user_follower_count = api.get_user(result.user.id).followers_count
        user_name = result.user.name
        screen_name = result.user.screen_name
        print("----------------------")
        if user_follower_count < 100:
            print(user_id, ":", user_name + "@" + screen_name, "はフォロワーが" + str(user_follower_count) + "人しかいないからフォローしなかったす")
        else:
            try:
                api.create_friendship(user_id)
                print(user_id, ":", user_name + "@" + screen_name, "はフォロワーが" + str(user_follower_count) + "人いて、まだフォローされてなかったからフォローしたっす")
                follow_count += 1
            except:
                print(user_id, ":", user_name + "@" + screen_name, "はフォローできんかった...なぜ??")

    print("----------------------------------")
    print(str(loop_count + 1) + "回目のループ  終了!")
    print("----------------------------------")
    # フォロー上限になったらループ抜ける
    if loop_out:
        break
    # アクセス連続しすぎるとやばいかもだから5分待つ(5分待つことで、153APIアクセス/5分 = 459APIアクセス/15分でAPIアクセス上限に引っかからないはず。)
    print("5分待ちます")
    time.sleep(300)

query="XXX" の箇所に入れる単語で検索してフォローしていくことができます。1度の検索では上限が100件だったようなので、7回ループしてMax700アカウントの チェックをするような処理にしています。


まとめ

僕は今回紹介した2つのプログラムを2日に1回(たまに1週間に1回とかになる)実行しています。これによってTwitterのフォロー/アンフォロー処理は半自動化することができました。ちなみに、先にフォローを外す処理をして、そのあとにフォローしていく処理をしていく方がいい気がしています。フォロー人数の方がフォロワー人数よりも多いアカウントって何となく怪しいですよね。

「フォロワー数 / フォロー数」×「フォロワー数」 = 「ツイッター戦闘力」

上の等式がツイッターにおける戦闘力の高さだと認識しているので、いかにフォロー人数が少ないままでフォロワー数を増やすことができるかどうかがカギな気がしてます。


世界最大級のオンライン学習サイトUdemy

↑UdemyでPythonの講座あるので基本的な文法はこちらで学んでもよいかもです。


では!