名もなき未知

エンジニアリングとか、日常とかそういうのをまとめる場所。

過去のツイートを掃除しました

自身のツイートは落書きなので、それが永続的に残ってしまうことに対して課題感がありました。 というか、かなり好みではないのですが、タイムラインのツイートを全部保存しているユーザーがいることも認知していて、ここ最近のインターネット上での発言はかなり抑制されているように思います。

これまでも定期的に削除してきたのですが、黒歴史クリーナーとかが割と動かないことが分かったので、今回プログラム面から頑張って削除してみようということになりました。

概要

  • twitter API 1.1 で消す
  • なかひこさんが作ってる tweet-deleter を活用する
    • 最近のものはこれで消せる
    • 問題はアーカイブになっているものが消えないので、そのあたりは頑張ってプログラムをかく

twitter API の申請

気が付いたら twitter API 2.0 の申請は割と簡単にできるようになっていました(昔はアプリの申請のためにごちゃごちゃ書かなければいけなかった記憶)。 その申請をするだけであれば、公式ドキュメントだけで簡単にできるはずです。

developer.twitter.com

Developer アカウントの申請をすれば一瞬で twitter API 2.0 の KEY 周りが発行されます。

ただし twitter API 2.0 は 1.1 と大きくリソースや制限が異なっており、今回使いまわしたかったコードも twitter API 1.1 にしか対応していませんでした(なかひこさんのコードを使うつもりでしたが、それが依存しているライブラリ twit が、 1.1 までの対応で終わってそうで、メンテされていない問題がある)。

なので twitter API 1.1 が利用できるよう、 "Apply for Elevated" からAPIの利用目的等を記載し、申請します。

あとは認証周りで OAuth 1.a が利用できる設定に変更し、各種キーの再発行をして実行のための準備をします。

なかひこさんの tweet-deleter を読む

github.com

作り的には単純で user timeline を持ってきて、日付が古い or 特定の条件外である場合は、削除APIで消す動きになっています。 なので、日付周りのフィルタリングのコードや、tweet ID、ハッシュタグを設定することで定期的に削除する処理を走らせそうです。

バッチ実行されることが想定ですが、普通に実行しても現状の user timeline を徐々に削除していってくれるので、最近のものを削除する分にはこれを実行するだけで十分です。(一応自分も heroku にデプロイして動くことは確認しました、日付周りの設定は運用ちょっと考え中)

しかし user timeline は最近のツイート(確かおぼろげに3200ツイートだった記憶がある)しか取り扱うことができず、削除しても古いツイートが追加されるわけではないので、この方法では古いツイートを削除することができません。

古いツイートの削除

twitterでは自分のツイートやお気に入りツイートを archive としてダウンロードすることが可能です。 このうち、 data/tweet.js の中身を見ると、大体 json であることがわかります。 なので json 形式になるように手を加えてやって python で抽出しました(手元で書くなら python のほうが早いので)

https://gist.github.com/yumechi/578e987919252af0d02b92df613a66c0

後はこんな感じで出した csvjson に変えます(Pythonのプログラムコードで json にすればよかったんじゃないという説はある(なんか心が疲れていてこの辺り作業が雑ですね))。

python data_filter.py > result.txt
jq -s -R 'split("\n")|map(split(","))|map({"tweet_id": .[0], "created_at": .[1], "status": .[2]})' result.txt | sed -e 's/\"false\"/false/' > result.json

DBを手元で持つのも微妙な気持ちがあったので、 json に status を持たせてツイートの削除情報を持つようにしています。

なかひこさんの API ラッパーに乗っかる

最終的なものは下記。ステータスを後から持たせたせいでめんどくさいコードになっている気がする。

https://github.com/yumechi/tweet-deleter/blob/master/src/my_tweet_deleter.ts

TypeScriptでjsonを読み込んでdictとして使い、削除してステータスを変えてjsonに保存し直す、ということを単純にやっています。

あと困ったことに WSL2 環境では cron がうまく動かない問題がありました(参考にした下記の書いてありますが systemd が動かないため。genieなどで対応できるらしい。今回は試していない。)

shikiyura.com

なので python の schecule というライブラリで定期実行して放置し、寝ている間に実行し続けることでツイートを消し続けました。

schedule.readthedocs.io

これで手元からアーカイブの情報をもとに古いツイートを定期的に消し続ける仕組みができました。疲れた。

まとめ

一回流し終わりましたがプログラムの不具合で消しそこなったものがいくつかありそうな感じです。 これに関してはそのうちまた整理しようかなとかちょっと思ってます。思っているだけ。

今回 twitter API を簡単に触れていい感じでしたし、自分の達したい目的も大体あるデータとコードをベースに対応できてとても良かったです。 twitter API 活かして何かやる、みたいなのは何かアイディアが湧いたらやりたいですね(お気に入りからリスト作ったり、お気に入りの管理したりをなんとなくしたいかも)

というわけで久々に? 技術っぽいことをやった記事でした。