Gasで画像投稿、動画投稿、ツリー投稿、全部実装済みしたため知見がたまりました。
ただ、ツールとして販売することにしてしまったため、うまくいかなった方法だけ記載しておきます…。よかったらヒントにしてください。
(追記)現在はv2に移行済です。
ただし、多忙につき、この記事にはv2のノウハウはあまり書いていません。そのうちめも程度には書くかも…。
コードは改版自由で販売しています。ノンプログラマの方もこちらがおすすめです。
Twitter API の画像、動画サイズ
動画サイズは15mbなの?512mbなの?
日本語マニュアルみるとこう書いているのですよ。
画像 5MB
GIF 15MB
動画 15MB
https://developer.twitter.com/ja/docs/media/upload-media/overview
開発者がこのマニュアルみて15MBの検証をして終わらせてしまう人がいるかもですね。
でも、英語のマニュアルみるとこう書いているのですよね。これに気付ける情報力は必要ですね。
File size must not exceed 512 mb
Duration must be between 0.5 seconds and 140 secondsFrame rate must be 60 FPS or less
https://developer.twitter.com/en/docs/twitter-api/v1/media/upload-media/uploading-media/media-best-practices
gifは15mbで一緒なのですけどね。
mp4は512gb、動画の長さは最大140秒です。
Twitterのドキュメントってちょっと更新が追い付いているのか怪しいのですよ。日本法人はイーロンがかなり解雇していますからね…。(´・ω・`)
リファレンスは自動翻訳ではないサイトは要注意です。こういうのって危険ですよね。だからTwitter APIは英文のマニュアルをみることをおすすめします。
Firebaseなどは大丈夫なのです。
15mbと512mbはぜんぜん違いますからね。34倍ぐらい差があるのに15mbでサイズ上限のコードをかいたらもったいないですよね。
ただ512mbアップロードできるのかというと、ほぼ無理で実際は40MBもアップロードできれば上出来でます。動画投稿はちょっとややこしいですね。
【GAS】Twitter API v2で画像複数枚投稿(media upload)の実装
これではうまくいかきません。chatGPT4君はこう書きたがるけど…、GPT君それは違うんだよ…。
"status": "ツイート.",
"attachments": {
"media_keys": mediaIds
}
【GAS】Twitter API v2で動画投稿の実装
基礎知識が必要です。
Twitterのチャンクトメディアアップロードでは、大きなファイルを”チャンク”と呼ばれる小さな部分に分割し、それらを個別にアップロードします。これにはINIT(初期化)、APPEND(追加)、FINALIZE(終了)の3つのステップが必要です。
- INIT: これはメディアのアップロードを開始するためのステップです。ここでTwitterにアップロードするメディアの全体的な情報(ファイルサイズ、ファイルのタイプなど)を提供します。Twitterからは、後続のAPPENDとFINALIZEステップで使用するメディアIDが返されます。
- APPEND: このステップで、実際にメディアのデータ(チャンク)をアップロードします。INITで取得したメディアIDと、アップロードするデータのチャンクをパラメータとして送信します。大きなファイルは複数のチャンクに分割され、それぞれが個別のAPPENDリクエストでアップロードされます。
- FINALIZE: すべてのチャンクがアップロードされた後、FINALIZEステップを実行します。これにより、Twitterはアップロードされたチャンクを1つのメディアファイルに組み立てます。
boothなどでツールとして販売することにしてしまったため、詳しい実装方法は控えさせてもらいます。
転売・転載だけは禁止しているため販売目的な人には使えませんが、個人的にプログラミングの勉強のためにほしいならお買い上げしてもらってもOKです。
改変はOKなので、販売や転載さえしなければ、こっそりとカスタマイズしてもらってもかまわないというゆるいライセンスにしています。アフィリエイトもできるようにしたいため応援してもらえれば幸いです。
message: ‘Video frame rate 65.0 (fps) exceeds max frame rate of 60.0 (fps)’ } } }
こちらはフレームレートエラーです。
{ state: 'in_progress',
progress_percent: 99,
error:
{ code: 3,
name: 'UnsupportedMedia',
message: 'Video frame rate 65.0 (fps) exceeds max frame rate of 60.0 (fps)' } } }
Twitterの仕様は60フレームまでです。
PC画面録画ソフトは固定フレームレートで書き出さないとこのようなことが起きます。
デモクリエイターやBandicamで固定フレームレートで録画しなおしましょう!
Twitter API v2で動画投稿のステータスコード概要
200 (OK)
- •一般的な成功を示すステータスコードです。
- •リクエストが成功し、サーバーが通常どおりに結果を返却した場合。
202 (Accepted)
- リクエストを受理はしたが、処理が完了していない場合に返されるステータスコード。
- 「サーバー側で後続の処理が走るが、レスポンス時点では完了していない」という意味で、非同期処理によく使われます。
- X API v2 の動画アップロードでは、INIT時やAPPEND時、あるいはFINALIZE時などに 202 が返り、サーバー側がアップロードを受け付けて、処理中であることを示すケースがあります。
204 (No Content)
- 成功を示すが、レスポンスボディが空である場合に返されるステータスコード。
- 画像アップロードなどでもまれに返される場合があります(処理は成功したが、特に返すデータがない)。
default (その他 4xx / 5xx など)
- 上記以外のステータスコードを含むエラーケース。
- 4xx はクライアント側のエラー、5xx はサーバー側のエラーを示す。
50GBぴったりの動画を作成する
容量の検証用に指定容量ぴったりの動画が必要になる場合があります。この場合は動画編集ソフトで長めの動画を切るという方法が楽という気がしました。動画編集ソフトを1本もっているとよいです。
【GAS】Twitter API v2でツリー投稿の実装
referenced_tweets,conversation_id,in_reply_to_user_idどれ?
投稿者のscreenNameからuserIDを割り出し、referenced_tweetsでツリー投稿できるのではないかと軽く実装しましたね。ただし、よくよくみると、このreferenced_tweetsはRetweetなども含まれているし、エラーなどをみているとfreeプランではうまくいかないのではないかと10分ぐらいで止めました。
const payload = {
referenced_tweets: [
{
type: "replied_to",
id: preTweetId
}
]
}
ちなみに、conversation_idはスレッドを取得するものです。
もうひとつのアイデアがあったため、そちらに切り替えたらあっさりとスレッド投稿が実行できました。boothなどでツールとして販売することにしてしまったため、詳しい実装方法は控えさせてもらいます。
ヒントだけだしておくとin_reply_to_user_idで実装しました。ただ、v1.1みたいなやり方ではうまくいきません。。
解決するためにTwitterDevが書いたソースコードの中身などをあさりました。
【GAS】Twitter APIの画像投稿・動画投稿でよくでるエラー
Twitter API v2 endpoints and limited v1.1 endpoints (e.g. media post, oauth) only. …
このエラーはTwitter API 1.1で使えないもの。V2を使いましょう。
メディアなどVer1.1で利用可能なものはv2に橋渡しすればよいです。
Exception: Request failed for https://api.twitter.com returned code 403. Truncated server response: {"errors":[{"message":"You currently have access to a subset of Twitter API v2 endpoints and limited v1.1 endpoints (e.g. media post, oauth) only. ... (use muteHttpExceptions option to examine full
“message”:”$.media_keys: is not defined in the schema and the schema
このエラーは型が違います。
{"errors":[{"message":"$.media_keys: is not defined in the schema and the schema does not allow additional properties"}],"title":"Invalid Request","detail":"One or more parameters to your request was invalid.","type":"https://api.twitter.com/2/problems/invalid-request"}
プログラマ初心者でツールをご購入の方は改変は自由です。時短したい方はよかったらどうぞ!(再販売と転載は禁止していますのでご了承ください。)
chatGPT4君はTwitter Botツールを開発できるスキルがない!? (番外編コラム)
chatGPT4君、落ち込んじゃダメだよ(´;ω;`)
今回のプロジェクトではchatGPT君とはじめてくみました。
chatGPT4を使っています、1番賢いやつです。
しかし、Twitterの予約投稿ツールの開発は肝心なポイントでGPT君はすべて自覚なき嘘をついてしまいましたね。画像投稿、画像複数枚投稿、動画投稿、ツリー投稿などの肝心なコードはかけませんでした。しかも、GPTが劣化する前のやつ…。
全部自力で実装して解決です。
うーん、こんなもんかな(´・ω・`)。
誰でもかける簡単なコードをかいてもらう分にはタイピングなどは早いから使いどころはあります。僕よりかなりタイピングは早いです。むしろ、ChatGPTは使っていない人は損をしています。ただ、僕レベルでそう感じてしまったため、ベテランプログラマさんにはまだまだ叶う領域に達していませんね。
中級者以上のエンジニアはぐぐって、答えがなくても軽々解決してきますからね。
初心者エンジニアでぐぐって絶対に答えがないとわかっている人(このレベルまではできるようになります)は、そのようなエンジニアさんに会うとびっくりする人もいますね。
最近、AIを過剰に評価している人はどちらかというとちゃんと検証していない情報弱者?なのかなと気になりましすね。
初心者プログラマーさんでAIを過剰に評価している方は変な方向にハマってしまいます。適切な説明をして2回ぐらい試しても実装できなかったら、GPT君のコードをひきとって自分で書いた方が解決も早いはずです。
結論としてはプログラミングをちゃんと勉強しましょう(´・ω・`)という当たり前のところにおちつきました。
ただ、chatGPT君がいると開発工数が短くできますね。はじめてさわる言語などではかなり頼りになります。
やっぱGPT君すごい!(褒めてのばす)(`・ω・´)

短期プロジェクトとなりましたが、Craft Twixもよろしくお願いします。
ほかにもいろいろと開発しています。ブログだけはなく、Twitterなどでも個人開発の話をしていきたいですね。
ご参考になれば幸いです。
コメント
はじめまして。
突然のコメント失礼いたします。
自身もX(旧Twitter)の自動投稿ツールを開発しておりますが、画像/動画付き投稿について1点お聞きしたいことがございます。
v1で画像/動画アップロード→v2で投稿という形で実行できていた画像/動画付き投稿処理が、2023/11/20以降、機能しなくなってしまいました。
(Expired tokenのエラー)
タイミング的に、v1の「/1.1/statuses/update_with_media」が終了したことが原因と考えたのですが、検索すると未だに画像/動画付き投稿ができているとの投稿が散見され、不思議に思っています。
https://developer.twitter.com/en/docs/twitter-api/migrate/twitter-api-endpoint-map
上記のEndpoint mapでも、v2での media機能は「2024 Q1/Q2」のリリース予定とされており、まだ実装されていないようなのですが、neru様のツールでも未だ問題なく画像/動画付き投稿ができていますでしょうか?
ツール販売中のため詳細は公開できないとのことですが、可能な範囲で構いませんのでご回答いただけると嬉しいです。
どうぞよろしくお願いいたします。
申し訳ありません。気付くのが遅れました。
画像投稿と動画投稿は特に問題なく投稿できています(本日確認済)。
もしかしたら他が原因ではないでしょうか。Expired tokenエラーとは89エラーでしょうか。それであれば、APIを作り直せば改善できるはずです。
このエラーはTwitter APIを使っていると起こる定番のエラーで、Expired tokenという訳のとおりなのですが、突然、トクーンが期限切れになる場合があります。
運が悪いとでちゃうエラーで、改善方法は個人的に知る限り、APIの再作成しかありません。
丁寧なご回答ありがとうございます。
おっしゃる通り、API再作成で無事に画像/動画投稿の機能が復活しました!
本当に助かりました、ありがとうございます!!
X(Twitter)社の管理の影響を受けて、こちらではどうしようもないみたいです。ちょっと面倒に巻き込まれてしまった感じのエラーです。
Twitter APIと付き合っていくために、個人的にも何度か作り直しています。
無事、伝わって解決したようでよかったです!
Craft Twix購入者です。お世話になります。
下記記事にもある通り、2025年2月ごろから、新規のGAS&Xの連携に障害が発生しているようです。
ttps://programming-zero.net/how-to-resolve-x-rules-policies-error/
具体的には、規約違反だというエラーメッセージが出て、そのまま続けても文章のみのGAS予約投稿はできるが、画像や動画の添付投稿ができなくなってしまったというものになります。
1度アプリ許可を解除、再度キーを生成して認証とって連携させても、やはり画像・動画添付の投稿はCraft Twixのスプシからはできなくなっています。
こちらご対応お願いしたいです。
コメント気付くの遅くなり申し訳ございません。
正規の問い合わせルート以外は反応が遅れることがあります。
また、お使いありがとうございます。
2月末には事態を把握しており、対応中です。
申し訳ございませんが、現在、APIの再作成はダメです。。
運用済みのアカウントは画像投稿や動画投稿もOKのはずですが、
やりなおしをすると凍結の危険性もあります。
現在の対応方法はこちらの記事をご覧ください。
https://mh-story.sakura.ne.jp/x-api-error/
今回、問題が大きいため時間がかかります。運用方法事態を見直さないといけません。ご容赦ください。