GitHub ActionsでX自動投稿BOTを作る方法【無料・GUI操作で完結】

クラウド連携

今回はGitHub Actionsを「部下」にした記事です。
GitHub Actions × X API により、
「過去記事が毎朝勝手に投稿される」仕組みの作り方を解説していきます。

本記事は
「自動投稿BOTを作りたいが、サーバを立てたくない/コードをゴリゴリ書きたくない人」
向けにGUI操作を省略せず、1画面ずつ確認しながら進める構成にしています。

サイト全体の総量が半端ないので、目次がエラいことになってしまってます。
以下こういうことをしているとザックリ解説するミニ目次を作っておきます⇩

  1. GitHubでリポジトリ作る
  2. posts/requirements/state/bot/post.yml作る
  3. X Developerでキー発行
  4. Secrets入れる
  5. ActionsでRun

GitHub ActionsでX自動投稿BOTを作る方法【無料・GUI操作で完結】

はじめに

筆者は面倒くさがりなので、定期的に過去記事を自前宣伝するとか、
そういうマメな活動が続きません。

だけど、自分が丹精込めて投稿した記事は誰かに見てもらいたい。。。
インフラ屋的に、自動記事投稿してくれるような仕組みを用意できたらなぁ。。。
(それも何かのサービスへ課金してとかじゃなく、あくまで自前/最小限のアクションで)

そうだ、BOTを作ろう!

こういう思い立ちがあり、仕組みの作成と再現性のある記事化まで行うことにしました。

完成形のイメージ

とりあえず完成形のサンプルをご提供します⇩

このように、毎日決まった時間に投稿してくれています。
本記事に沿って構築を行えば、以下ができるようになります⇩

  • 毎日決まった時間に X に投稿
  • 自分のブログ / note の URL を自動で流す
  • PCオフでも動く

ざっとこういうイメージの構成です⇩
めちゃシンプル。

[GitHub Actions] → [X API] → [POST]

本記事においてGitHubの中身はこんな感じで完成します⇩

普段触るのは posts.txt だけです。他は一度作ったら基本放置でOK

事前準備

とりあえず、本記事で紹介する手順がお気に召したら
「実運用しているアカウントで実装」していただくのが良いと思います。
まずは捨て垢を作って検証してみることをお勧めします(そんなに難しくないので)

用意するもの

  • GitHub アカウント(※捨てアカ推奨)
  • X アカウント(※捨てアカ推奨)
  • PC(ブラウザだけ使う)

X アカウント作成

※Xの本アカウントを使う場合はスキップしてOK

シークレットウィンドウを開いてまずはコチラへアクセス⇩(Xの公式)

https://twitter.com

※関係ないですが、Twitterのドメインからのリダイレクトなんですねー

2-2-①:まずはアカウントを作成します⇩


2-2-②:必要事項を記入します⇩


ちなみに、「Addache-test」として捨て垢を作成しています。
この記事を投稿するころには削除しています。
ここ経由でコンタクトは取れません。ご了承ください。

2-2-③:登録したメールアドレスへ認証コードが送付されます⇩


これを次の画面で入力してください。

2-2-④:さっき設定したパスワードを入力⇩


2-2-⑤:プロフィール画像は設定しなくてヨシ⇩


2-2-⑥:とりあえずランダム生成されたアカウント名を確認して次へ⇩


※変更してもよいです。筆者は捨て垢として作成してるので、これで問題なし。
 後で使うのでアカウントは覚えておくようにしましょう。

2-2-⑦:通知はオフのままでよいです⇩


2-2-⑨:興味のあるトピックを選択してください⇩


これは何か選ばないと先へ進ませてくれません。適当にビジネスを選択。

2-2-⑩:アカウントを1件以上フォロー⇩


これも何か選択しないと先へ進ませてくれません。適当にひとつフォロー

2-2-⑪:ほぼ完了だけど、とりあえず[Got it]しておく⇩


2-2-⑫:おめでとう!捨てアカウント作成できた!⇩


GitHub アカウント作成

※GitHubの本アカウントを使う場合はスキップしてOK

同じくシークレットウィンドウを開いてコチラへアクセス⇩(GitHubの公式)

GitHub · Change is constant. GitHub keeps you ahead.
Join the world's most widely adopted, AI-powered developer platform where millions of developers, businesses, and the la...

2-3-①:まずは右上のSign Up⇩


