目次
✅ このガイドでできること
- 毎日19:00にPADフローが自動実行
- 複数アカウントに対応(
accounts.csvに追加するだけ) - 指定アカウントでXへログイン
- 固定ポストの次の最新ポストへ1件だけリプライ
- 自分のリプが既にある場合はスキップ
- ChatGPT(Custom GPT)でリプ内容自動生成
- ログ出力(
reply_log.csv)
📦 事前準備
以下のファイル・設定を準備してください。
🔹 1. フォルダ構成
XReplyBot/
├─ main_flow.padx ← メインフロー
├─ modules/ ← サブフロー群
│ ├─ LoginAndNavigate.padx
│ ├─ FetchLatestPost.padx
│ ├─ CheckIfAlreadyReplied.padx
│ ├─ GenerateReply.padx
│ ├─ PostReply.padx
│ └─ WriteLog.padx
├─ data/
│ ├─ accounts.csv ← アカウント設定
│ ├─ config.json ← 実行設定
│ ├─ prompt.txt ← ChatGPTプロンプトテンプレ
│ └─ reply_log.csv ← 実行ログ
├─ docs/
│ ├─ setup_guide.pdf ← セットアップ手順書
│ ├─ operation_manual.pdf ← 運用マニュアル
│ └─ known_issues.pdf ← 既知の制約一覧
🔹 2. ファイル内容サンプル
accounts.csv
表示名,ユーザー名,プロフィールURL,ログイン方式
アカウント1,user1,https://x.com/user1,Profile 1
アカウント2,user2,https://x.com/user2,Profile 2
config.json
{
"startTime": "19:00",
"delaySeconds": 5,
"timeoutSeconds": 30,
"maxRetries": 2
}
prompt.txt
以下の内容に対して、簡潔かつ前向きなリプライを作成してください:
【投稿内容】
{{POST_TEXT}}
【リプライ】
reply_log.csv(空でOK)
日時,アカウント,ポストURL,結果
💡 フロー全体の流れ(概要図)
[起動]
↓
[accounts.csv読み込み]
↓ [各アカウントに対して以下を実行] ├─ Chrome起動+ログイン ├─ 固定ポストの次を取得 ├─ 自リプチェック ├─ GPTでリプ生成 ├─ 投稿 └─ ログ出力 ↓ [終了]
🛠 フロー作成ステップ詳細(PAD画面での操作付き)
🏁 STEP1:フローの開始(main_flow.padx)
1. スケジュールトリガー設定(Windowsタスクスケジューラで設定)
- 「Power Automate Desktopのフロー」→「スケジュールタスク」で毎日19:00に実行
📄 STEP2:accounts.csv読み込み
アクション:Excelワークシートから読み取り
- ファイル:
data/accounts.csv - 開始行:2行目(ヘッダは無視)
- 出力:
AccountsList(リスト型)
アクション名:Excelからデータを読み取る(ワークブックを開かずに)
変数名:AccountsList
🔁 STEP3:各アカウントをループ処理
アクション:ループ(For Each)
- 対象:
AccountsList - 現在の項目:
CurrentAccount
アクション名:ループ
配列:%AccountsList%
変数:%CurrentAccount%
🧭 STEP4:Chrome起動・ログイン(LoginAndNavigate.padx)
アクション:サブフローを呼び出す
フロー名:LoginAndNavigate
引数:
ユーザー名:%CurrentAccount["ユーザー名"]%
プロフィールURL:%CurrentAccount["プロフィールURL"]%
プロファイル:%CurrentAccount["ログイン方式"]%
Chromeの起動オプション
"C:\Program Files\Google\Chrome\Application\chrome.exe" --profile-directory="Profile 1"
📰 STEP5:固定ポストの次のポストを取得(FetchLatestPost.padx)
- DOMセレクタで固定ポストを探し、それをスキップ
- 次に現れるポスト要素を抽出
変数:PostText, PostURL
出力:対象ポストの本文とURL
🔍 STEP6:自分のリプライがあるかチェック(CheckIfAlreadyReplied.padx)
- 方法1:ポスト画面内のリプ欄に自分の名前があるか
- 方法2:reply_log.csvを開いて該当URLとアカウントが一致していればスキップ
出力:IsAlreadyReplied(Boolean)
❌ STEP7:リプ済みならスキップ
条件分岐(If)
条件:%IsAlreadyReplied% = True
→ 次のアカウントへ
🤖 STEP8:リプライ生成(GenerateReply.padx)
変数操作:
prompt.txt読み込み{{POST_TEXT}}を%PostText%に置換
Web操作:
- Custom ChatGPTにアクセス
- テキストエリアに貼り付け+送信(Enterキー)
- 応答を取得 →
ReplyText
📨 STEP9:リプライ投稿(PostReply.padx)
- 対象ポストの「返信する」ボタンをクリック
ReplyTextを入力- 送信ボタン押下
🧾 STEP10:ログ出力(WriteLog.padx)
日時:%Now%
アカウント:%CurrentAccount["ユーザー名"]%
ポストURL:%PostURL%
結果:"投稿済"
⚠️ エラーハンドリング戦略
| 想定エラー | 対応方法 |
|---|---|
| DOMが見つからない | セレクタ失敗時はTry-Catch+ログ記録 |
| 2FA要求された | 表示メッセージで中断し、手動入力を促す |
| GPT応答がない | リトライ 最大2回まで |
| 投稿失敗 | ログに「投稿失敗」と記録し次アカウントへ |
📋 テストとデバッグ手順
accounts.csvに1アカウントだけ設定prompt.txtに簡単なテストプロンプト記載- 実行してリプ投稿まで確認
reply_log.csvに記録されたか確認IsAlreadyRepliedチェックが動作してるか確認
📚 よくある質問(FAQ)
❓ Q1. APIを使ってないのはなぜ?
A. XのAPI制限が厳しく、RPAによるブラウザ操作の方が安定・再現性が高いためです。
❓ Q2. ChatGPTのプロンプトを切り替えたい場合は?
A. prompt.txtを編集するだけで、リプ生成のトーンやスタイルを自由に変えられます。
❓ Q3. アカウントを増やしたいときは?
A. accounts.csvに行を追加するだけでOK。PADフローの編集は不要です。
❓ Q4. 投稿に画像がある場合は?
A. 現在は「テキストのみ対応」です。画像の解析は含まれていません。
❓ Q5. UIが変わって動かなくなったら?
A. セレクタの再設定または画像認識の代替で対応可能です。更新されたXの構造を確認してください。
