行政書士ボット

機械学習で進化する行政書士Gyobot Blog

2022年3月16日21:41(約790日前)

Twitterの相互フォロー関係を確認するPythonプログラム

開発

フォロワーが増えすぎて誰と相互フォローになっているのかわからなくなってしまったら?

最近は行政書士をはじめとする士業の間でもSNSでの集客がスタンダードになってきたように思います。
しばらくTwitterを運用しているとフォローの相互関係の整理をしたくなることがありますよね。
できれば相互フォローしているアカウント以外から整理していきたいなと思うのが人情だと思いますが、フォロー関係が増えると以下のような問題に直面します。

フォロー関係が増えすぎて誰と相互フォローになっているのか確認ができない…

ツイッターユーザーの中にはアフィリエイトや自身のフォロワーを増やす目的で一方的にフォローしてきて相互フォローになったのを確認してフォローを外すようなユーザーもいます。
フォロワーが増えてくると目視でそのようなフォロー関係を見つけるのは難しくなってきます。
そんな場合でも人工知能やデータ分析で話題のプログラミング言語、Pythonを使えば簡単に自分のアカウントとのフォロー関係を一覧で取得することができます。

このプログラムでできること

このプログラムではTwitterのフォローとフォロワーを解析することで、以下の相互フォロー状態を確認します。

  • 自分が一方的にフォローしているアカウント
  • 自分が一方的にフォローされているアカウント
  • 相互フォローしているアカウント

※便宜上「自分が」としていますが、他者のアカウントの相互フォロー関係を調査することも可能です。

このプログラムを使用する前提条件

今回ご紹介するプログラムを使用するにあたって、前提条件として以下が必要です。
そのため初心者でも全く問題ありませんが、最低限Pythonを触ったことがある程度の知識が必要です。
プログラミング経験のない方やこのプログラムの機能のみを使用してみたい場合は、Gyobotに「ツイッターの相互フォロー関係を知りたい」などと話しかけてみてください。
最大100件までの制限はありますが、本記事のプログラムと同様の機能を使用できます。

  • Python3がインストールされている
  • TwitterAPIからAPIキーを発行している

まず大前提としてPython3がインストールされている必要があります。
venv等を使用して、仮想環境を構築した上で以下を実行することをおすすめします。
また当記事では詳細解説しませんが、TwitterAPIはTwitter Developer Platformというツイッターの開発者向けサービスから申請することができます。
上記の準備作業はそれほど難しい話ではないので、これをきっかけにPythonやプログラミングを始めてみるという事でもよろしいかと思います。
需要がありそうでしたら、Pythonのインストールや環境構築などの最初の一歩の記事も公開していきたいと思います。

動作確認環境

  • MacOS10.15.7
  • Python 3.9.5
  • tweepy 4.6.0

Twitterを制御するライブラリtweepyをインストールする

TwitterをPythonから実行するために、以下のコマンドを実行してtweepyをインストールします。
仮想環境を構築している場合は、仮想環境内で以下を実行します。

$(env) pip install tweepy

上記のコマンドでtweepyの最新版がインストールされます。
tweepy 3.6.0などの古いバージョンのtweepyではAPI取得メソッドの仕様が若干異なるため以下で紹介するプログラムではエラーが発生します。
そのため最新版のtweepyをインストールするようにしてください。

対象のアカウント相互の関係性を調べるプログラム

以下が実際のプログラムになります。
以下のプログラムをそのままコピーしてPythonが実行できる環境にファイルを作成して貼り付けます。
つぎに5行目のTARGET_ACCOUNTに@で始まるご自身のアカウントもしくは他の調査したいアカウントを入力します。
最後に発行したAPIキーの情報を8〜11行目に書き換えます。
ファイル名は何でも構いませんが、以下の実行コマンドの解説の都合上、今回はget_tw_relationship.pyとしています。

ファイル名:get_tw_relationship.py

import tweepy
 
 
# 調査対象アカウント
TARGET_ACCOUNT = "@xxxxxx"
 
# TwitterDeveloperPlatformから取得したAPIキーとトークンを入力
api_key = 'xxxxxx'
api_secret_key = 'xxxxxx'
access_token = 'xxxxxx'
access_token_secret = 'xxxxxx'