2-3-②:Create an accountを押下⇩


2-3-③:Email/Password/Username を入力して[Create account]を押下⇩


2-3-④:するとEmailへ認証コードが送られてきます⇩


2-3-⑤:認証コードを入力⇩


2-3-⑥:画面遷移して、改めてSign in画面が出てくるので
今度はUser名とパスワードでログイン⇩


2-3-⑦:ここまでくればアカウント作成完了です⇩


注意事項

本アカウント作成手順は2026年1月時点のものです。
見た目や要求事項などが将来的に変わる可能性がありますことをご了承ください。

GitHub:リポジトリ作成(GUI操作フル)

さて、ここからは先ほどのGitHubアカウント作成画面からの続きです。

新規リポジトリ作成

3-1-①:[Create repository]を押下


3-1-②:リポジトリの初期設定を行う⇩


以下に倣って作成してみてください。ちなみに筆者のGitHub捨てアカウントは
「addache-test」です。

■リポジトリ名:


x-bot

Choose visibility:Private

3-1-②補足:PublicとPrivate


Publicにすると「すべてのGitHubユーザないしはインターネットから」
作成したデータが丸見えの状態になります。編集はされなくとも
「誰のブログbotなのか」URLなどから識別できるようになってしまいます。

全公開の呼吸 壱ノ型!Publicリポジトリ!

・・・匿名性を担保したければ忘れずPrivateへ変更しましょう⇩

3-1-③:空っぽのリポジトリが作成されたので、Readmeを作る⇩


ここが一番わかりずらいところです。
色々書いてありますがあまり気にせず、枠線部分をクリックしてください。

3-1-④:Readmeを作成します⇩


以下のコードを使って作成してください、とりあえず貼りつけていけばOK。

■File name(画面左上の入力欄):

README.md

■中身(画面中央の大きな空欄):

# x-bot

Daily X posting bot using GitHub Actions

x-botの横に🔒(錠前)がついていますが、これが表示されていれば
「プライベートリポジトリ」です。誰からも見れないものになってるのでご安心ください。

3-1-⑤:Commit changes?⇩


これは「何を変えたか?」などを記述できるポップアップです。
開発者にとっては大変重要な入力欄ですが、ちょっと使うだけな分には無視してOK
※以降も度々出てきますが、説明は省略いたします。見えたら[Commit changes]してください

3-1-⑥:Readme が作成された⇩


ファイルをGUIで全部作る

さてドンドン行きましょう。この章は順番が前後しても問題ありませんが、
抜け漏れ防止のため上から順に作成していってください。

posts.txt を作る

これはあとでブログURLなどを記入するための雛型です。

4-1-①:[Add file] → [Create new file]する⇩


さっきの画面の左上にあるボタンを押下すると

こんな感じで開きます。

4-1-③:posts.txtを作成する⇩


以下のコードを使って作成してください、とりあえず貼りつけていけばOK。

■File name(画面左上の入力欄):

posts.txt

■中身(画面中央の大きな空欄):

ものすごく長いテキストなので、コピペ用のコードはGitHubへ退避させました。
以下をクリックします⇩

☆posts.txtのソースコード置き場☆

開いたら画像の部分をクリックしてください(コピーされます)

こんな感じで貼り付けます⇩
※制作時は2行でしたが、諸事情で増やしてます。気にせず9行分貼ってください。

requirements.txt を作る

これは必要になるライブラリを指定し、
仮想マシンへ事前インストールさせるための設定ファイルです。

4-2-①:[Add file] → [Create new file]する⇩


また画面の左上にあるボタンを押下し、[Create new file]します。

4-2-②:requirements.txtを作成する⇩


以下のコードを使って作成してください、とりあえず貼りつけていけばOK。

■File name(画面左上の入力欄):

requirements.txt

■中身(画面中央の大きな空欄):

requests
requests-oauthlib

state.json を作る

これはGitHub実行後の状態を記録するファイルです。
ここのカウントを見て、次回POSTするURLを決定します。

  • 何のためのファイルか
  • なぜ GitHub に commit するのか

4-3-①:[Add file] → [Create new file]する⇩


また画面の左上にあるボタンを押下し、[Create new file]します。

4-3-②:state.jsonを作成する⇩


以下のコードを使って作成してください、とりあえず貼りつけていけばOK。

■File name(画面左上の入力欄):

state.json

■中身(画面中央の大きな空欄):

