wjs-cleaning-spam について
wjs-cleaning-spamは、王建硕のX投稿につく地域誘導スパム返信を、返信の非表示とアカウントのミュートで処理するスキルです。事前確認、人による境界ケースの確認、適用を分け、処理状態も記録します。
主な機能
- 01分類リストを出すドライラン
- 02境界ケースの人による確認
- 03返信の非表示とアカウントのミュート
- 04再実行用の処理状態記録
活用シーン
- 01投稿下の地域誘導返信の整理
- 02誤判定の可能性がある短文の確認
- 03失敗内容の確認と再実行
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ jianshuo/ claude-skills --skill wjs-cleaning-spamインストール後、Claude Code で/wjs-cleaning-spamを入力して読み込まれたか確認します。
同梱ファイルscripts/clean_spam.py
詳細
wjs-cleaning-spam
王建硕の投稿についた、同じ地域への誘導を目的とするスパム返信を整理します:返信を非表示にし、アカウントをミュートします。
基本方針
他人の投稿は削除できません。 X がスレッドの投稿者に提供している手段は 2 つだけです。返信の非表示(コメント欄から削除し、訪問者から見えなくする)とミュート(通知に表示されなくする)です。X はブロックのエンドポイントを API から削除しています(v2 は code 34 を返し、v1.1 はさらに高いアクセスレベルが必要です)。ブロックするにはウェブから手動で操作するしかありません。「スパムを削除する」とは、非表示 + ミュートのことであり、API でできる範囲の上限です。
まず dry-run を実行し、判定が微妙なものは人が確認してから apply します。 ヒューリスティックでは、人間のコメント(「机器人🤖」、「저지능🤪」)とスパムの亜種(「我在济源呀🌷」+ 不可視文字)を誤って分類することがあります。flagged はそのまま処理し、borderline は必ず Claude が 1 件ずつ確認します。
ワークフロー
# 1. dry-run:输出 flagged + borderline 两个名单(JSON)
python3 ~/.claude/skills/wjs-cleaning-spam/scripts/clean_spam.py
# 2. Claude 逐条审 borderline:引流号特征 = 名字带 💕🌸♥ 装饰 / 同城话术 /
# 文本夹隐形字符(U+034F 等)/ 纯 emoji。真人评论(哪怕是骂人)不动。
# 把 borderline 里确认是 spam 的 id 并入名单。
# 3. apply:隐藏 + 静音(默认只处理 flagged;审完 borderline 用 --ids 指定全集)
python3 ~/.claude/skills/wjs-cleaning-spam/scripts/clean_spam.py --apply
python3 ~/.claude/skills/wjs-cleaning-spam/scripts/clean_spam.py --apply --ids id1,id2,...
# 4. 撞 429 限流(hide 约 50 次/15 分钟)脚本会自动停 —— 15 分钟后重跑同一条命令,
# state/cleaned.jsonl 记录了已处理的 id,自动跳过、续跑。
ユーザーには、非表示にした件数、失敗した件数(および理由)、ミュートしたアカウント数を報告します。ブロックにはウェブでの手動操作が必要であることも伝えます。
実際に遭遇した問題(2026-06-10)
| 問題 | 実際の状況 |
|---|---|
| raw クエリが 401 Unauthorized | クエリパラメーター内の : は URL エンコードする必要があります(to%3Ajianshuo)。認証の問題ではないため、oauth1/oauth2 を切り替えないでください |
xurl block が code 34 を返す | block エンドポイントは X API から削除されています(v2/v1.1 のどちらも不可)。代わりに mute を使い、何度も試さないでください |
| hide が "Invalid Request" を返す | その返信がある会話のルート投稿はユーザーのものではありません(ユーザーは他人のスレッドに参加しているだけです)。スレッドの投稿者だけが非表示にできます。hide-failed として記録し、アカウントはミュートしてください |
| hide が 429 を返す | レート制限は約 50 回/15 分です。制限がリセットされたらスクリプトを再実行してください(状態ファイルにより冪等性が保たれます) |
| テキストだけのスパムがすり抜ける | 「我在济源呀」のような同じ地域への誘導文句は、不可視文字(U+034F/ゼロ幅文字)を使ってフィルターを回避します。スクリプトでは検出に対応済みです。新しい亜種が出たら、特徴を NAME_KW / INVISIBLE に追加してください |
| 人間の返信を誤って処理する | 絵文字のヒューリスティックが人間の短いコメントを拾うことがあります。そのために borderline のリストがあるので、必ず人が確認してください |
使用しない場合
- スパムが 7 日を超えている場合:recent-search インターフェースで取得できるのは過去 7 日分のみです。それより古いものはウェブから手動で操作してください
- ユーザーが自分の投稿を削除したい場合:直接
xurl delete POST_IDを実行してください - ユーザーが特定のアカウントをブロックしたい場合:API では対応できないため、ウェブから操作するよう伝えてください(アカウントのプロフィール → ⋯ → Block)
状態
state/cleaned.jsonl — 処理した返信を 1 行ずつ記録します(id / author / status)。再実行時は処理済みのものをスキップします。最初からやり直すには、このファイルを削除してください。