TL;DR
- YouTube のプレイリストから動画をダウンロードしてツイッターにアップロード
- URL 貼り付けでなく Video Tweet
- ソースコード: https://github.com/teramotodaiki/youtube-to-twitter
- 運用中のボット: https://twitter.com/hackforplay
- 1日1本、 子どもがプログラミングで作った ゲームの実況動画を投稿しています。良かったらフォローしてね!
何が嬉しいのか
マーケティング施策として YouTube に1日1本動画をアップしています。チャンネル登録者数を増やしたいけど、YouTube のリコメンドだけでは流入が望めません。そこで、動画を数十秒だけ切り取って Twitter にアップして、「続きは YouTube で!!」的なのをやりたくなりました。しかし、
- 動画のトリミング だるい
- Twitter の動画アップロード 遅い
- YouTube の スケジュール投稿に合わせてツイート しなきゃいけない
こんな作業を毎日やるとか、、人間の仕事ではない、、
ということで、自動化したいですよね
それ IFTTT にないの?
結論から言うとないです。それっぽいのはあるけど、あくまで YouTube リンクをツイートするだけ。これだと タイムライン上で動画が再生されません
20秒以内にこの部屋から脱出しないと終わり #HackforPlay
— HackforPlay公式 (@hackforplay) November 26, 2019
つづきはこちら↓https://t.co/17bb46f4HP pic.twitter.com/K9DQSoV2PH
タイムライン上で動画が再生 される ツイート
タイムライン上で動画が流れないツイートの例https://t.co/Z4ZqXC4yUG
— 寺本.hackforplay(); (@teramotodaiki) November 27, 2019
タイムライン上で動画が再生 されない ツイート
タイムライン上で動画を流すには、Twitter に動画をアップロードする必要があります。当然、帯域やらストレージやらを食います。さらに、 Twitter では動画が 140 秒までに制限されている ため、トリミング(カット)する必要があります。動画編集にはそれなりの CPU 時間がかかるので、フリーのクラウド使うにしても、無償で提供出来るものではありません
多少おかね払っていいから、そういう SaaS ないの?とも考えたけど、ツイートの内容とかトリミングの秒数とか自分で比較検証することも考えると、やっぱりピッタリなソリューションは存在しないと思います。ないものは作るっきゃねえだろ。千空先生もそう言ってました。
とにかく今すぐボットを作りたい人
このリポジトリをクローンなりフォークなりしてください。環境変数は .env.txt
ってファイルにキーだけ書いてあるので、設定してください
npm にパッケージも公開してるけど、あんまりオススメしません。なぜなら一部 Python を使っているせいで、環境構築が面倒だと思います
2019/11/27 追記
Pytube から ytdl に切り替えたので、Python 環境が不要になりました。試してないですが、おそらく動くはずです。自分用なのでテストも型定義も書いてませんが、Issue 立ててくれたら時間のある時に対応します
npm install --save youtube-to-twitter
あとは適宜 cron jobs を使ってお好みのタイミングで GET /
を叩いてください
前提
- 今回は 再生リスト に含まれている動画を対象とします
- 動画が 公開されたら ツイートします
- 一日一回、 cron job で curl してボットにツイートさせます
- 同じ動画を2回ツイートすることがないようにします
実装方法とかハマりポイントとか
YouTube Data API
- 再生リストから動画の URL を取得するのに使います
- API Key が必要なので、Google Cloud Console で発行してください
- 今回使った PlaylistItem API には OAuth は必要ないので、 GET で叩くだけです
- https://developers.google.com/youtube/v3/docs/playlistItems/list
Pytube
- YouTube から動画をダウンロードするためのライブラリです
- 名前の通り Python のライブラリなので、
pip
でインストールする必要があります - YouTube から動画をダウンロードする API はありません。何らかのトリックが必要で、それを Python で実装したライブラリが Pytube です
- これを書いている途中で ytdl なる npm パッケージを見つけたので、そっちに移行するかも知れません
- 余談ですが、これは YouTube の Terms of Use に抵触している行為なので、もし他人に第三者の動画をダウンロードさせるために使うのであれば権利についてご一考ください
ffmpeg
- 言わずと知れた動画編集ライブラリです
- 今回は npm パッケージ経由でバイナリを入手し、 CLI から使います
ffmpeg-installer
- ffmpeg をインストールするための npm パッケージです
- https://github.com/kribblo/node-ffmpeg-installer
何を言ってるか分からない方向けの解説
https://t.co/u5CAbLbs5t
— 寺本.hackforplay(); (@teramotodaiki) November 25, 2019
npm を使って ffmpeg をインストール出来るライブラリ。これ自体に ffmpeg のバイナリがバンドルされており、npm install するだけで使える。プラットフォーム毎の下位パッケージがあり、 postinstall のタイミングで必要なパッケージ(バイナリ)のみインストール。賢い!
Twitter API
- 1番の曲者です(笑)
- まず、利用には申請が必要です。 Twitter Developerにアクセスして、 ボットのアカウントでログイン して申請を行ってください
- 異なるアカウントで申請してしまうと、更新系の API が使えなくなってしまうので注意
- どうやら同じメールアドレスで登録していれば、別アカウントでも「書けばすぐ Approve される」ようです
- ハマりどころなのは、ウェブ上で記入→メールが届く→メールに返信する形でもう一度記入→審査開始、というプロセスになっているところです。メールが届いているのに気付かず、1週間放置していました…
- 同じ動画を2度アップロードしないために、過去200件のツイートを取得します
- 動画をアップロードします。この時、 5MB を超える動画には chunking が必要で、 30 秒を超える動画には async upload が必須になります。この辺、ドキュメントにも明示されてないし、 Node.js のサンプルがネットにあまりないので苦労しました
- https://developer.twitter.com/en/docs/media/upload-media/overview
- chunking についてはこの辺読んでください→ https://github.com/teramotodaiki/youtube-to-twitter/blob/70bf548acb291c36ea6febb33212816327c6ebd6/lib/tweet.js#L23-L34
- async upload を有効にするには media_category の設定が必要です→ https://github.com/teramotodaiki/youtube-to-twitter/blob/70bf548acb291c36ea6febb33212816327c6ebd6/lib/tweet.js#L90
- async upload が未完了の時にツイートするとエラーになるので、アップロードが完了したことを確かめるために polling が必要です → https://github.com/teramotodaiki/youtube-to-twitter/blob/70bf548acb291c36ea6febb33212816327c6ebd6/lib/tweet.js#L47-L66
- ツイートします。特にハマりポイントはありません