{
  "next_index": 0
}

CheckPoint

ここまで順当に作成していればこのような形になっているはずです。
ひとまずこれが存在するかご確認ください⇩

GitHubの動作について補足

これから実行していく、GitHub Actions は
毎回別の仮想マシンを使って実行する環境です。
無料で利用できる代わり、前回起動したときのことを覚えていません。

そのため本章では、最低限覚えておいてほしいパラメータ
テキストあるいはJSONの形で保存できるようにセットアップしました。


bot.py

完成コード全文を貼り付けして作成

5-1-①:[Add file] → [Create new file]する⇩


また画面の左上にあるボタンを押下し、[Create new file]します。

5-1-②:bot.pyを作成する⇩


以下のコードを使って作成してください、とりあえず貼りつけていけばOK。

■File name(画面左上の入力欄):

bot.py

■中身(画面中央の大きな空欄):

以下のようなコードを貼り付けます※こちらはイメージです。このままではコピーできません

※中身が気になる方はChatGPTなどAIに質問するといいです

ものすごく長いテキストなので、コピペ用のコードはGitHubへ退避させました。
以下をクリックします⇩

☆bot.pyのソースコード置き場☆

開いたら画像の部分をクリックしてください(コピーされます)

作成中のGitHubへ、このように貼り付けます⇩

このコードがやっていること(3点だけ)

少しだけ説明します⇩

  • URLを1つ選ぶ
  • Xに投稿する
  • 投稿済みを記録する

補足:テスト実行時に同一URLを何度も投稿しても弾かれにくいよう、
   投稿文の見出し部分だけランダム化しています。


GitHub Actions 設定

workflows フォルダを作る

6-1-①:[Add file] → [Create new file]する⇩


また画面の左上にあるボタンを押下し、[Create new file]します。

6-1-②:post.ymlを作成する⇩


以下のコードを使って作成してください、とりあえず貼りつけていけばOK。
これまでのモノと違って“/”(スラッシュ)で階層を区切っていますが、
そのまま貼り付けて問題ありません。
※階層ごと自動生成されます。頑張らなくていいです。

■File name(画面左上の入力欄):

.github/workflows/post.yml

■中身(画面中央の大きな空欄):

以下のようなコードを貼り付けます※こちらはイメージです。このままではコピーできません

※中身が気になる方はChatGPTなどAIに質問するといいです

ものすごく長いテキストなので、コピペ用のコードはGitHubへ退避させました。
以下をクリックします⇩

☆post.ymlのソースコード置き場☆

開いたら画像の部分をクリックしてください(コピーされます)

ymlの作成をしようとすると、急に右側へ賑やかしが出てきますがスルーして問題なし。
作成中のGitHubへ、このように貼り付けます⇩

cron について

さて先ほど作成したymlの冒頭部分に以下のような記述があったはずです⇩

- cron: "0 0 * * *"

これが起動時間を決定しているパラメータで、俗に[cron]と言います。
少しだけ説明します。
※cronが理解できている人は読み飛ばしてもらってよいです

まずは上記のパラメータの意味


5つのブロックに分かれていますが、ざっとこういうものと認識ください⇩

[分] [時] [日] [曜日] [月]

これをymlへ記述したcron式に当てはめると、

『毎日0時0分(UTC時間)に実行します』

とスケジュールを設定している感じになります。

UTC / JST のズレ


勘のいいひとは気づいたかもしれませんがUTC時間基準の仕組みになっています。
なので、日本時間基準で言うと

毎日0時0分(UTC時間)毎日9時0分(JST時間)に実行します』

という感じになり、時差が発生します。(JSTは UTC +9h)

好きな時間に変えていい


このcron式は、時間を変更しないと毎日9時に投稿される、つまり
「検証結果を確認するには、翌日9時を待たなければいけない」
ということになります。

翌日まで待ってられない人は、時間を変更してみてください。
いくつかサンプルを置いておきますので、上記のymlを編集して
ここだけ書き変えてみてください。
※元の記述が残っていると構文エラーになります。まるごと「置き換える」イメージ。
※なお変更ポイントは太字になってます。そこだけ手で直してもOK。

1.毎日20時に実行する

on:
  schedule:
    - cron: "0 11 * * *"
  workflow_dispatch:

2.毎日15時に実行する

on:
  schedule:
    - cron: "0 6 * * *"
  workflow_dispatch:

