仮想サーファーの波乗り

仮想サーファーの日常

プログラミング・エンジニアのスキルアップ・ブログ運営などに関してよく書く雑記ブログ

➡ Udemyで8/27(木)まで割引セール開催中! 1,200円〜で普段の90%以上OFF!

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のフォロー/アンフォロー処理は半自動化することができました。ちなみに、先にフォローを外す処理をして、そのあとにフォローしていく処理をしていく方がいい気がしています。フォロー人数の方がフォロワー人数よりも多いアカウントって何となく怪しいですよね。

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

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


Pythonをしっかり学びたい方向け

最後に、Pythonをしっかり学びたいという方向けにおすすめの学習ツールを紹介しておきます。


スッキリわかるPython入門 スッキリわかるシリーズ

そもそもPythonの書き方が分からないという方はこちら、安いし分かりやすいのでオススメです。


プログラミング言語 Python 3 入門

f:id:virtual-surfer:20191207103500p:plain

このコースで学べること

  • Pythonの基礎(データ、制御フロー、関数、データ構造、モジュール、例外(エラー)、クラス、入力と出力、標準ライブラリ)
  • ターミナルを使用したPythonの実行
  • PyCharmを使用したPython ファイルの作成・デバッグ実行

Pythonの基礎の基礎が丁寧に開設されていて、Python初心者の方でもPythonへの理解が深まりやすいUdemyのコースです。

Pythonの仕組みを基礎からしっかりと理解しておきたい方にオススメです。


【プログラミング言語 Python 3 入門】をUdemyで見てみる


Pythonで作業の自動化・効率化

Pythonでのプログラミング学習中の方向けに、Noteでより詳細なプログラミングチュートリアルを配信しているので、そちらもチェックしてみてください( ・v・)/

note.mu


では!