Googleスプレッドシートに書いた投稿文を、毎日決まった時間に X・Instagram・Threads へ自動投稿する仕組みです。GitHub Actions で動くため、サーバー不要・無料で運用できます。
Googleスプレッドシート(投稿文の管理)
│ 毎日決まった時間に GitHub Actions が起動
▼
autopost(Python)── X API v2 ──────────▶ X に投稿
│ ── Threads API ───────▶ Threads に投稿
│ ── Instagram Graph API ▶ Instagram に投稿(画像必須)
▼
結果列に「成功/失敗」を書き戻し(二重投稿防止)
- 1つのSNSで失敗しても、他のSNSへの投稿は止まりません
- 通信エラーやレート制限は自動でリトライします(最大3回・指数バックオフ)
- 失敗した行は結果列に理由が書き込まれ、Actions の実行も「失敗」になるので気づけます
1行目をヘッダーにして、以下の列を用意します(日本語・英語どちらの列名でもOK):
| 日付 | 本文 | 画像URL | 投稿先 | 結果 |
|---|---|---|---|---|
| 2026-06-15 | 今日の投稿です! | https://example.com/a.jpg | x,instagram,threads | (空欄にしておく) |
| 2026-06-16 | テキストだけの投稿 | x,threads |
- 日付:
YYYY-MM-DD。その日になったら投稿されます(2026/6/15形式も可) - 本文: 投稿テキスト(必須)
- 画像URL: 誰でもアクセスできる公開URL。Instagram は画像必須(画像なしの行はInstagramへの投稿に失敗します)
- 投稿先: カンマ区切りで
x/instagram/threads。空欄なら3つ全部 - 結果: スクリプトが自動で書き込みます。手動で触らないでください(値が入っている行は二重投稿防止のためスキップされます)
シートのタブ名は既定で「投稿」です(リポジトリ変数 WORKSHEET_NAME で変更可)。
- スプレッドシートの「共有」→ 一般的なアクセスを**「リンクを知っている全員」(閲覧者)**に変更
- スプレッドシートのURLの
/d/と/editの間の文字列を GitHub SecretSPREADSHEET_IDに登録
これだけです。GOOGLE_CREDENTIALS_JSON を設定しなければ自動的にこのモードで動きます。
投稿済みの記録はシートの「結果」列ではなく、リポジトリ内の posted_log.json に自動コミットされます(二重投稿防止)。
⚠️ リンクを知っている人はシートを閲覧できるようになります。投稿予定の内容はいずれ公開されるものなので通常は問題ありませんが、気になる場合は方法Bへ。
- Google Cloud Console でプロジェクトを作成し、Google Sheets API を有効化
- 「サービスアカウント」を作成し、JSONキーをダウンロード
- スプレッドシートの「共有」で、サービスアカウントのメールアドレス(
xxx@xxx.iam.gserviceaccount.com)を編集者として追加 - JSONファイルの中身を丸ごと GitHub Secret
GOOGLE_CREDENTIALS_JSONに登録 - 方法Aと同様に
SPREADSHEET_IDも登録
- developer.x.com でアプリを作成(無料プランで可)
- アプリの権限を Read and write に変更してから、Keys and tokens で取得:
X_API_KEY/X_API_SECRET(API Key and Secret)X_ACCESS_TOKEN/X_ACCESS_TOKEN_SECRET(Access Token and Secret)
- Meta for Developers でアプリを作成し、Threads API を追加
threads_basicとthreads_content_publishの権限で長期アクセストークンを取得- Secret に登録:
THREADS_ACCESS_TOKEN、THREADS_USER_ID(数値ID。不明なら未設定で可)
- Instagramアカウントをプロアカウントにし、Facebookページと連携
- Meta for Developers のアプリに Instagram Graph API を追加
instagram_basicとinstagram_content_publishの権限で長期アクセストークンを取得- Secret に登録:
IG_ACCESS_TOKEN、IG_BUSINESS_ACCOUNT_ID(InstagramビジネスアカウントのID)
💡 資格情報を登録したSNSだけが有効になります。まず X だけで運用開始し、後から Instagram / Threads を追加することもできます。
.github/workflows/daily-post.yml の cron を編集します。UTC指定なので日本時間から9時間引いてください:
| 投稿したい時刻(JST) | cron |
|---|---|
| 09:00 (既定) | 0 0 * * * |
| 12:00 | 0 3 * * * |
| 20:00 | 0 11 * * * |
- スプレッドシートに投稿予定の行を追加していく
- 毎日決まった時刻に自動投稿され、結果列に
2026-06-15 09:01 x:OK(tweet_id=…) / threads:OK(…)のように記録される - 手動で今すぐ実行したいときは、GitHub の Actions → Daily SNS Post → Run workflow。「DRY RUN」にチェックを入れると、投稿せずに動作確認だけできます
リポジトリ変数 POST_MODE で切り替え:
date(既定): 日付列が今日の行を投稿queue: 日付に関係なく、結果列が空の一番上の行を1件投稿(ストック型運用)
pip install -r requirements.txt pytest
pytest # テスト実行
DRY_RUN=true SPREADSHEET_ID=... GOOGLE_CREDENTIALS_JSON=... python -m autopost.main