3.毎日6時30分に実行する(UTC時間では21時=日本時間30時という考え方)

on:
  schedule:
    - cron: "30 21 * * *"
  workflow_dispatch:

例えばですが、実際にbot運用開始するにあたって、

毎日18時00分に年中無休で記事の公告をするアカウント

がいたとしたら、「botじゃないか?」と疑いますよね?
ここをあえて8時13分 などとキリの悪い時間に設定することで

  • 「人間臭い時間にする」
  • 「人間が片手間に頑張って投稿しているように見せかける」

表現も可能です。こうするとbot感は少し柔らかくなります。
※よく観察すれば分かりますけどね

また例えば「世間の通勤時間を狙って投稿する」なども可能です。
こういうところが気になる方には一考の余地があります。

なお「cron+コード内でのランダム処理」などを絡めると
もっと細かく制御することもできますが、長くなるのでこの辺にて失礼します。

X Developer Portal

さてGitHubの初期設定も整ったところで、
いよいよX Developerの登録および攻略を実施していきます。

ここからの手順はノーヒントで実施すると地獄ゾーンです。
言いすぎじゃありません。意味不明です、本当に。

目的

この章の目的は以下です。
結構大変ですが、手順通りに実行していけば楽勝です⇩

  • X Develperアカウントを作成する
  • 上記とGitHubを連携させるために必要なSecret keyやTokenを発行/入手する

Developer 登録

登録の前にさらっと、以下を解説しますね。

料金の誤解


X APIは有料になったと噂が流れたことがありました。
しかしながら、2026年現在においても無料枠はちゃんと用意されています。

無料枠でできること


ただし、無料枠においては制約があります。例えば⇩

  • Developer アカウント作成
  • Project / App 作成
  • 自分のアカウントでツイートを投稿(User context)
  • 月数10〜100件程度の投稿(毎日1件=約30件/月は余裕)

つまり、
月100件ぐらいなら無料で実行できる、毎日1件=月30件ぐらいなら余裕
です。

逆に、有料枠で登録しないといけないのはこういうケースです⇩

  • 大量投稿(数百〜数千/月)
  • 複数アカウントを横断して投稿
  • 検索・ストリームAPIをガンガン叩く
  • 企業用途・商用SaaS

なので、本記事の用途程度であれば無料枠で十分です。
個人BOT・趣味・ブログ宣伝は無料枠で想定されてるということです。

クレカの登録を求められた場合は、課金しようとしているのでご注意ください。

とりあえず、色々納得いただけた方は次へお進みください。

7-1-①:X Developer登録


同じくシークレットウィンドウを開いてコチラへアクセス⇩(GitHubの公式)

Developer Portal - X
Build, analyze, and innovate with X's real-time, global data and APIs. Access comprehensive API documentation, SDKs, tut...

この表示が出る場合は、今から説明する番外編を実施します⇩
※とりあえずSettings を押下してください

※X Develperを利用するには携帯電話番号登録が必須になっています。
 捨て垢前提でここまで進めている方は、
 この制約を必ず踏み抜きますので手順を置いておきます。

7-1-①(番外編):電話番号登録


普通にマイXアカウントへジャンプします。
とりあえずパスワード認証を聞かれた場合は入力して[Confirm]してください⇩

パスワード認証が通ったら、表示が少し変わりますので
[Phone]を探してクリックします⇩

電話番号を入力します。
国別コードから始まってるので、以下のように読み替えて入力してください
※電話番号はご自身のものを記述しましょう

(頭の0をとった番号にする)
09012345678 ➡ 9012345678

あと、レ点チェックはすべて外してOKです⇩

すると携帯電話番号に認証コードが飛びますので、
ショートメールを見て入力します⇩

ここまで来たらもう一度、以下の画面でSign upを試してください⇩

長い番外編でした🍵

7-1-②:[Sign up for free Account]を押下する⇩


非常に重要なところなので、表示に惑わされず
心を強く持って、以下赤枠を押下ください⇩
※黒いボタンは課金アカウントへの誘導です。

7-1-③:[Sign up for free Account]を押下する⇩


色々聞かれます。まずはこれ⇩

Describe all of your use cases of X’s data and API:
We need this information for data protection.

(翻訳)
X のデータと API のユースケースをすべて説明してください。
この情報はデータ保護のために必要です。

回答として、以下の例文をそのまま貼り付けてください⇩

