mcpField
R
reddit-cultivate

reddit-cultivate

github.com/phy041マーケティング・グロース4749 回インストール17 週間前に更新
リポジトリ

reddit-cultivate について

reddit-cultivateは、AppleScriptでログイン済みのChromeを操作し、Redditでの活動を支援するスキルです。アカウント確認から投稿選定、コメント作成・投稿、リンク付き記録まで扱います。

主な機能

  1. 01AppleScriptによるChrome操作
  2. 02Redditアカウント状態の確認
  3. 03上昇中の投稿の検索
  4. 04コメントの作成と投稿
  5. 05投稿コメントのリンク記録

活用シーン

  1. 01Redditのログイン状態とkarmaの確認
  2. 02対象サブレディットの初期段階の議論探し
  3. 03セッション上限内でのコメント投稿

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/phy041/claude-skill-reddit --skill reddit-cultivate

インストール後、Claude Code で/reddit-cultivateを入力して読み込まれたか確認します。

詳細

Reddit 育成スキル(AppleScript による Chrome 制御)

AppleScript を使ってユーザーの実際の Chrome ブラウザーを制御し、Reddit での存在感を築き、維持します。Playwright、Selenium、API トークンは使用しません。


仕組み

Claude Code → osascript → Chrome (real browser, logged in) → Reddit
  • AppleScript で Chrome のアクティブなタブ内の JavaScript を実行します
  • Chrome ではすでに Reddit にログイン済みのため、Cookie が自動的に送信されます
  • 同一オリジンの fetch を使うため、CORS も検出も IP ブロックもありません
  • Reddit からは人間が閲覧している場合と区別できません

前提条件

  • macOS のみ(AppleScript は macOS のテクノロジーです)
  • Chrome:「表示」→「デベロッパー」→「Apple イベントからの JavaScript を許可」 ✓(有効にした後、Chrome を再起動してください)
  • ユーザーが Chrome で Reddit にログインしていること

メソッドの検出(最初に実行)

Chrome のマルチプロファイル環境では、AppleScript からウィンドウが見えない場合があります。必ず最初に検出してください。

WINDOWS=$(osascript -e 'tell application "Google Chrome" to return count of windows' 2>/dev/null)
if [ "$WINDOWS" = "0" ] || [ -z "$WINDOWS" ]; then
    echo "Use Method 2 (System Events + Console)"
else
    echo "Use Method 1 (execute javascript)"
fi

方法 1:AppleScript で JavaScript を実行(推奨)

count of windows > 0 の場合に動作します。

移動
osascript -e 'tell application "Google Chrome" to tell active tab of first window to set URL to "https://www.reddit.com/r/SideProject/rising/"'
JS を実行して結果を読み取る(document.title を利用)
# Run JS that writes result to document.title
osascript -e 'tell application "Google Chrome" to tell active tab of first window to execute javascript "fetch(\"/api/me.json\",{credentials:\"include\"}).then(r=>r.json()).then(d=>{document.title=\"R:\"+JSON.stringify({name:d.data.name,karma:d.data.total_karma})})"'

# Wait, then read title
sleep 2
osascript -e 'tell application "Google Chrome" to return title of active tab of first window'
複雑な JS には JXA を使用(エスケープの苦労を回避)
osascript -l JavaScript -e '
var chrome = Application("Google Chrome");
var tab = chrome.windows[0].activeTab;
tab.execute({javascript: "(" + function() {
    // Complex JS here — no escaping needed
    fetch("/r/SideProject/rising.json?limit=10", {credentials: "include"})
        .then(r => r.json())
        .then(d => {
            var posts = d.data.children.map(p => ({
                title: p.data.title.substring(0, 60),
                score: p.data.score,
                comments: p.data.num_comments,
                id: p.data.name,
                url: "https://reddit.com" + p.data.permalink
            }));
            document.title = "POSTS:" + JSON.stringify(posts);
        });
} + ")();"});
'

方法 2:System Events とコンソール(マルチプロファイル時の代替手段)

AppleScript から Chrome のウィンドウが見えない場合(マルチプロファイルの不具合)は、キーボード操作を使用します。

ステップ 1:JS をクリップボードにコピー
python3 -c "
import subprocess
js = '''(async()=>{
    let resp = await fetch('/api/me.json', {credentials: 'include'});
    let data = await resp.json();
    document.title = 'R:' + JSON.stringify({name: data.data.name, karma: data.data.total_karma});
})()'''
subprocess.run(['pbcopy'], input=js.encode(), check=True)
"
ステップ 2:Chrome のコンソールでキーボードショートカットを使って実行
osascript -e '
tell application "System Events"
    tell process "Google Chrome"
        set frontmost to true
        delay 0.3
        -- Cmd+Option+J = open/close Console
        key code 38 using {command down, option down}
        delay 1
        -- Select all + Paste + Enter
        keystroke "a" using {command down}
        delay 0.2
        keystroke "v" using {command down}
        delay 0.5
        key code 36
        delay 0.3
        -- Close Console
        key code 38 using {command down, option down}
    end tell
end tell'
ステップ 3:System Events でタイトルを読み取る
sleep 3
osascript -e '
tell application "System Events"
    tell process "Google Chrome"
        return name of window 1
    end tell