# フォロワーとフォローのIDを返す
def return_followers_and_friends(api, account):
    # フォロワーID
    followers_set = api.get_follower_ids(screen_name = account, cursor = -1)
    followers = followers_set[0]
    
    # フォローID
    friends_set = api.get_friend_ids(screen_name = account, cursor = -1)
    friends = friends_set[0]
    return followers, friends


# 各IDの@で始まるアカウント名と表示名を返す
def print_name(api, ids):
    for id in ids:
        screen_name = api.get_user(user_id = id).screen_name
        name = api.get_user(user_id = id).name
        print(f'@{screen_name} / {name}')
    print(f'完了(全{len(ids)}件)')


# メイン処理
def main():
    # ユーザー入力から抽出のパターンを選択
    user_want = input('どのパターンを知りたいですか?\n・一方的にフォローしている\n・一方的にフォローされている\n・相互フォロー\nいずれかを入力してください:')

    # API接続
    auth = tweepy.OAuthHandler(api_key, api_secret_key)
    auth.set_access_token(access_token, access_token_secret)
    api = tweepy.API(auth=auth, wait_on_rate_limit=True)

    print('フォロワーとフォローのID取得中…')
    followers, friends = return_followers_and_friends(api, TARGET_ACCOUNT)
    
    # 関係性別に出力
    zero_count_text = '0件です'
    if 'フォローして' in user_want:
        print('*'*20, TARGET_ACCOUNT, 'が一方的にフォーローしている', '*'*20)
        only_me = set(friends) - set(followers)
        if only_me:
            print_name(api, only_me)
        else:
            print(zero_count_text)
    elif 'フォローされて' in user_want:
        print('*'*20, TARGET_ACCOUNT, 'が一方的にフォーローされている', '*'*20)
        only_other = set(followers) - set(friends)
        if only_other:
            print_name(api, only_other)
        else:
            print(zero_count_text)
    elif '相互フォロー' in user_want:  
        print('*'*20, '相互フォーローしている', '*'*20)
        mutual_follows = set(followers) & set(friends)
        if mutual_follows:
            print_name(api, mutual_follows)
        else:
            print(zero_count_text)
    else:
        print('有効なパターンではありません。')
        sys.exit()


if __name__ == '__main__':
    main()

もし何らかの事情で最新版が使えずにtweepy 3.6.0などの古いバージョンを使用する場合は以下のように書き換えることで動作します。

17行目

followers_set = api.followers_ids(id = account, cursor = -1)

21行目

friends_set = api.friends_ids(id = account, cursor = -1)

43行目

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

コード解説

tweepyのおかげでたったこれだけのコードで目的を達成できます。
なお、本来はAIPが取得できなかった場合やユーザーから意図しない入力がされた場合のために例外処理などを入れた方がプログラム的に良いですが、コード簡略化のために今回は入れていません。

Python固有の部分で言うと最後から2行目のif __name__ == '__main__':以下がこのプログラムが直接実行された場合の処理で、Pythonではこの下にmain()としてmain関数にメインの処理を書くことが多いです。
これはこのプログラムがモジュールとして読み込まれた場合を想定して、直接実行される場合と分けたいがためにする処理です。

メインの処理では38行目のinput関数でユーザーから受け取った文字列を元に取得したい情報のパターンごとに処理を分岐します。

tweepy関連のメソッドでは、43行目のtweepy.API()がTwitterAPIに接続、17行目のapi.get_follower_ids()が調査対象のアカウントのフォロワーのIDを取得するメソッド、21行目のapi.get_friend_ids()が調査対象のアカウントがフォローしているIDを取得するメソッドとなっています。
つまりこのtweepyに用意されている関数を利用するだけで対象のアカウントに関するさまざまな情報を取得することができます。
参考にその他のget系メソッドの一部をご紹介します。

api.home_timeline() 登録されたAPIキーのアカウントのタイムラインのツイートを取得する
api.get_favorites() 登録されたAPIキーのアカウントのお気に入りのリストを取得する
api.get_followers() 登録されたAPIキーのアカウントのフォロワーをリストで取得する
api.get_direct_messages() 登録されたAPIキーのアカウントのダイレクトメッセージをリストで取得する