This application will be used to operate a personal automation bot that posts updates to my own X account. The bot will publish links to blog articles that I personally create and manage, including a self-hosted technical blog and posts on the note platform. The purpose of these posts is to share knowledge, document personal experiences, and introduce new or existing articles to a broader audience.

The bot will post at a limited frequency, typically once per day at a scheduled time, and occasionally when a new article is published. All content is original or owned by me, and no third-party or private user data will be collected, stored, or analyzed. The goal is community engagement, knowledge sharing, and connecting with readers who have similar interests, not spam, manipulation, or automated interactions.

上記は善良な市民BOT宣言で、ざっくりこういう意味です(ガチ翻訳すると超長いです)⇩

「ワイのブログを、1日1回そっと紹介するだけや。
他人のデータ触らん。荒らさん。
静かに人と繋がりたいだけや」

他にも以下のような3つの質問がありますが、すべてレ点を入れてください。
これらに同意できない場合は、X Developerを利用できません

You understand that you may not resell anything you receive via the X APIs

(翻訳)
X APIを通じて受け取ったものを再販することはできないことを理解しています

You understand your Developer account may be terminated if you violate the Developer Agreement or any of the Incorporated Developer Terms

(翻訳)
開発者契約または組み込まれた開発者規約のいずれかに違反した場合、開発者アカウントが終了される可能性があることを理解しています。

You accept the Terms & Conditions

(翻訳)
利用規約に同意します

最終的にこんな感じになります⇩

7-1-④:うまく行ったらこの画面になります。🔑アイコンをクリック⇩


User Authentication Settings設定

いよいよX Develperの設定を行っていきます。

7-2-①:[Settings]タブを選択して、画面の[Set up]を押下⇩


7-2-②(前半):User Authentication Settings⇩


赤枠の部分を選択して、下へスクロールします。

7-2-②(後半):User Authentication Settings⇩


入力必須の空欄がふたつありますが真面目に入力する必要はありません。
この辺りは以下のような行為を[X API]で実行したいときにちゃんと入力するべき箇所です⇩

  • 他人に「このアプリを認可させる」
  • OAuth2ログインを提供する
  • email取得・外部サービス連携
  • 商用SaaS・公開アプリ

とまあ、本記事の用途には全く該当していませんよね。
手順に戻ります。

[Callback URL / Redirect URL]には以下のような「意味のない」URLを入れておきます。

https://example.com/callback

[Website URL]にもまた、「意味のない」URLを入れておきます⇩

https://example.com

7-2-③:権限などを変更するか?と質問されるので[Yes]⇩


7-2-④:Save後のClient IDなどの表示(無視)⇩


必要な場合は控えておくべきですが、今回は不要です。
※筆者は捨て垢で手順を作っているので堂々と晒しています。
 不用意に他人に見せないように!

7-2-⑤:パスワードを保存したか?と質問されるので
[Yes, I saved it](実際は無視しているが)⇩


Keys and tokens

続いて、本命のSecret keyやTokenを発行していきます。
これは以下のように、テキストで保存してください(後で必要になりますので)⇩

ちなみに「メモ帳」ではなく「サクラエディタ」です。
テキストを一時保持できれば何に書いても問題ありません。

7-3-①:[Keys and tokens]タブを選択し、
[Consumer Keys]の[Regenerate]を押下⇩


これまでの手順通りに進めていれば、タブを選択するだけで画面切り替えが可能なはずです。
もし迷子になっていたら、
左上[Developer Portal]のリストを開いて[Dashboard]を押下してください。
(戻ってこれるはず)

7-3-②:[Yes, Regenerate]を押下⇩


7-3-③:[API Key&API Key Secret]が新たに発行されるのでメモする⇩


右のCopyを押下して、メモ帳などに貼り付けましょう。
[Yes, I saved them]を押下するのも忘れずに。

  • 上:API Key
  • 下:API Key Secret

7-3-④:[Keys and tokens]タブを選択し、
[Access Token and Secret]の[Generate]を押下⇩


タブは基本触らなくてもこの画面からスタートかと思います。
[Authentication Tokens]はふたつありますが、上記タイトルの
[Access Token and Secret]を選択してください。
もう1個のほうを発行しても意味ありません。

7-3-⑤:[Access Token&Access Token Secret]
が新たに発行されるのでメモする⇩


右のCopyを押下して、メモ帳などに貼り付けましょう。
[Yes, I saved them]を押下するのも忘れずに。

  • 上:Access Token
  • 下:Access Token Secret