end tell'

ワークフロー

ステップ 1:アカウントの状態を確認

/api/me.json を使ってユーザー名とカルマを取得し、ログイン状態を確認します。

ステップ 2:上昇中の投稿をスキャン

対象の各 subreddit で、上昇中の投稿を取得します。

/r/{subreddit}/rising.json?limit=10

次のような投稿を探します。

  • コメントが 15 件未満の上昇中の投稿(早い段階ほど注目されやすい)
  • スコアが 2 を超える投稿(ある程度の反応がある)
  • 回答できる質問、または真に有益な見解を述べられる議論
ステップ 3:コメントを作成

ルール:

  • 2~4 文で、自然な口調にする
  • 真に価値のある内容を加える(見解、経験、役立つ情報)
  • 自己宣伝、リンク、絵文字は含めない
  • subreddit の文化に合わせる
  • コメントはそれぞれ独自の内容にする
ステップ 4:すべてのコメントを投稿

modhash を取得してから、投稿の間隔を 4 秒空けて各コメントを投稿します。

// Get modhash first
let me = await fetch("/api/me.json", {credentials: "include"}).then(r=>r.json());
let uh = me.data.modhash;

// Post comment
let body = new URLSearchParams({
    thing_id: "t3_xxxxx",  // post fullname
    text: "Your comment here",
    uh: uh,
    api_type: "json"
});
let resp = await fetch("/api/comment", {
    method: "POST",
    credentials: "include",
    headers: {"Content-Type": "application/x-www-form-urlencoded"},
    body: body.toString()
});
let result = await resp.json();
document.title = "POSTED:" + JSON.stringify(result);

応答 HTML からコメント ID を抽出します。結果内の id-t1_XXXXXXX を探してください。

ステップ 5:リンク付きのセッション概要

必ず最後に、投稿したすべてのコメントへの直接リンクを含む概要テーブルを記載してください。

コメントリンクの形式は次のとおりです。

https://www.reddit.com/r/{subreddit}/comments/{post_id}/comment/{comment_id}/

各要素は次のとおりです。

  • {subreddit} = subreddit 名
  • {post_id} = 投稿 ID(thing_id から t3_ の接頭辞を除いたもの)
  • {comment_id} = POST 応答から抽出した値(t1_XXXXXXX から t1_ の接頭辞を除いたもの)

概要テーブルの例:

#サブ投稿コメントリンク
1r/SideProject「投稿タイトル」https://www.reddit.com/r/SideProject/comments/abc123/comment/xyz789/
2r/ClaudeAI「投稿タイトル」https://www.reddit.com/r/ClaudeAI/comments/def456/comment/uvw012/

これにより、ユーザーはブックマークを作成し、返信に対応し、どのコメントが反応を得たかを追跡できます。


推奨する対象 subreddit

優先度Subreddit理由
高r/SideProjectプロジェクトのローンチに適しており、とても歓迎されます
高r/indiehackers収益や成長についての議論があります
中r/ClaudeAIAI ツールに関心のあるユーザー層
中r/coolgithubprojectsオープンソースの認知度向上
中r/startupsスタートアップについての議論
中r/entrepreneurビジネスに関する見解
中r/opensource技術に関心のあるユーザー層

コメントのガイドライン

  • 真に価値のある内容を加える(見解、経験、役立つ情報)
  • コメントで自己宣伝をしない
  • subreddit の口調に合わせる
  • 一般論ではなく、具体的に述べる
  • 2~4 文で、自然な口調にする

レート制限

操作制限
API 呼び出しの間隔2 秒以上
投稿の間隔4 秒以上
1 セッションあたりコメントは最大 5 件
1 日あたりコメントは最大 10~15 件

カルマのマイルストーン

カルマ解除される内容
100+ほとんどのサブレディットに投稿できる
500+スパムフィルターに引っかかる頻度が減る
1000+信頼された投稿者として認められる
5000+コミュニティで認知される

アルゴリズムに関する知見

  • 最初の30分で、投稿が「人気」ページに表示されるかどうかが決まります
  • 初期の賛成票は、後からの賛成票より10倍重く評価されます
  • 初期のコメント2件は、受動的な賛成票20件を上回ります
  • 最適な投稿時間:日曜日の午前6~8時(ET)
  • 賛成票の割合が重要です:100↑/10↓(90%)は150↑/50↓(75%)を上回ります

トラブルシューティング

問題解決方法
count of windows = 0Chrome のマルチプロフィールのバグ → 方法2を使用
「Allow JavaScript」が機能しない有効にした後、Chrome を再起動する
Modhash の有効期限切れ/api/me.json から再取得する
403 レスポンスレート制限されています。5分以上待ってください
コメントが表示されないシャドウバンを確認する:シークレットモードでプロフィールを開く

Playwright/Selenium ではなく AppleScript を使う理由

ツール問題
Playwrightnavigator.webdriver=true を設定するため、すぐに検出されます
Selenium同じ検出の問題があります
Puppeteer同じ検出の問題があります
curl + API数回のリクエスト後に Reddit に IP をブロックされます
AppleScript実際の Chrome を操作するため検出されず、Cookie も含まれます

コメント