Twitter API：こっちがフォローしてるのにフォローバックしてくれてないアカウント一覧の取得

#Twitter API：こっちがフォローしてるのにフォローバックしてくれてないアカウント一覧の取得

"お別れはブロックで"
"お別れはブロ解で"
"リムるならフォローするな！"
の意味がやっとわかりました今日この頃です。


前記事[【ボツ】Twitter API：フォローしているがフォローバックされてないアカウント一覧の取得](https://qiita.com/atomyah/items/c764d68835e961a0092f)のtweepyを使ったやり方がぜんぜんうまく働かないのでtweepyやめて作り替えた。

###コード

以下のコードをget_notFollwingFriends.pyなど任意の適当なファイル名で保存する。

```python
# ライブラリインポート
import json
from requests_oauthlib import OAuth1Session
 
# APIキー＆トークン設定
ConsumerAPIKey = ''
ConsumerAPIsecretkey = ''
AccsessToken = ''
AceestokenSecret = ''
 
# 対象アカウント設定
AccountUserId = ''

# フォロワーとフォロイング格納リスト
GetFollowersList = []
GetFriendsList = []

# フォロワーさんになっていないフォロイングさん格納リスト
GetNotFollowingFriedsList = []

# フォロワーを取得してリストする関数
def getFollowers():
    # フォロワー取得パラメータ設定
    Cursor = '-1'   
    GetFollowersIdsApiSession = OAuth1Session(ConsumerAPIKey, ConsumerAPIsecretkey, AccsessToken, AceestokenSecret)
    GetFollowersIdsApiUrl = 'https://api.twitter.com/1.1/followers/ids.json'

    while  Cursor != '0':
            GetFollowersIdsParameters = {
                    'user_id' : AccountUserId
                    ,'screen_name' : ''
                    ,'cursor' : Cursor
                    ,'stringify_ids' : ''
                    ,'count' : '10000'
            }
    
            # フォロワー取得
            GetFollowersIdsResponse = GetFollowersIdsApiSession.get(GetFollowersIdsApiUrl, params = GetFollowersIdsParameters)
    
            # 取得成功時はカーソルを進める
            if GetFollowersIdsResponse.status_code == 200:
                    GetFollowersIdsResult = json.loads(GetFollowersIdsResponse.text)
                    GetFollowersList.extend(GetFollowersIdsResult['ids'])
                    Cursor = GetFollowersIdsResult['next_cursor_str']
            else:
                    print(GetFollowersIdsResponse)
                    exit()
    

# フォロイングを取得してリストする関数
def getFriends():
    # フォロイング取得パラメータ設定
    Cursor = '-1'
    GetFriendsIdsApiSession = OAuth1Session(ConsumerAPIKey, ConsumerAPIsecretkey, AccsessToken, AceestokenSecret)
    GetFriendsIdsApiUrl = 'https://api.twitter.com/1.1/friends/ids.json'
    while  Cursor != '0':
            GetFriendsIdsParameters = {
                    'user_id' : AccountUserId
                    ,'screen_name' : ''
                    ,'cursor' : Cursor
                    ,'stringify_ids' : ''
                    ,'count' : '10000'
            }
    
            # フォロイング取得
            GetFriendsIdsResponse = GetFriendsIdsApiSession.get(GetFriendsIdsApiUrl, params = GetFriendsIdsParameters)
    
            # 取得成功時はカーソルを進める
            if GetFriendsIdsResponse.status_code == 200:
                    GetFriendsIdsResult = json.loads(GetFriendsIdsResponse.text)
                    GetFriendsList.extend(GetFriendsIdsResult['ids'])
                    Cursor = GetFriendsIdsResult['next_cursor_str']
            else:
                    print(GetFriendsIdsResponse)
                    exit()
    

# リスト作成関数実行
getFollowers()
print('【フォロワー数】' + str(len(GetFollowersList)))

getFriends()
print('【フォロイング数】' + str(len(GetFriendsList)))



# 本処理_こっちがフォローしてるIDの中から、こっちをフォロバしてないものだけを抜き取る
for friend in GetFriendsList:
    if friend not in GetFollowersList:
        # 抜き取ったIDをscreen_nameに変換する
        GetUsersShowApiSession = OAuth1Session(ConsumerAPIKey, ConsumerAPIsecretkey, AccsessToken, AceestokenSecret)
        GettUsersShowApiUrl = 'https://api.twitter.com/1.1/users/show.json'
        GetUsersShowParameters = {
            'user_id' : friend
        }
        GetUsersShowResponse = GetUsersShowApiSession.get(GettUsersShowApiUrl,params = GetUsersShowParameters)
        if GetUsersShowResponse.status_code == 200:
            GetUsersShowResult = json.loads(GetUsersShowResponse.text)
            GetNotFollowingFriedsList.append(GetUsersShowResult['screen_name']) #extendじゃダメ
# print('こっちがフォローしてるのに (`A´).フォロワーさんになっていないユーザー名：' + str(GetUsersShowResult['screen_name']))


print('GetNotFollowingFriedsList一覧：' + str(GetNotFollowingFriedsList))
```


###使い方

1. APIキー＆トークン設定で、自分のツイッター開発者アカウントのAPIキーおよびトークンを設定。
例：
ConsumerAPIKey = 'XxXx0xXxxxX8xXxxxxX3755XX'
ConsumerAPIsecretkey = 'x39xXxxXXX3xXXXxx3XxXx4xX4XX7XxXxXXx0xxxXX5xxXXXXx'
AccsessToken = '999999999999999999-XxXX6Xxxx3xxxxXxxxXXXxxX5XXXX3'
AceestokenSecret = '9xxXXX6xxXxxX2X4XxxX1xXzxxxxxx5x1Xxx68xxx3xXX'


2. 対象アカウント設定で、自分のTwitterアカウント（screen_name）を設定。
例：
AccountUserId = 'myself'


3. プログラムを実行する。`python get_notFollwingFriends.py`



4. 結果は以下のように一覧表示される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307441/99d9bd1f-4d35-7545-c5fb-c321fe440e2e.png)





###コード解説

1. 関数getFollowers()：followers/ids APIを使ってフォロワーさんのID一覧をGetFollowersListに格納する。
2. 関数getFriends()：friends/ids APIを使ってフォローしているアカウント（以下フレンド一覧）のID一覧をGetFriendsListに格納する。
4. For文を使って、フレンド一覧の中でフォロワーになっていないアカウントを弾き出してfriend変数に格納していきながら…
5. そのIDをusers/show APIを使ってscreen_nameに変換していく。
6. 変換されたscreen_nameをGetNotFollowingFriedsListリストに格納していく。
7. For文を抜けたら、最後にGetNotFollowingFriedsListリストをprintで一覧表示。


※ パラメーターの'count'は自分のフォロワー数、フレンド数に合わせて調節する。

※ あとは一覧表示されたscreen_nameをひとつひとつ確認しながら手作業でリムっていく。フォロワー数が10万とかになったらリムるのも自動化するかもしれない。


###参考
[StackOverflow - Get username by id in Twitter Api](https://stackoverflow.com/questions/43123693/get-username-by-id-in-twitter-api)
[【Python3】【TwitterAPI】PythonでフォロワーのIDを全件取得(GETfollowers/ids)](https://computer.masas-record-storage-container.com/2020/05/06/getfollowersids/)