Shortcutsアプリとa-Shellアプリとtwitter-video-dlを使用してTwitterで投稿された一部の動画を保存するショートカットを作成したので紹介します。
本記事について
アプリがTwitterからXに変更され、仕様変更が増えています。またいくつか改善もしました。関連し、ショートカットのリンクも更新しています。
変更内容をこちらのブログに反映することが難しくなっているため、変更点はGitHubのissues、および、コードを確認して下さい。
経緯
ショートカットを作成しようと思ったのは、試合で活躍しない日を見ないほうが少ないのではないかと思うくらいほぼ毎試合何かしらの活躍をしている大谷選手の動画を保存したいと考えたためです。
私は野球経験者ではありませんが、ピッチャーとバッターを両立するスタミナは本当にすごいなと思います。
しかし、実際に動画保存しようとしたところ、Twitterの公式アプリでは動画保存機能がありませんでした。(以前は保存機能があったと記憶しています。)
そこで、保存方法がないか調べていたところ、一部の動画に限りますが、twitter-video-dlを使用することでPCに保存できることがわかりました。
また、twitter-video-dlはPythonで書かれているため、iPhone/Macではa-ShellアプリがPythonコマンドをサポートしています。
a-ShellアプリはShortcutsアプリで実行できるため、組み合わせれば実現できそうでした。
実際に作成したところ、Shortcutsアプリからa-Shellアクションでtwitter-video-dlのPythonコードをを使うことで動画保存できたため本記事で紹介することにしました。
作成したもの
以下作成したショートカットになります。
デモ動画も載せていますので確認してください。
※ショートカットのリンクを共有しますが、使用する際は注意事項とショートカットのコメントを必ず確認してください。本記事でも記載します。
❗️注意事項❗️
- 必ず、制限事項、注意事項、使い方を確認してください。正しい手順を踏まない場合、ショートカットは正常に動作しません。
- 本ショートカット(コードを含む)を実行したこと、参考にしたことによって被るあらゆる損害について責任を負いかねますので自己責任でご利用ください。
- 動画については著作権法に則った利用方法に従って十分注意して使用してください。
- Twitter公式アプリ以外のTwitterアプリは動作保証外です。
- ショートカットはShortcutsアプリおよび、Twitter仕様、twitter-video-dlのソースコードに依存します。将来、それぞれの仕様変更や実行環境(version、フォルダ構成、他)により、ショートカットが正しく動作しなくなる可能性を含むことをご理解ください。
❗️制限事項❗️
動画の保存方法には以下の制限があります。
- 一つのツイートで複数の動画を投稿しているケースではその複数の動画を保存します。
- 動画の内、動画URLを取得できない場合は公式アプリで再生できているケースでも動画は保存できません。(動画投稿時の設定、動画内容に依存)
仕様
動画保存処理は以下2つのショートカットにより構成されます。
① twitter-video-dl-for-sc setupショートカット
環境構築用のショートカットです。
②twitter-video-dl-scショートカット
動画保存処理用のショートカットです。(①の実行が必須です。)
① twitter-video-dl-for-sc setupショートカットについて
a-Shell-commandsからgitコマンドをDLします。
twitter-video-dl-for-scプロジェクトをa-Shellファイルに内にDLし、パッケージをインストールします。
動画保存するコードはtwitter-video-dl-for-scプロジェクトでGitHubで管理します。コード自体はzipでダウンロードして展開すれば使用できますが、手動でやるのは手間です。そこで、gitコマンドを使用します。
また、一連の操作をショートカットで作成することでショートカットの操作のみで環境構築できるようにしました。
ただ、a-Shellではデフォルトでgitをサポートしていないため、追加する必要があります。gitコマンドの追加方法については以下記事を確認してください。本ショートカットでは追加処理も含めたショートカットになっています。
7rikazhexde-techlog.hatenablog.com
ショートカットではbinフォルダ作成、移動、gitコマンドの取得(curlコマンド使用)、ショートカット起動を順にa-Shellのターミナルで実行します。
その後、DLしたgitコマンドを使用してgit cloneコマンド、フォルダ移動、pip installコマンドをショートカット内のアクションで順に実行します。
②twitter-video-dl-scショートカットについて
始めにアプリ間のタスク処理の問題なのかアクション指示は実行されるのですが、a-Shell上でコマンド実行できないデッドロックのような状態になります。
そのため、一度a-Shellアプリを起動させて、ショートカットアプリに戻ることで、コマンドをa-Shellアプリで実行できるように調整します。
それでも時間を空けて実行するとうまくコマンドを実行できないケースがあります。その時は手間ですかショートカットを停止して再度実行してください。
その後、プロンプトアクションで出力ファイル名を入力プロンプトを表示します。
入力された文字列とTwitter共有アクションより取得したURLをtwitter-video-dl-sc-for-cs.pyの引数指定で実行します。
ショートカットではファイル名を入力しない場合はURLのuser_id以降をファイル名とします。
twitter-video-dl-sc-for-cs.pyでは引数指定のチェックし、引数に問題がない場合は動画保存するtwitter_video_dl.pyを実行します。
最後に保存された動画をoutputフォルダ指定で出力します。(outputフォルダがない場合は作成します。)
ファイル名は動画の数に応じてファイル名に番号を付けて保存します。(インデックスを1からカウントアップ)
twitter_video_dl.pyの処理について
動画保存処理のコードについて説明します。
まず、コードで呼ばれる関数はinteoryx / twitter-video-dlのtwitter_video_dl.pyベースにショートカット向けに関数を追加しています。
1.現在のスクリプトのディレクトリパスを取得して、RequestDetails.jsonファイルを読み込む
RequestDetails.jsonファイルには、リクエストの機能と変数が含まれています。このファイルは、スクリプトの動作をカスタマイズするために使用されます。
2.download_video_for_cs関数でget_tokens関数、get_tweet_details関数、およびextract_mp4_fmp4関数を使用してURLからビデオファイルを保存する
各ビデオの最大解像度のURLを選択し、そのURLから動画ファイルをダウンロードして保存します。
各ビデオのダウンロード時に、出力ファイル名はoutputディレクトリに保存され、各ビデオに対してインデックス番号が追加されます。
3.get_tokens関数で Bearer Token, Guest Tokenを取得する
3.1.requestsを使用してTwitterから取得したURLのhtmlを取得する
htmlでは「tweet not found」ページが返されます。
ブラウザでは、その後のjavascriptの呼び出しによって、このページにデータが入力されます。
この空白のページには、Bearer Tokenを含む「main.js」ファイルのスクリプトタグが含まれています。
3-2.re.findall関数で正規表現を使ってmain.jsファイルのURLを検索し、そのURLからmain.jsファイルのテキストを取得する
Bearer Tokenについてもre.findall関数を使用して正規表現を使って取得します。
3-3.guest tokenを取得するためにBearer Tokenを使用する
セッションを開始してヘッダーにBearer Tokenを追加し、APIエンドポイント(https://api.twitter.com/1.1/guest/activate.json)にPOSTリクエストを送信します。
レスポンスJSONからGuest Tokenを抽出し、返します。
3-4.ツイートID、機能、および変数から、ツイートの詳細を取得するためのURLを作成する
変数のコピーを作成し、focalTweetIdをツイートIDに設定します。そして、変数と機能をJSON形式にエンコードし、URLに埋め込みます。最後に、URLを返します。
4.get_tweet_details関数: ツイートの詳細を取得する
get_tweet_details関数は、ツイートURL、Guest Token、およびBearer Tokenを受け取ります。
まず、tweet_idをURLから解析し、assertステートメントでその存在と長さを確認します。
その後、get_details_url関数を使用して詳細のURLを作成し、requestsライブラリを使用してデータを取得します。
5.extract_mp4_fmp4関数: ツイートの詳細情報からtweet_idのリストと辞書型の解像度とMP4ビデオURL、FMP4コンテナのURLのリストを返します re.findall関数で正規表現を使ってビデオファイルのURLとFMP4コンテナのURLを抽出します。
まとめ
Twitterで投稿された一部の動画を保存するショートカットについて紹介しました。
ショートカット(ソースコード)は投稿内容によって保存できない動画があること、複数保存する仕様であることなど、気になる点はありますが、
個人で使う分には問題はないので動画保存に対応できないケース以外は変更しない予定です。
ショートカットのリンクは共有しているため、気になれば確認してみてください。
(利用は自己責任でお願いします。)
質問はTwitterやメール(Gmail)で連絡いただければ回答します。
以上です。