上記はget系のメソッドだけですが、実際には各種書き換えやツイートもプログラムから実行できるようにtwitter操作のためのあらゆるメソッドが用意されています。そのためPythonとtweepyを利用してツイートの自動化やTwitterボットの作成などTwitter更新のDX化に幅広く応用できます。
例えば今回のget_tw_relationship.pyを改修してフォローが一方的になっているアカウントを確認してフォローを外すまでを自動化するなどの応用が考えられますね。

プログラムの実行

プログラムの実行はget_tw_relationship.pyを置いたPython実行環境のディレクトリ で以下のコマンドを実行します。

$(env) python get_tw_relationship.py

プログラムを実行すると以下のように表示されるので、「いずれかを入力してください:」の後に取得したいパターンを入力します。

どのパターンを知りたいですか?
・一方的にフォローしている
・一方的にフォローされている
・相互フォロー
いずれかを入力してください:

以下の表示がされるとTwitterAPIから情報の取得を開始します。

フォロワーとフォローのID取得中…

以降で相互フォロー関係を解析した結果を返します。

取得結果

例えば一方的にフォーローしているを選択した場合、以下のように1軒ずつアカウントが出力されます。

******************** @xxxxxx が一方的にフォーローしている ********************
@hoge_user01 / HogeHoge1
@hoge_user02 / HogeHoge2
@hoge_user03 / HogeHoge3

結果出力が完了すると以下のように「完了(全x件)」のように完了報告と取得件数が表示されます。

完了(全3件)

以上のように調査対象のアカウントが持っている相互フォロー関係を一覧で取得できました。

取得件数が多い場合

$ Rate limit reached. Sleeping for: 631

フォローやフォロワーの数が多い場合は実行結果の出力中に以下のような表示がされます。
TwitterAPI が各エンドポイントで単位時間あたりの受付回数を制限しているのですが、それを超えてしまったために表示されるエラーです。
しかしプログラムの43行目でwait_on_rate_limit=Trueとしているためレート制限が補充されるまで自動待機します。
そのため気長に待つことになりますが、結果は表示されます。

まとめ

Twitterは行政書士にとっても単に集客だけではなく、コミュニケーションツールとしても重要な役割を果たしつつあります。
フォローやフォロワーが増えてきて管理しづらくなってきたとしても、関係を調査せずに一方的にフォローを外してしまったりしてしまうと、外されたことを気にするTwitterユーザーも多いです。
無用な争いを避けるためにもこのプログラムを使って関係性を一覧で確認してから相互フォロー関係を整理すると良いかもしれません。

またこのプログラムは5行目のTARGET_ACCOUNTに自分以外のアカウントを入力すれば他者アカウントの相互フォロー関係を調査することも可能です。
相互フォロー関係を調査することで、そのアカウントのTwitter上での交友関係やTwitterをどのように利用しているのかを分析することもできそうです。

普段プログラミングに馴染みのない方にとっては少し難しい記事だったかもしれませんが、Pythonを使えるようになれば、職業プログラマーではなくても簡単に統計を取ったり日々の業務を自動化したりすることができるようになります。
もしこれをきっかけにプログラミングやPythonにご興味を持たれば場合はぜひチャレンジすることをおすすめします。
日々の業務がぐっと楽になりますよ。
今後はPythonや自動化に関するもっと基礎的な記事も増やしていこうと思います。

mion 2022年3月22日10:24(約784日前)

プログラミング興味あるけど難しいです。
全然わかりませんでした\(^o^)/

入門者向け記事期待してます!
返信する

管理者 2022年3月22日14:36(約784日前)

ありがとうございます!
読んでいただけて光栄です。

そうですよね、もともとこのブログ自体が行政書士業務に関することと機械学習の技術について書こうと思って始めたのですが、そもそも誰向けのブログなのか微妙な感じになってしまいました。

最近は行政のオンライン化も進んでいるので、Pythonを学習することで行政書士やその他の士業も業務自動化を低コストで導入できるようになるのではないかと思いPythonやプログラミングについて少しずつ発信できればと思っています。
時間的な制限もあって更新頻度がそれほど高くできないのですが、なるべく時間を見つけて情報発信していければと思っています。

もしお急ぎでしたらこのブログ以外にもPython入門的な記事や動画を見てみると良いと思います。
YoutubeだとサプーさんというVtuberの方がやられているチャンネルがわかりやすかったです。

https://www.youtube.com/channel/UC5Kgc_HNzx4GJ-w4QMeeKiQ

このブログでも初学者向けの記事頑張ります!

関連記事