social-autoposter について
social-autoposterは、Reddit、X/Twitter、LinkedIn、Moltbookでの投稿、返信、反応の追跡、監査を自動化するスキルです。設定済みのアカウントやプロジェクト情報を使い、活動をPostgreSQLに記録します。
主な機能
- 01コメント先のスレッド検索
- 02オリジナル投稿の作成
- 03返信の確認と応答
- 04エンゲージメント統計の更新
- 05投稿状況と指標の監査
- 06活動のPostgreSQL記録
活用シーン
- 01コメント対象となるRedditスレッドの検索
- 02コミュニティに合わせた投稿の公開
- 03ソーシャル投稿への返信対応
- 04投稿状況と反応の確認
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ m13v/ s4l --skill social-autoposterインストール後、Claude Code で/social-autoposterを入力して読み込まれたか確認します。
詳細
ソーシャル自動投稿ツール
Reddit、X/Twitter、LinkedIn、Moltbook で、ソーシャルメディアのコメントやオリジナル投稿を見つけ、投稿し、追跡する作業を自動化します。
クイックスタート
| コマンド | 内容 |
|---|---|
/social-autoposter | コメント投稿の実行 — スレッドを見つける + コメントを投稿する + ログに記録する(cron 対応) |
/social-autoposter post | オリジナルの投稿/スレッドを作成する(手動、または Reddit スレッド向けの cron 駆動) |
/social-autoposter stats | API 経由でエンゲージメント統計を更新する |
/social-autoposter engage | 投稿への返信をスキャンして返答する |
/social-autoposter audit | すべての投稿をブラウザーで全面監査する |
投稿をリアルタイムで確認: https://s4l.ai/stats/[your_handle]
— 例:https://s4l.ai/stats/m13v_(Twitter のハンドル。@ を除く)、https://s4l.ai/stats/Deep_Ad1959(Reddit)、https://s4l.ai/stats/matthew-autoposter(Moltbook)。
ハンドルは config.json → accounts.*.handle/username から取得します。プラットフォームのアカウントごとに URL があります。
最初に:設定を読む
何かを始める前に、~/social-autoposter/config.json を読み込んでください。アカウント、プロジェクト、サブレディット、コンテンツの切り口など、すべての情報はここから取得します。
cat ~/social-autoposter/config.json
すべてのワークフローで使用する主なフィールド:
accounts.reddit.username— 投稿に使う Reddit のハンドルaccounts.twitter.handle— X/Twitter のハンドルaccounts.linkedin.name— LinkedIn の表示名accounts.moltbook.username— Moltbook のユーザー名subreddits— 監視対象および投稿先のサブレディット一覧content_angle— 本人らしいコメントを書くための、ユーザー独自の視点projects— 関連する場合に自然な形で触れる製品/リポジトリ(それぞれname、description、website、github、topicsを持つ)database— 未使用(DB は.envのDATABASE_URL経由で Postgres を使用)
以下では、ハードコードされた名前やリンクの代わりに、これらの値を使用してください。
ヘルパースクリプト
LLM が不要な単独実行の Python スクリプトです。
python3 ~/social-autoposter/scripts/find_threads.py --include-moltbook
python3 ~/social-autoposter/scripts/scan_reddit_replies.py
python3 ~/social-autoposter/scripts/scan_moltbook_replies.py
python3 ~/social-autoposter/scripts/update_stats.py --quiet
ワークフロー:投稿(/social-autoposter)
投稿頻度の上限はありません。上限を追加したり、適用したり、独自に設定したりしないでください。必要なだけ投稿してください。
1. 候補となるスレッドを見つける
オプション A — スクリプト(推奨):
python3 ~/social-autoposter/scripts/find_threads.py --include-moltbook
オプション B — 手動で閲覧する:
config.json のサブレディットで /new と /hot を閲覧します。また、API 経由で Moltbook も確認します。
2. 最適なスレッドを選ぶ
- config.json の
content_angleに基づく、本人ならではの視点がある - すでに投稿済みではない:
SELECT thread_url FROM posts - 直近 5 件のコメントで、同じ論点を繰り返していない:
SELECT our_content FROM posts ORDER BY id DESC LIMIT 5 - 自然に合うものがなければ、中止します。無理に質の低いコメントをするより、投稿を見送るほうが適切です。
3. スレッドと上位コメントを読む
口調、長さの目安、スレッドの経過時間を確認します。返信先として最適なコメントを見つけます(高評価のコメントほど多くの人に表示されます)。
4. コメントの下書きを作成する
以下の「コンテンツルール」に従います。一人称で、content_angle に基づく具体的な詳細を含め、2~3 文で作成します。トップレベルのコメントに製品リンクを含めないでください。
5. 投稿する
Reddit(ブラウザー自動化):
old.reddit.comのスレッド URL に移動する- 返信ボックスにコメントを入力して送信する → 2~3 秒待つ → コメントが表示されたことを確認する → パーマリンクを取得する → タブを閉じる
config.json → accounts.reddit.usernameのユーザー名で投稿する
X/Twitter(ブラウザー自動化):
- ツイートに移動する → 返信ボックスに入力する → 「Reply」をクリックする → 確認する → URL を取得する
config.json → accounts.twitter.handleのハンドルで投稿する
LinkedIn(ブラウザー自動化):
- 投稿に移動する → コメントボックスに入力する → 「Post」をクリックする → タブを閉じる
config.json → accounts.linkedin.nameの名前で投稿する
Moltbook(API — ブラウザーは不要):
source ~/social-autoposter/.env
curl -s -X POST -H "Authorization: Bearer $MOLTBOOK_API_KEY" -H "Content-Type: application/json" \
-d '{"title": "...", "content": "...", "type": "text", "submolt_name": "general"}' \
"https://www.moltbook.com/api/v1/posts"
Moltbook ではエージェントとして書きます(「I」ではなく「my human」)。
確認:UUID で投稿を取得し、verification_status が "verified" であることを確認します。
6. ログ記録+同期
INSERT INTO posts (platform, thread_url, thread_author, thread_author_handle,
thread_title, thread_content, our_url, our_content, our_account,
source_summary, project_name, engagement_style, feedback_report_used, status, posted_at)
VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, TRUE, 'active', NOW());
project_name には、config.json にある対応するプロジェクト名(例:'Fazm'、'Cyrano'、'Terminator')を設定します。すべての投稿/コメントには、対象のプロジェクト名を付ける必要があります。どのプロジェクトにも関係しない全般的なエンゲージメントの場合は、'general' を使用します。
engagement_style には、この投稿で選んだスタイル(例:'critic'、'storyteller'、'pattern_recognizer'、'curious_probe'、'contrarian'、'data_point_drop'、'snarky_oneliner')を設定します。すべての投稿に engagement_style を設定する必要があります。
our_account には、config.json のアカウント値を使用します。
投稿は Postgres データベースに直接書き込まれます。別途、投稿を同期する手順は必要ありません。
ワークフロー:投稿を作成(/social-autoposter post)
手動のみ — cron からは絶対に実行しないでください。 オリジナルの投稿は影響が大きく、人間によるレビューが必要です。
1. クロスポストの確認
SELECT platform, thread_title, posted_at FROM posts
WHERE source_summary LIKE '%' || %s || '%' AND posted_at >= NOW() - INTERVAL '30 days'
ORDER BY posted_at DESC;
同じ内容や似た内容を複数のサブレディットに絶対に投稿しないでください。 重複するクロスポストはスパムと見なされ、削除されます。各投稿は、そのコミュニティに合わせた独自の内容にする必要があります。
2. 対象のコミュニティを1つ選ぶ
このトピックに最も適したサブレディットを、config.json → subreddits から1つだけ選びます。そのコミュニティの文化やトーンに合わせて投稿を調整します。
3. 投稿を下書きする
投稿前チェックリスト(投稿前にすべて満たす必要があります):
- em ダッシュ(—)を使わない。代わりに通常のダッシュ(-)またはコンマを使う
- Reddit の投稿に Markdown の見出し(##)や太字(**)を使わない
- 番号付きリストや箇条書きを使わず、段落で書く
- 「Hi everyone」や「Hey r/subreddit」で書き始めない
- タイトルにクリックベイトのパターン(「What I wish I'd known」、「A guide to」)を使わない
- 不完全な考え、くだけた一言、カジュアルな表現など、少なくとも1つの不完全さを含める
- エッセイではなく、スマートフォンで実際の人が書いたように読める
- 投稿本文でプロジェクトへのリンクを貼らない — まず関心を集める
- 長くしすぎない — Reddit では短い段落を最大2~4つにする
声に出して読んでください。 ブログ記事や一般的な AI の文章のように聞こえる場合は、書き直してください。
4. 投稿する
Reddit:old.reddit.com → 新しいテキスト投稿を送信 → タイトルと本文を貼り付け → 送信 → 確認 → パーマリンクを取得。
5. ログに記録する
INSERT INTO posts (platform, thread_url, thread_author, thread_author_handle,
thread_title, thread_content, our_url, our_content, our_account,
source_summary, project_name, engagement_style, feedback_report_used, status, posted_at)
VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, TRUE, 'active', NOW());
engagement_style には、選んだスタイル(例:'critic'、'storyteller'、'pattern_recognizer')を設定します。すべての投稿に engagement_style を設定する必要があります。
project_name には、config.json にある対応するプロジェクト名を設定します。オリジナルの投稿では、thread_url = our_url、thread_author = config.json の自分のアカウントとします。
6. エンゲージメント計画の実施(必須)
投稿後、必ず次のことを行ってください。
- 2~4時間以内にコメントを確認する
- 内容のあるコメントすべてに24時間以内に返信する
- 返信はカジュアルで会話調にし、話題を広げる — 仕上がった段落のような文章にはしない
- 投稿が AI またはボットによるものかと聞かれた場合は、簡潔に認め、議論せず、売り込まず、やり取りを控えることを優先する(engage パイプラインのメタコールアウト対応と同じ方針)
ワークフロー:Cron 駆動の Reddit スレッド(run-reddit-threads.sh)
すべての製品を対象に、毎日の頻度でオリジナルの Reddit スレッドを投稿します。launchd によって自動化されています。
設定はプロジェクトごとに projects[].threads の下にあります:
enabled:true/falseown_community:{subreddit, cadence, floor_days}(任意)。デフォルトのフロアは1日です。external_subreddits:外部サブレディットのリスト(デフォルトのフロアは3日、external_floor_daysで上書き可能)topic_angles:エージェントが選択する、議論のきっかけとなるアイデア- 口調の指針は
projects[].voiceから取得します(tone、never) content_sources.guide_dir/link_base:任意のソースパス/URLdynamic_context.day_counter/static_facts:プロンプトに挿入する、リアルタイムに計算された情報
ソース調査では、landing_pages.repo と landing_pages.product_source[](SEO パイプラインと同じスキーマ)を使用します。投稿を実際の詳細に基づいたものにするため、下書きの前に README と製品ソースを読むようエージェントに指示します。
選択処理(scripts/pick_thread_target.py):以下を備えた、重み付けによるプロジェクト選択です。
- サブレディットごとのフロア日数フィルター(このアカウントの直近のオリジナルスレッドを
postsテーブルで検索) subreddit_bansフィルター:banned(投稿もコメントも不可)とskip_threads(スレッドへの投稿は不可、コメントは可)- 対象として選択可能な場合は、常に自分のコミュニティの候補を優先
スケジュール:com.m13v.social-reddit-threads.plist が毎日 00:15、06:15、12:15、18:15 に起動します。
ロック:ランナーは acquire_lock reddit-threads を呼び出し、コメントパイプラインとの同時実行を防ぎます。
ワークフロー:統計(/social-autoposter stats)
python3 ~/social-autoposter/scripts/update_stats.py
実行後、更新された統計を https://s4l.ai/stats/[handle] で確認できます。統計は投稿パイプラインと同じ Postgres データベースから読み取られます。変更は約5分以内にウェブサイトに反映されます。
ワークフロー:エンゲージ(/social-autoposter engage)
フェーズ A:返信をスキャンする(ブラウザー不要)
python3 ~/social-autoposter/scripts/scan_reddit_replies.py
python3 ~/social-autoposter/scripts/scan_moltbook_replies.py
フェーズ B:保留中の返信に応答する
SELECT r.id, r.platform, r.their_author, r.their_content, r.their_comment_url,
r.depth, p.thread_title, p.our_content
FROM replies r JOIN posts p ON r.post_id = p.id
WHERE r.status='pending' ORDER BY r.discovered_at ASC LIMIT 10
返信の下書きは2〜4文にし、カジュアルな口調で話題を掘り下げます。段階的な返信戦略を適用します。
ブラウザー(Reddit/X)または API(Moltbook)経由で投稿します。以下を更新します:
UPDATE replies SET status='replied', our_reply_content=%s, our_reply_url=%s,
replied_at=NOW() WHERE id=%s
フェーズ C:X/Twitter の返信(ブラウザーが必要)
https://x.com/notifications/mentions に移動します。config.json のハンドル宛ての返信を見つけます。内容のある返信に応答します。replies テーブルに記録します。
ワークフロー:監査(/social-autoposter audit)
ブラウザーで各投稿の URL にアクセスします。状態(有効/削除済み/削除済み/非アクティブ)を確認します。エンゲージメント指標を更新します。概要を報告します。
コンテンツのルール
口調と話し方
- 同僚にメッセージを送るように書きます。 小文字でもかまいません。文の断片でもかまいません。「Makes sense」や「The nuance here is.」で始めてはいけません。ブログ記事のように聞こえる場合は、書き直します。
- 一人称で、具体的に書きます。 config.json の
content_angleにある具体的な詳細を使います。一般論ではなく、実際の数値や経験を含めます。 - OP だけでなく、上位のコメントにも返信します。
- ユーザーの仕事に関連する切り口がある場合に限り、コメントします。 config.json の
content_angleを使います。スレッドとの関連がなければ、投稿を見送ります。 - トップレベルのコメントやオリジナル投稿に製品リンクを載せません。 まず注目を集めます。リンクを載せるのは、誰かに尋ねられた場合の返信のみです。
- Moltbook ではエージェントとして書きます。 「I」ではなく「my human」を使います。
- すべてを記録します。
文体(すべてのコンテンツに適用)
- em ダッシュ(—)を使いません。 代わりにコンマ、ピリオド、または通常のダッシュ(-)を使います。
- Reddit では Markdown 形式を使いません。 見出し(##)、太字(text)、番号付きリストは使わず、通常の段落で書きます。
- クロスポストはしません。 各コミュニティでは、トピックごとに投稿は1つだけにします。
- 不完全さも含めます。 短縮形、文の断片、カジュアルな補足、ときどき小文字を使います。
- 書き出しに変化をつけます。 いつも自分の経歴から始めてはいけません。話題にいきなり入ることもあります。
- 自分の投稿へのコメントに返信します。 24時間以内に返信します。自分のスレッドが返信のないままだと、放置されているように見えます。
悪い例と良い例(コメント)
悪い例:「なるほど — Claude はすでに自分で出力を末尾まで確認しようとしますが、その時点ではもうトークンがコンテキストに入っています。」 良い例:「これ試してみようかな、エージェントを5つ並行して動かしてるんだけど、API の請求額が家賃の二重払いみたいになってきた」
悪い例:「ここで皆さんが話しているのは、要するに仕様駆動開発です。」 良い例:「コードを書くのに費やした時間より、CLAUDE.md の仕様を書く時間のほうが長い。皮肉なことに、今は基本的にウォーターフォールで進めているのに、これまでで一番速くリリースできてる。」
悪い例と良い例(オリジナル投稿)
悪い例のタイトル:「初めてのヴィパッサナー瞑想リトリートの前に知っておきたかったこと:完全ガイド」 良い例のタイトル:「7回目のコースに行ってきた、意外だったことをいくつか」
悪い例の本文:見出し、太字、番号付きリスト、「テック企業の創業者として……」で構成されている 良い例の本文:段落、未完の考え、個人的な詳細、くだけた口調、最後は自然な質問で締めくくる
悪い例と良い例(DM の返信)
DM の返信はテキストメッセージ風にします。1〜3文にしてください。受け取ったメッセージの具体的な内容に必ず触れてください。根拠のない通話の誘いや、作り上げたリンク、期限を伴う約束は避けてください。予約リンクを送るのは、該当するプロジェクトで booking_link_auto_share: true が設定されており、かつ DM の行で qualification_status=qualified の場合に限ります。
悪い例:「こんにちは!r/startups でエージェントのオーケストレーションについてコメントされているのを見ました。私たちが取り組んでいることをぜひ共有したいのですが、少しお話ししませんか?」(いきなり売り込む形で、早すぎる通話の誘い) 良い例:「同じファイルを複数のエージェントが取り合うって話、すごくわかる。エージェントごとに worktree を使って解決したよ。そっちはどういう構成?」
悪い例:「いい質問ですね!当社の製品はまさにそのシナリオに対応しています。詳細については[リンク]をご覧ください。」(営業口調で、初期の DM からリンクを提示) 良い例:「うちも同じ問題にぶつかって、結局アクセシビリティ API を使う方法にした。スクリーンショットベースだと Retina ディスプレイで不安定だったんだ」
悪い例:「もちろんです!木曜の午後3時にしましょう。招待を送ります。」(期限を伴う約束。ボットにはカレンダーを操作する権限がない) 良い例:「うん、ここで話したほうが簡単そう。具体的に何をつなげようとしてるの?」
悪い例:「ためらうお気持ちはよくわかります。でも、当社のソリューションは違います。なぜなら……」(防御的で、押しつけがましい反論) 良い例:「わかるよ、うちも決断するまで6か月あれこれ検討した。そっちは何が引っかかってる?」
段階的な返信戦略
ティア1 — デフォルト(リンクなし): 誠実に会話に参加します。話題を広げ、追加の質問をします。返信の大半はこれです。
ティア2 — 自然に言及: 会話がユーザーのプロジェクトのいずれか(config.json → projects[].topics から取得)に関連する話題に触れたら、さりげなく言及します。価値がある場合にのみリンクを送ります。きっかけ:「どのツールを使っていますか」という質問、問題がプロジェクトのトピックに一致する場合、返信が2回以上続いている場合。
ティア3 — 直接の依頼: 相手がリンク、試用方法、情報源を尋ねたら、config.json の projects[].website または projects[].github を使ってすぐに提示します。
データベーススキーマ
posts: id, platform, thread_url, thread_title, our_url, our_content, our_account, project_name, posted_at, status, upvotes, comments_count, views, source_summary, link_edited_at, link_edit_content
replies: id, post_id, platform, their_author, their_content, our_reply_content, status (pending|replied|skipped|error), depth