7-3-⑥:チェック


画面が切り替わったら以下部分をチェックします。
[Create with Read and Write permissons]になっていることを確認します。

もし、Read Onlyなどとなっている場合は、7-2からやり直したほうが無難です。
(なにか手順が漏れている)

GitHub Secrets 設定

7章で入手した以下のパラメータをGitHubへ設定していきます。

  • API Key
  • API Key Secret
  • Access Token
  • Access Token Secret

これらはGitHubのSecretsへ入力します。
ここに保管したパラメータは例え

  • Publicなリポジトリにしていたとしても
  • アカウントを乗っ取られたりしても

解読を試みることができません。非常にセキュアです。
ただし自分自身も入力後はパラメータを確認できなくなりますので、ご注意ください。
※間違えた気がした場合は、作り直さずとも上書き修正可能

Secrets設定画面へ移動する

GitHubの画面で[Setting]を押下します。これは常に上部へ表示されています
「リポジトリを変更したり」などといった大冒険でもしない限りは、迷うことはないでしょう。

8-1-①:Settingsを押下⇩


8-1-②:[Secrets and variables]を開き、[Actions]を押下⇩


各種Secretsの設定

ここまで来たらあとは繰り返しです。先にパラメータの関係を記述しておきます。

Name (パラメータのタイトル)Secret (入手した文字列)
X_API_KEY[API Key]
X_API_SECRET[API Key Secret]
X_ACCESS_TOKEN[Access Token]
X_ACCESS_TOKEN_SECRET[Access Token Secret]

8-2-①:[New repository secrets]を押下⇩


8-2-②:New Secrets を登録 1回目


記念すべきひとつ目のパラメータは以下のNameで登録します。

X_API_KEY

Secret の値は筆者が提示することはできません。
先ほど入手したものを利用してください。

8-2-③:[New repository secrets]を押下⇩


ひとつ目を登録した後は少し表示が変わりますが、焦らず臆せず。
ボタンの位置が少し移動しただけです。
※以降は割愛します

8-2-④:New Secrets を登録 2回目


ふたつ目のパラメータは以下のNameで登録します。

X_API_SECRET

Secret の値は筆者が提示することはできません。
先ほど入手したものを利用してください。

8-2-⑤:New Secrets を登録 3回目


同じ要領で登録画面を開きます。
みっつ目のパラメータは以下のNameで登録します。

X_ACCESS_TOKEN

Secret の値は筆者が提示することはできません。
先ほど入手したものを利用してください。

8-2-⑥:New Secrets を登録 4回目


同じ要領で登録画面を開きます。
よっつ目のパラメータは以下のNameで登録します。

X_ACCESS_TOKEN_SECRET

Secret の値は筆者が提示することはできません。
先ほど入手したものを利用してください。

8-2-⑦:登録チェック


以下の状態になることを確認ください。
万が一足りなければ、手順を戻って追加してください。

なおこの辺りの操作は「プログラミング」の範疇なので、

「1文字でも間違っていたら動きません」

コピペしていくだけに簡素化しているので、まず間違えないとは思いますが、
テキトウに登録しても絶対に動かないということを念頭においてくださいね。
※全体通して手打ちは避けましょう

動作確認

さて、ここまで非常に長いこと準備してきましたが
ついに、試運転するフェーズに差し掛かってまいりました!
早速、手動実行して動作確認していきましょう!

Actions → Run workflow

9-1-①:上部の[Actions]を押下して、[Post daily to X]をクリック⇩


9-1-②:[Run workflow]を開いて、[Run workflow(緑ボタン)]を押下⇩


すると、数秒で以下のように実行中のジョブが表示されます⇩

しばらく待っていると(これも20秒程度)、このように結果が表示されます⇩

  • 緑:成功
  • 黄:実行中
  • 赤:失敗

画像のように、緑だったら成功です。Xに投稿されているか見に行ってみましょう。

9-1-③:Xに投稿が出る


以下はReplies(返信)を見ていますがPostsにも普通に見えてます。
Postsに表示されない場合は、ブラウザのリロードなどを行ってみてください。


やったあああああああああ動きました!


9-1-④:state.json が勝手に更新される


続いて、もうひとつの確認ポイントです。
GitHub上部の[Code]を選択して、[state.json]をクリックして表示します。
更新時間がここだけ最新になっているぞ・・・!?

