【Twitter】古いいねの消し方

注意:

全体的に Twitter の挙動が意味不明なせいで記事の内容も良く分からない感じになってます。こんな事もあるんだなー程度で読んでください。

Twitter の古いいねの消し方です。何年も前の数万件もいいねがある場合、Twitter の動きがかなり変なので作業が非常に大変です。あと、ネットに転がってるいいねの消し方が説明が最悪でちゃんと消せないです。なので今回は、大量のいいねや、すごく古いいいねを削除する方法と、作業時の注意点を実際にやってみて感じたことなどを書いていきます。

一度に3200件以上は消せない?

この3200件という数字がどこから出てきたのかよくわからないですが、これくらいの量のいいねを消すと、そこからいいねの取り消しがうまくできなくなるようです。

この「取り消しできない」状態は、 PC から Twitter を開いて自分のいいねのページに移動すると、「まだいいねがありません」という表示になったり、いいねの一覧には表示さてるけどハートマークが赤く点灯していない状態になったりします。かなり不具合くさいですが現状こういう仕様のようです。

こうなると、もうどうしようもないので暫く放置(数日~2週間程度)するといいねが再び表示されたり、ハートマークが赤く点灯してる状態に戻るのまたで削除できるようになります。しばらくして復活したら3200件を削除するを繰り返すことになります(ちなみにいいねされてないように見えるいいねボタンを押してしまうと再度いいねしたことになって相手に通知が飛ぶみたいなので注意してください)

ハートが点灯してないときは画像だと以下のような表示です。

いいねの一覧にひょうじされているのにハートマークが点灯していません(これはこっちは Twitter のバグ?)この状態だとTwitter の favorites/destroy.json という API にリクエストを投げても 404 で帰ってきて削除できません。なんで…?

削除サイトでうまく消せない

古すぎるいいねは「いいねを一括削除」や「えごったー」「Sorster」などの無料で利用できるサイトだとうまく削除できない事があります。そもそも、いいね自体のリストアップがうまくいかずに、3200件消せますと言ってる割に200件未満しかリストアップされず削除対象が少なかったり、いざ削除を実行しても全然削除できない、削除できても1~30件程度しか削除できない、なんかで全く言うことを聞きません。まじでいい加減にしてほしいですね。

削除できないからって少し時間を空けて再度何度もリクエストを送っても数件削除できる程度で取り消しの効率がかなり悪いです。

削除するならPCからスクリプトで

なので、数万件あるいいねを削除するにはChorme から削除スクリプトを手で実行するのが一番効率がよいです。

Chorome でいいねのページを開いて F12 を押してコンソールを表示し以下のスクリプトを実行します。

// 15秒に1回画面を最後までスクロールして「いいね」を取り消す
setInterval(() => {
    for (const d of document.querySelectorAll('div[data-testid="unlike"]')) {
      d.click()
      console.log(d)
    }
    window.scrollTo(0, document.body.scrollHeight)
  }, 15000)

こんな感じです。

ただこれも問題があって、しばらく動かしてると、「429 Too Many Requests」が返ってくるようになります。

15秒間インターバルを入れていても500件くらいリクエストを送ると取り消しがエラーになり始めるので、そうなったら5~10分ほど間をおいてから画面をリロードして再実行しましょう。

以下のような表示が出たらいったん間をあけて画面をリロードしましょう。

で、結局途中で429エラーが出て画面をリロードすると3200件削除した後だとリストに何も出てこなくなったり、ハートが点灯しなくなるのでこのスクリプトが効かなくなります。そうしたらまた数日空けると復活したりするので、再度いいねページからスクリプトを少しずつ実行していきます。

結論

結局、Twitter の挙動がよくわからない上に色々問題があるようなで1万件あたり削除するのに3週間以上かかります。スクリプトで3200件分消去するのも500件x10分インターバルを入れると1時間以上PC操作に時間がとられるのでまぁ少しづつ削除しているしかないです。Twitter API でもうまく消せないとは恐れ入りました。

なので、10万件とかいいねを取り消したいなどは非現実的過ぎるので諦めたほうがいいと思います。

スクリプトは上記以外にもネットに転がっていますが、大量に古いいいねを消去したいとかの場合は、逆にいいねを押してしまったりする機能があるものがあるようですので容はよく見てから実行しましょう。ここに掲載しているスクリプトはそういうことはありません。

最後に、このいいねの取り消しは英語だと「Unlike」と言うみたいです。自分は今回は使用していませんが「Twitter Unlike All」といういいねの解除を自動でしてくれる Chorome の拡張機能があるみたいなのでそっちを使ったほうが楽かもしれません。

おまけ

アーカイブをダウンロードしたあと Twitter API を使って一括で削除するのは以下のスクリプトを使用しました。まぁ途中から必ず404になってあんまりうまく動きませんでしたが、、、なんなんだろうかこの挙動は、、

import json
from requests_oauthlib import OAuth1Session

API_KEY = 'hoge'
API_SECRET = 'hogehoge'
ACCESS_TOKEN = 'fugafuga'
ACCESS_TOKEN_SECRET = 'fugafuga'

# 認証
def api():
    # TwiterのAPIを使えるようにする
    api = OAuth1Session(
        API_KEY,
        API_SECRET,
        ACCESS_TOKEN,
        ACCESS_TOKEN_SECRET
    )

    return api

# ローカルファイルからIDの一覧を取得する
def load():
    body = json.load(open(r'C:\Users\Taka\Desktop\like.js', encoding='utf-8'));

    mylist = []
    for item in body:
        # print(item['like']['tweetId'])
        mylist.append(item['like']['tweetId'])

    return mylist;

# 指定したIDのいいねを1件取り消す
def unlike(_id, count):
    twitter = api()
    url = f'https://api.twitter.com/1.1/favorites/destroy.json'
    params = {'id': _id}
    ret = twitter.post(url, params=params)
    print(count, "| Code=", ret.status_code, _id)
    twitter.close();

def main():
    ids = load();
    for count, key in enumerate(ids):
        unlike(key, count)

if __name__ == '__main__':
    main()

# というか応答がおかしくてハートマークが点灯してないいいねは ID があるのに
# 以下のようなメッセージが出て消せない
# {"errors":[{"code":144,"message":"No status found with that ID."}]}

# ついでに言うとブロックリストに入れっぱなしでそのアカウントが凍結
# → 削除されると自分のブロックリストから二度と削除できなくなる

このスクリプトも一度404になったIDに対して100回程度繰り返し実行すると成功したりして挙動が本当に謎です。だいたい350回くらいリクエストするとほぼ確実に消せますがリクエスト量が多すぎるとスパム認定されて凍結される可能性があるので取り消せますが自己責任で実行してください。