おくよ。
github.comGitHub - saba-0013/twimages
前置き
言いたいのは「直discord api経由だと履歴から100件しかメッセージ取れないけどdiscord.py経由でhistory取ると全件取れる」ということと、「vxtwitterが何故かAPI用意してくれてる...」ということです。
Twitterにブックマーク機能が出来てから、俺はひたすらにTLに流れてきた良くて、しかも嬉しいイラストなどを追加し続けていた。
でもTwitterはかなり終わっていて、ブクマ(だけじゃなくて自分のツイートとか、いいねもそうなんだけど)を遡ってると途中で急に表示されなくなったりして、辛い。あと普通にツイ消し垢消し凍結などなどで見えなくなってることがあって、辛い。
なので、保存できるようにした。
3人になって嬉しい!
折角なので書く。
コレはなに
discordに貼られたTwitterリンクから画像を取得してs3に保存する。
以下手順。via python.
・自分でdiscordにリンクをペタペタ投げ続ける
投げ続けなさい!
コレは全く確実に必要な手順で、そもそも自分でブックマークしたものの中から正しくイラスト(しかも良い)のみを厳選してdiscordにあげないといけない(現在はイラスト(色つき)、モノクロ、マンガとかで分類してる)。
その過程で選別が生まれる。それが重要。一時の熱に浮かされてぶち込まれたブックマークの中から、「真」に残したいものを見つけるという行為。
価値がある。
こんな感じで自分用のTwitterリンクを貼るだけのチャンネル(あとブログ用の画像をスマホからPCに移行する時とか)の鯖がある。
・discordの対象channelをbotがcrawlしてmessages全件取得
・取得した中からtwitterURLのみ抽出、status_codeをもとにvxのapi経由で各画像url, tweetメタデータを取得
vxのapi経由で
これなに.............................................?
最初、コレ(discord to s3)やるにあたって一番の懸念がtwitterからリソースのurl取得するの怠そうだな~ということで、昔登録してたtwitter apiは当然失効していた上にやりたいことやるなら月1万円くらい払う必要があり、くそぼけ!と思っていた。
ブラウザ上ではmedia url見えてるのでまぁseleniumとかで無理やり拾えるかな?でも使うならdocker入れてdriverも管理しなきゃだから怠いな...とか思っていたのですが、いつもお世話になってる(本当はお世話になりたくない)vxを見たら何故かAPI提供してた。
github.comhttps://github.com/dylanpdx/BetterTwitFix?tab=readme-ov-file#api
なんで........?(本当にいいのか?いや、ダメだと思うけど...俺は楽できてラッキーだけど...Twitterに年額いくら払ってるだ?コレ...)
おかげでリソース取得問題は一発で解決したけど、怖いので一応1req/2sくらい間隔開けて使ってる。ありがとうございます。これなに?
・画像urlからrequest経由でコンテンツを取得、そのままメタデータと合わせてs3にアップロードして終わり
です。
動かす
一番上にgithubのリンク置いたので、cloneして、discordでbot作って(別に自分のアカウントでもいいけど)cline_token取ってその他必要なsecretとかs3のバケット名とか環境変数に設定してmain.py動かす。
そのうち、s3 viewerも作って見れるようにしたいんですけど、フロント作るのしんどそう過ぎるし、直通させると読むのに毎回金がかかるからイヤ。その場合はr2に移す(r2最強なので、でもブラウザGUIがマジで終わってるから出来れば関わりたくない)。
本当は、普通にdiscord api経由でrequestから取ろうと思っていたのですが、oauth2の認証通すのめんどくさいのと、何よりdiscord api経由だとメッセージが上限100件しか取れない...
discord.comhttps://discord.com/developers/docs/resources/message#get-channel-messages-query-string-params
なぜ?(全件取れるよってのが別にあったらすみません)。discord.pyの方は普通に全件取得できるので謎。
discordpy.readthedocs.iohttps://discordpy.readthedocs.io/ja/latest/api.html?highlight=close#discord.Member.history
定期的にやる。lambdaに起こしてeventbridgeで定期実行までしてあげてもいいけど、そこまでするアレもないので別に良いです。