reddit-post について
macOS上でユーザーがログイン済みのChromeをAppleScriptで操作し、Redditにテキスト投稿やリンク投稿を行うスキルです。投稿手順のほか、サブレディット選び、フレア設定、エラー対応も扱います。
主な機能
- 01テキスト投稿とリンク投稿
- 02AppleScriptによるChrome操作
- 03投稿URLの取得とフレア設定
- 04サブレディット選びと投稿時刻の案内
- 05スパム判定とエラーへの対処
活用シーン
- 01Redditでプロジェクトを告知
- 02関連サブレディットでツールを紹介
- 03投稿後に必須フレアを設定
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ phy041/ claude-skill-reddit --skill reddit-postインストール後、Claude Code で/reddit-postを入力して読み込まれたか確認します。
詳細
Reddit 投稿スキル(AppleScript による Chrome 操作)
AppleScript でユーザーが実際に使用している Chrome を操作して Reddit に投稿します。Playwright、Selenium、API トークンは使用しません。
仕組み
Claude Code → osascript → Chrome (real browser, logged in) → Reddit /api/submit
- Cookie を使った同一オリジンの fetch → 検出不能
- テキスト/リンク投稿には Reddit の
/api/submitエンドポイントを使用 - CSRF 保護には
/api/me.jsonから取得した Modhash を使用
前提条件
- macOS のみ(AppleScript は macOS のテクノロジーです)
- Chrome:表示 → デベロッパー → Apple Events からの JavaScript を許可(有効にした後、Chrome を再起動してください)
- Chrome で Reddit にログインしていること
方法の判定(最初に実行)
WINDOWS=$(osascript -e 'tell application "Google Chrome" to return count of windows' 2>/dev/null)
if [ "$WINDOWS" = "0" ] || [ -z "$WINDOWS" ]; then
echo "METHOD 2 (System Events + Console)"
else
echo "METHOD 1 (execute javascript)"
fi
方法 1 と方法 2 の詳細については、reddit-cultivate スキルを参照してください。
投稿ワークフロー
ステップ 1:Modhash を取得
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=\"UH:\"+d.data.modhash})"'
sleep 2
osascript -e 'tell application "Google Chrome" to return title of active tab of first window'
ステップ 2:投稿を送信
まず Chrome で reddit.com に移動し(同一オリジンが必要です)、その後送信します。
(async()=>{
try {
let body = new URLSearchParams({
sr: "SideProject", // subreddit name (no r/ prefix)
kind: "self", // "self" for text, "link" for URL
title: "Your post title",
text: "Your post body with **markdown** support",
uh: "MODHASH_HERE",
api_type: "json",
resubmit: "true"
});
let resp = await fetch("/api/submit", {
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);
} catch(e) {
document.title = "ERR:" + e.message;
}
})()
リンク投稿の場合は、次のように変更します。
kind: "link",
url: "https://github.com/your/repo", // instead of text
ステップ 3:投稿リンクを抽出
レスポンスには result.json.data.url が含まれます。これは新しい投稿への直接リンクです。
ステップ 4:フレアを追加(必要な場合)
フレアを必須とするサブレディットもあります。投稿後、次を使用します。
(async()=>{
try {
// First get available flairs
let resp = await fetch("/r/SUBREDDIT/api/link_flair_v2", {credentials: "include"});
let flairs = await resp.json();
document.title = "FLAIRS:" + JSON.stringify(flairs.map(f => ({id: f.id, text: f.text})));
} catch(e) {
document.title = "ERR:" + e.message;
}
})()
その後、フレアを適用します。
(async()=>{
try {
let body = new URLSearchParams({
link: "t3_POST_ID",
flair_template_id: "FLAIR_ID",
uh: "MODHASH"
});
await fetch("/api/selectflair", {
method: "POST",
credentials: "include",
headers: {"Content-Type": "application/x-www-form-urlencoded"},
body: body.toString()
});
document.title = "FLAIR_SET";
} catch(e) {
document.title = "ERR:" + e.message;
}
})()
ステップ 5:セッションの概要
必ず投稿リンクで締めくくってください。
| サブレディット | タイトル | 投稿リンク |
|---|---|---|
| r/SideProject | "Your title" | https://www.reddit.com/r/SideProject/comments/abc123/... |
スパムフィルターの回避
タイトル/本文で避ける単語
| 避ける語句 | 代わりに使う語句 |
|---|---|
| crawl、crawled、crawling | compiled、cataloged、indexed、collected |
| scrape、scraping | gathered、extracted、retrieved |
| bot、automated | tool、script、program |
| free(多用されている語句) | open source、MIT licensed |
| hack、hacks | tips、techniques、methods |
避けるべきコンテンツのトリガー
- 外部リンクを複数含める(最大 1~2 件)
- URL 短縮サービス(bit.ly、tinyurl)
- 新しいアカウントでの宣伝コンテンツ
- 短時間に複数のサブレディットへ同じコンテンツを投稿すること
- 過度な自己宣伝の表現
オープンソースプロジェクトにおすすめのサブレディット
| サブレディット | メンバー数 | おすすめの内容 | 備考 |
|---|---|---|---|
| r/coolgithubprojects | 60K | GitHub リポジトリ | まさにこのための場所です! |
| r/SideProject | 453K | 個人プロジェクト | とても歓迎されます |
| r/opensource | 100K+ | オープンソースツール | 技術者が多いコミュニティ |
| r/programming | 6M+ | 開発ツール | 競争が激しい |
| r/Python | 1.5M+ | Python ツール | 活発なコミュニティ |
| r/webdev | 2M+ | Web ツール | 「Showoff Saturday」のみ |
| r/selfhosted | 400K+ | セルフホスト可能なツール | 反応が良好 |
おすすめの投稿時間(米国東部時間)
| 曜日 | おすすめの時間 |
|---|---|
| 月曜日 | 6-8 AM |
| 火曜日 | 7-9 AM |
| 水曜日 | 8-10 AM |
| 木曜日 | 7-9 AM |
| 金曜日 | 6-8 AM |
| 土曜日 | 7-9 AM |
| 日曜日 | 8-10 AM |
勢いをつけるため、ピーク時間の 30 分前に投稿してください。
投稿テンプレート
オープンソースプロジェクトのお知らせ
Title: I built [PROJECT_NAME] - [one-line description] (open source)
Body:
Hey everyone,
I created [PROJECT_NAME] to solve [PROBLEM].
**What it does:**
- Feature 1
- Feature 2
- Feature 3
**Tech stack:** [Languages/frameworks]
**Links:**
- GitHub: [single link]
Happy to answer any questions!
ツール/リソースの紹介
Title: [TOOL_NAME]: [what it does] - free and open source
Body:
Built this because [reason/pain point].
**Features:**
- [List 3-5 key features]
**How to use:**
[Brief code example or instructions]
GitHub: [link]
Feedback welcome!
クロスポスト戦略
リーチを最大化するため、サブレディットへの投稿を時期をずらして行います。
- 1 日目:主要なサブレディット(最も関連性が高い場所)
- 2~3 日目:別のサブレディット(異なる読者層)
- 4~5 日目:一般的なサブレディット(r/SideProject など)
同じ日に複数のサブレディットへ投稿しないでください。スパム検出のトリガーになります。
エラーからの復旧
| 問題 | 解決策 |
|---|---|
| "Post removed by filters" | トリガーとなる語句を使わずに書き直し、リンクを減らします |
| "You're doing that too much" | 10~15 分待ちます。カルマがさらに必要です |
| "This community requires flair" | 投稿後に /api/selectflair を使用します |
| "Title too long" | 300 文字以内にします |
| 投稿が表示されない | シャドウバンされていないか、シークレットモードでプロフィールを確認します |
| Modhash の期限切れ | /api/me.json から再取得します |
AppleScript を使う理由(Playwright ではなく)
| ツール | 問題 |
|---|---|
| Playwright | navigator.webdriver=true が設定され、Reddit に検出されます |
| Selenium | 同じ検出上の問題があります |
| curl + API | 数回リクエストすると IP がブロックされます |
| AppleScript | 実際の Chrome を操作し、検出されず、Cookie も含まれます |
コメント
Markdown 対応