botの最新バージョンはこちら
なんでそんなことするの?
SNSでは、自分のFF比を大きくすればするほど大物に見せることができる。したがって、フォロー解除(SNSではリムる
と言う)してもフォロー解除し返してこない可能性の高い人をフォロー解除しようという悪魔的な試みである。
この記事は決して上記を推奨しているわけではない。側から見たら性格が悪いとしか言いようがない。これによってフォロワーに嫌われても責任は負えません。
定義
リムってもリムり返して来ない人を、
FF比 := フォロー数 / フォロワー数 > 1.5 のアカウントと定義する。
1.5は、個人的には妥当だと思うが任意に変えてもらってかまわない。
なお、普通FF比というとフォロワー数 / フォロー数を指すようなのでここでの定義は一般的な定義と違うことに注意されたし。
ちなみに私のフォロワーのうち、FF比が1.5より大きいフォロワーはフォロワー全体の27%であった(605 / 2230)
方法
- まずTwitterのフォロワーリストをCSVで取得する。これはこちらのツールを使えば簡単にできる。ものすごく便利。
https://mugen-tools.com/tools/twittergetallfollower.php
follower_list.csv
という名前で保存しておく。 - 次にこちらのツールで生成されたCSVファイルをエクセルで開き、
Y2
セルに対して
=E2/F2
と入力。これでFF比が求まるので、例のごとくビーっと伸ばして全ての行に対して適用させる。 - 次に
AA2
セルに対して、
=FILTER(A2:Y2231, Y2:Y2231>1.5)
と入力。これでFF比が1.5よりも大きい行を抽出できた。エクセルでの作業はここまで。
上記では具体的なセルを指定しているが、同じ操作ならば、どこを指定してもかまわない。 ただし以下のPythonコードは以上を踏まえたマジックナンバーを使っているため適宜変更が必要。 - 次にPythonファイルを作成し、以下のように記述する。
unfollow_all.py
import tweepy import csv import time # api_keyの取得などは他サイト参照 api_key = '******' api_key_secret = '******' access_token = '******' access_token_secret = '******' client = tweepy.Client( consumer_key=api_key, consumer_secret=api_key_secret, access_token=access_token, access_token_secret=access_token_secret, ) with open('follower_list.csv') as f: reader = csv.reader(f) # もしコードを中断してしまったりエラーが発生して、リストの途中から処理したいときはcsvファイルを見てスライスの数字を変える。 # ちょうど最後に終わった人の行番号を指定してあげれば良い。 count = 0 for line in reader: # for line in list(reader)[152:]: スライスでの指定方法はこんな感じ if line[28] != '': screen_name = line[28] name = line[27] print(f'{screen_name}: {name}') user = client.get_user(username=screen_name, user_fields=['description', 'protected', 'name', 'username', 'public_metrics', 'profile_image_url'], user_auth=True) client.unfollow_user(target_user_id=user.data.id) count += 1 if count % 39 == 0: time.sleep(16 * 60)
コード解説
冒頭でライブラリをimportしている
tweepy...TwitterAPIを利用するためのライブラリ
csv...csvファイルを扱うためのライブラリ
time...待機するためのライブラリ
api_key
などの取得は、他のQiitaの記事などで豊富に解説されているので省略。
client = tweepy.Client()
でclientインスタンスを作成している。TwitterAPIに限らずよくある処理。
with open('follower_list.csv') as f:
は初めて見る人もいるかもしれないが、ファイルを開くときのおまじないだと思っておけばOK、一応言及しておくと、with
はファイルを閉じる処理までを一連の動作として行うためのものである。
reader = csv.reader(f)
のようにCSVファイルを読み込むと、reader
をlist
のように用いることができて、
for line in reader:
とすることで、1行ずつ読み込める。
(スライスを用いる場合は、list()
を用いてlistに変換してあげる必要がある。)
if line[28] != '':
という条件を設けているのは、=FILTER(A2:Y2231, Y2:Y2231>1.5)
で抽出した際に、抽出したものの行数は全体よりも少なくなっているからである。
count = 0
で初期化し、インクリメントしていき、count
が39の倍数になったタイミングで16分待機しているのは、このコードの最も肝心な部分である。
Twitterは15分以内のAPI利用回数に制限を設けていて、今回は40アカウントほどリムったタイミングで
tweepy.errors.TooManyRequests: 429 Too Many Requests
が生じたので39回のリムーブを一単位として、余裕を持たせ16分待機している。
注意
- TwitterのAPIは現在V2を利用するのが普通である。V1.1の文献ばかりなので調べるのが割と大変
V1.1 → tweepy.API() を使用
V2 → tweepy.Client() を使用
- time.sleep()で適切に処理しても、247回リムーブしたタイミングでAPI制限が出たので、1日あたりのAPI上限回数も設定されていそう。
改善案
- 条件に当てはまってもリムりたくないアカウントがあると思うので、事前にそれらをsetに入れておいてin演算子を使って含まれていないことを確認した上でリムると良いかも。
- 本当はツールを使ってCSVファイルを生成せずに、APIでフォロワーのリストを取得できれば楽なのだが、やり方が思いつかなかった。
- 16分や39回という数字が最適であることは確認していないため、改善の余地がある。
- 上記のコードでは、元々フォローしていないフォロワーに対してもunfollow_user()をしているため、フォローしているかどうかを事前に判定できれば効率化できる。