見出し画像

フォローしてる人全員をリストに分類するためにPythonまで使った話

最近スマホでTwitterを見る時、フォローしてる人のツイートがホームにあんまり流れてこなくなってることに気づきました。話題のツイートが流れてくるので面白いんですけど、本来の目的である「見逃したツイートを確認する」こととは外れてきている気がする…
作品が好きでフォローしたのに、ずっと見逃したままになっていて、それに気づかない状態なのは勿体ないですね。投稿頻度が低くてTLに現れないユーザーの場合、いくら好きでも存在を忘れてしまうこともあったり…

そこで、いつでも目的のユーザーのプロフィールに飛べるように、フォローユーザーを分類することにしました。分類に特化したツールがないか探しましたが、やはりTwitterのリスト機能を使うのが良さそうです。

前編:icotile3を使って
フォローユーザー全員をリストに分類する

リスト登録作業は「icotile3」というサイトを使用します。

UIはこんな感じ。Twitter公式と違ってページ遷移がないので読み込みが早く、機能がシンプルで使いやすかったです。

ちょっと大変ですが、一人一人個別にリスト登録していきます。リストはだいたい以下のようになりました。人数が増えすぎないように細分化したので、リストが30個くらいになりました。

・イラスト関係(ジャンルごとに11個)
・デザイン関係(作字やプロダクトなど)
・フォント関係(デザイナーや使用者)
・ゲーム開発者
・ゲーム考察勢
・FF14関係(知り合い以外)
・漫画家
・アニメーター
・モデラー
・音楽つくる人
・ネタツイ系
・Youtube配信者
・公式アカウント(ゲーム/TV・映画/それ以外)
・pixiv企画繋がり(ポケモン/それ以外)
・リアルの知り合い
・その他

つまづいたこと:
一定時間あたりのリスト登録回数に制限がある

どうやらリストにユーザーを登録する処理は24時間あたり100回?の制限があるらしく、制限を超過したことがicotile上でも確認できず、結構な作業が無駄になりました。
一列くらい作業したらTwitter公式に飛んで反映されてるか確認、反映されていなかったらどこまで作業したか記録し、24時間程度待って再開。フォロー全員確認するのに1週間以上かかりました…

また、整理のために「リストから削除」→「別のリストに登録」という作業をした場合、制限を受けた状態だと「リストから削除」のみ実行されてしまい、どのリストにも入っていないユーザーが発生してしまいました。せっかく整理したのに…
この問題に対処するために、次はPythonを使っていきます。

後編:python-twitterを使って
「どのリストにも入っていないユーザー」を抽出する

上記の問題もありましたが、元々フォローユーザーを整理するにあたって「リスト未分類のユーザー」を分かればいいなと思っていたので、何とかしようと思いました。

もちろんアカウントを一つ一つ確認するのは現実的ではなさそう。リストがあればエクセルとかで比較できるかもしれませんが、少なくともTwitter公式やTweetdeck、icotileではフォロー一覧やリストメンバー一覧をコピペするのは結構難しい。
なのでプログラミングで情報を取り出してみることにしました。幸い仕事で簡単なPythonを扱うことがあるので、いけるかもしれない。

ツールを用意する

調べてみると、やろうと思っていることがほぼそのまま書かれている記事が見つかったので、これを利用します。「python-twitter」という、TwitterのAPIをPythonで簡単に扱えるようにしたライブラリみたいですね。具体的なコードは後述。

PCにPython環境を入れないとなあと思っていたら、Web上でPythonを実行できるツール「Google Colaboratory」を発見したのでこれを使うことに。めったにやらない人がPCに実行環境入れても分からなくなって削除するのがオチなので、こういうツールはありがたい…!
セッションがタイムアウトしたら実行結果(python-twitterのインストールなど)がリセットされてしまうが、コードを全て保存できるので元の状態を再現しやすくて良い。ノートブック形式なのでAPIキーやIDなどのメモもいろいろ書いておける。

手始めにブログを参考にTwitterのDeveloperサイトに登録し、APIキーをゲット。簡単なコードを実行したんですが、エラーしました。

TwitterError: [{'message': 'You currently have Essential access which includes access to Twitter API v2 endpoints only. If you need access to this endpoint, you’ll need to apply for Elevated access via the Developer Portal. You can learn more here: https://developer.twitter.com/en/docs/twitter-api/getting-started/about-twitter-api#v2-access-leve', 'code': 453}]

