reddit-cultivate について
reddit-cultivateは、AppleScriptでログイン済みのChromeを操作し、Redditでの活動を支援するスキルです。アカウント確認から投稿選定、コメント作成・投稿、リンク付き記録まで扱います。
主な機能
- 01AppleScriptによるChrome操作
- 02Redditアカウント状態の確認
- 03上昇中の投稿の検索
- 04コメントの作成と投稿
- 05投稿コメントのリンク記録
活用シーン
- 01Redditのログイン状態とkarmaの確認
- 02対象サブレディットの初期段階の議論探し
- 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_の接頭辞を除いたもの)
概要テーブルの例:
| # | サブ | 投稿 | コメントリンク |
|---|---|---|---|
| 1 | r/SideProject | 「投稿タイトル」 | https://www.reddit.com/r/SideProject/comments/abc123/comment/xyz789/ |
| 2 | r/ClaudeAI | 「投稿タイトル」 | https://www.reddit.com/r/ClaudeAI/comments/def456/comment/uvw012/ |
これにより、ユーザーはブックマークを作成し、返信に対応し、どのコメントが反応を得たかを追跡できます。
推奨する対象 subreddit
| 優先度 | Subreddit | 理由 |
|---|---|---|
| 高 | r/SideProject | プロジェクトのローンチに適しており、とても歓迎されます |
| 高 | r/indiehackers | 収益や成長についての議論があります |
| 中 | r/ClaudeAI | AI ツールに関心のあるユーザー層 |
| 中 | 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 = 0 | Chrome のマルチプロフィールのバグ → 方法2を使用 |
| 「Allow JavaScript」が機能しない | 有効にした後、Chrome を再起動する |
| Modhash の有効期限切れ | /api/me.json から再取得する |
| 403 レスポンス | レート制限されています。5分以上待ってください |
| コメントが表示されない | シャドウバンを確認する:シークレットモードでプロフィールを開く |
Playwright/Selenium ではなく AppleScript を使う理由
| ツール | 問題 |
|---|---|
| Playwright | navigator.webdriver=true を設定するため、すぐに検出されます |
| Selenium | 同じ検出の問題があります |
| Puppeteer | 同じ検出の問題があります |
| curl + API | 数回のリクエスト後に Reddit に IP をブロックされます |
| AppleScript | 実際の Chrome を操作するため検出されず、Cookie も含まれます |