ふむ、普通だ。いや待て・・・・

ここは初期設定したとき以下でした。ちゃんとカウントアップされてますね⇩

{
  "next_index": 0
}

ここがカウントアップされることによって、次にPostするときのURLが変わります。
[posts.txt]へ以下のようなコードを登録していたはずです。

`https://example.com/article1 >今さっきPostされたもの
`https://example.com/article2 >次にPostされるもの
`https://example.com/article3
`https://example.com/article4
`https://example.com/article5
`https://example.com/article6
`https://example.com/article7
`https://example.com/article8
`https://example.com/article9

ちゃんとロジックが動作してますね!


よくある詰まりポイント

もしかしたら、ちゃんと動作しなかった方もいるかもしれないので
今から「色々いじってワザとコケさせます」

時間に動かない

とりあえず手動実行は成功したけど、時間に動作してくれるとは限らないですよね。
cronのパラメータをいじってみます。

10-1-①:[.github/workflows/post.yml]を修正


現在時刻を確認⇩

ふむ、午前5時半ですか。では5:35頃に起動するようにしてみましょうか。
ここを⇩

このように⇩

さて、結果はどうだったかというと⇩

動いてますね。ただ20分ぐらいズレてる・・・

[GitHub Actions] のcron実行はその時間の動作を確約する
ものではないようで、「タイムラグ」が発生しているようです。
今回は20分程度のズレを観測しましたが、
筆者がすでに運用している[X bot] も
毎日このぐらいの時間ズレてます。そういうものなんだそうです。

なお、以下のように設定しても結果の確認がなかなかできません⇩

6:10に設定したつもりになってますが、これだと

15:10(JST)=6:10(UTC)」

という扱いになってしまいます。20分ラグ程度の差じゃないので、ご注意ください。

401 Unauthorized

Secretsのパラメータが誤っているときに発生します。
特に、Nameが間違っていると、[about:blank]などと表示されズッコケます。
8-2. 各種Secretsの設定】を参照して、
登録パラメータのNameなどが間違ってないか確認しましょう。

403 Forbidden – その1

こちらはいろんな原因で発生しますが、以下の場合
「app permissions」というワードが見えています⇩

この場合は[X Develper]において

  1. 【7-2-②(前半):User Authentication Settings】の設定を見直し
  2. さらに[Access Token and Secret]の現在発行されているものを[Revoke]したうえで
  3. [Access Token and Secret]を再[Generate] し
  4. GitHubのSecertsパラメータも更新

しましょう。

403 Forbidden – その2

※2026/1/5 追記しました

私は人間です □ ← チェックを入れる

これは何日か運用していると突如発生することがあるものです。
めちゃ長いエラーログが出力されるパターンで、

「CloudFlareのチャレンジHTMLを踏んでしまった」ときに出力されます⇩

上記のひたすら長いエラーに以下のどれかが含まれているならまず原因確定です。

  • cZone: 'api.twitter.com'
  • Enable JavaScript and cookies to continue
  • __cf_chl
  • challenge-platform

CloudFlare はGitHub Actionが持っている、
ランダムに割り当てられるグローバルIPアドレスを好んでいない
ということでしょう。
そのためコードでの対策は不可能です。

じゃあどうするのか?これは受け止め方によって変わってきます⇩

  • 対策その①:「たまにコケるときがあるのを許容できるなら」しばらく放置。

本記事では「BOT臭を減らす」考え方も後述しています。
「たまに忘れてるように見える、ぐらいのほうが人間味があってプラス」
こういうとらえ方をすれば許容できるかと思います。

  • 対策その②:「毎日確実にPOSTしてくれないと許せない」ならインフラ構成見直し。

こう思ったあなたは発想がシステム屋寄りです。

ランダムなIPアドレスがBOT判定されるのを避けるなら、
毎回固定のIPアドレスからPOSTさせればよい
ということになります。

上記は気が向いたら別記事にするかもしれませんが、
本記事のテーマと離れるので、以降へ追記するのは控えます。

ヒントだけ置いておきます。
「GitHubを引っ越して、そこから毎日POSTさせる」ことで解決します。

「どこに引っ越すか?」の解法は大きくこのどちらかです⇩

  • (無料):家にあるデスクトップPCなどで実行。
  • (有料):AWS/Azureなどのパブリッククラウドを利用し、
    固定のグローバルIPアドレスを設定した仮想マシンから実行。

運用の考え方

1日1回にしている理由

前の章で少し解説していますが、X APIの無料版は月100件しか実行できません。
またそれ以外の謎理由でX Developアカウントが凍結される恐れもあります。
なので自動投稿数はあまり増やすべきではありません。

上記の理由により、本記事のサンプルでは1日1件投稿するcronを提供しています。

cron設定は1時間おきに、などの設定も可能ですが、
自己責任でお願いします。

BOT臭を減らす考え方

自動投稿による記事公告をしてもらえると大変便利です。
ただ、1日1回とも思想が被る部分ではありますが、

「あまりに頻度が多い、それも機械的に」

というムーブをすると、本来記事を読んでほしい読者やフォロワーに敬遠され
離れられてしまうリスクがあります。

なので、実運用を行う際は、自動投稿頻度をなるべく自重の上で
「きっちりした時間にしない」
などの工夫を心掛け、
「人間が片手間で投稿しているような挙動にする」
工夫を忘れないようにしましょう。

GitHubのcron実行はタイムラグが著しい感じがしますが、
一方で「改修されてほぼラグがなくなる」未来も考えられます。
仕様の範疇なので、あまりあてにしすぎないようにしてください。

メンテは最小限

本記事のロジックでそのまま本番運用する場合は、
皆さまのGitHubへ配置した以下ファイルをメンテしてください。

  • posts.txt

ここに対して、皆さまの新着記事URLを追記していく。
それも投稿の度にではなく、「1週間に一度、1ヵ月に一度」程度のメンテです。

作成/動作確認後はそれ以外のコードをメンテするようなことがないと思います。
それでよいのです。ブロガーの役割はあくまで「記事を投稿する」ことなので。
コーディングをガシガシ頑張る必要性はありません。

なおロジックの改修をしたくなった場合は
「ChatGPT」などAIに相談するのが一番だと思います。

本記事のURLを貼り付けて、
[bot.py]の挙動を○○できるように変えてほしい
などと話しかければいいのです。
最低限の労力で最高の成果が期待できます。

そういうわけで、自由に改修していただいて構いません。

API Keysなどは使い捨てにする(保管しない)

本記事でのXアカウントやGitHubアカウントは、「検証用途の使い捨て前提」ですが、
本番運用する前提であっても、

「GitHubのSecretsへ設定したパラメータはメモ帳などに長期保管せず捨ててください」

なぜなら、GitHub Actionsが一度でも稼働確認できれば、

「もう2度と使うことがないもの」だからです。

検証用途でXアカウントやGitHubアカウントを作成した場合は、
パラメータはおろか、アカウントごと削除してしまうことを推奨します。

自動化は作って終わりではない

本記事で構築したのは「車のエンジン部分」です。
車は燃料(記事)がないと走れません。

メンテの項で書いたように、毎日でなくてもよいので適宜、
新しい燃料(記事)をposts.txtへ投入するようにしてください。

さいごに

本記事で提示している構成の強みをおさらいしましょう。

  • 無料で構築運用できる
  • GUIのみで構築が完遂できる
  • コーディングの知識不要
  • 365日毎日勝手に広報活動してくれる
  • PCなどの物理装置に依存しない
  • エンジン部分は一度作成したら放置できる
  • メンテナンスは最低限(posts.txtへの記事追加のみでよい)

後片付け(捨て垢で検証した場合)

以下を削除します。
X Develperの関連付けは、Xアカウントを削除すれば一緒に消滅します。

  • X アカウント (X Develperも消滅)
  • GitHub アカウント

X アカウントを削除する画面はココ⇩


GitHubのアカウントを削除する画面はココ⇩


アイコンをクリックして[Setting]を押下します。

画面が切り替わったら、[Account]を押下⇩

そのまま下部へスクロールしていくと[Delete a account]のボタンがあります⇩

なおGitHubだけ残しておいて、本番化するのもアリです。
Secretsのパラメータだけ差し替えれば、素直に動いてくれますので!

検証用に作成したXアカウントを削除すると、
そのアカウントに紐づく[X Developer]
Project/Appも自動的に無効化されます。

検証後はアカウントごと削除するのが一番安全です。

記事制作裏話

この記事の裏側で何が起きていたかは、
別途 note に記録しています。
技術的な価値はありませんが、供養です。

→ 裏話(供養)

コメント

タイトルとURLをコピーしました