「お前はTwitter API v2のみ使えるEssentialにアクセスできる。 
このプログラムに書かれたAPIを使いたければElevatedのアクセスが要るよ」
というエラーメッセージ

調べてみると、2021年11月ごろにTwitter API v2がリリースされ、APIの内容や申請方法が色々変わったようです。
はじめに登録だけした状態ではAPI v2しかアクセスできず、python-twitterを使うには以前のAPI v1.1にアクセスすることが必要。そのために追加の申請が必要らしい。(以前は後述の審査を全員やってたみたいですね)

Twitter APIの利用申請をする

大まかな流れはこんな感じ

  1. Twitter APIの利用登録

  2. Essentialになる(API v2のみ使える)

  3. アップグレード申請・審査

  4. Elevatedになる(API v1.1が追加)

  5. 先述の記事のコードが実行できるようになる

難しかったのは3の審査で、メールにて使用目的を詳しく聞かれました(テンプレメッセージでしたが)。日本語だったので楽でしたが、不備があると再提出を求められます。夜にもかかわらず1時間ほどのレスポンスで、その日のうちに審査に通りました。

リテイク1回でした。
初心者にこんな詳しく書かせるの!?と思いましたが仕方ない

今回はAPIを使う目的を完全に書きましたが、利用目的がはっきりしてなくても「練習のため」とか正直に書けば通るのかもしれません。

コードを書く

作戦はこんな感じです。鉤括弧のところは上記ブログにコードが載っているので、printのところをやりたい処理に書き換えるだけでいけそうです。

  • 「APIを取得する」

  • 「フォローユーザーの一覧を取得する」

    • →作ったリスト型のデータ(follow_List)に入れていく

  • 「全リストのユーザー一覧を取得する」

    • →follow_Listに同じ名前があれば、follow_Listから削除する

  • 最後にfollow_Listを出力する

最終的なコードは以下の通り。(APIキーとアクセストークンは伏せ字を入れてます)

\\python
import twitter

API_KEY = '3RE***'
API_SECRET_KEY = 'WB9***'
ACCESS_TOKEN = '275***'
ACCESS_TOKEN_SECRET = '6yl***'

api = twitter.Api(consumer_key=API_KEY,
                  consumer_secret=API_SECRET_KEY,
                  access_token_key=ACCESS_TOKEN,
                  access_token_secret=ACCESS_TOKEN_SECRET)

next_cursor = -1
watchdog = 50

follow_List = [] # フォローユーザーの一覧をリストに入れる

while watchdog > 0:
  watchdog = watchdog - 1

  next_cursor, prev_cursor, friends = api.GetFriendsPaged(cursor=next_cursor)

  for friend in friends:
    id = friend.id
    screen_name = friend.screen_name
    follow_List.append(screen_name)

  if next_cursor <= 0:
    break

lists = api.GetLists() # リストの一覧を取得

for list in lists:
  list_id = list.id
  list_slug = list.slug

  watchdog = 50
  next_cursor = -1

  while watchdog > 0:
    watchdog = watchdog - 1

    next_cursor, prev_cursor, members = api.GetListMembersPaged(list_id=list_id,cursor=next_cursor)

    for member in members: # リストメンバーとフォローユーザー一覧を比較
      id = member.id
      screen_name = member.screen_name
      if screen_name in follow_List:
        follow_List.remove(screen_name)

    if next_cursor <= 0:
      break

print(follow_List)

実行すると、こんな感じでユーザーの@以下の名前が出てきました(名前の後半は伏せてます)。リスト型そのままですが、それぞれコピペで取り出すのでこれでOKとします。プログラムは特に問題なく、一発OKでしたね…

['KAI***', 'Nin***', 'kaw***', 'uki***', 'hyo***', 'get***', 'Suy***', 'kyo***', 'rev***', 'muj***', 'fux***', 'mol***', 'maf***', 'RTA***', 'eda***', 'ase***', 'bna***', 'gun***', 'usa***', 'nak***', 'mei***', 'mad***', 'De_***', 'bur***']

上記をicotile3で検索し、手動でリストに入れて完成!!
なんかリストに入ってないユーザーがいるな~と感じたら、またプログラムを走らせてユーザーを抽出すればいいですね。

というわけで、プログラミングよりも準備が大変だった備忘録でした。
フォローユーザーを全員分類できて、特定のユーザーに飛ぶのがすごく楽になりました。過去絵が探しやすい!!!好きだったのにいつの間にか存在を忘れるということも防げそう。
また何か運用に問題などあれば追記します。

この記事が気に入ったらサポートをしてみませんか?