Use when the user complains about spam on his X/Twitter posts — 同城面付 / 寻固炮 / 线下上门 / 免费破处 这类引流号在他推文下刷的 emoji 垃圾回复 — and wants them removed. Covers the last 7 days (X recent-search window). Triggers — "把这些spam删掉", "清理X垃圾回复", "推文下面好多引流号", "clean spam replies", "/wjs-cleaning-spam".
npx skills add https://github.com/jianshuo/claude-skills --skill wjs-cleaning-spam
清理挂在王建硕推文下的同城引流 spam 回复:隐藏回复 + 静音账号。
别人的推文删不掉。 X 只给串主两个武器:hide reply(从评论区移除,访客不可见)和 mute(通知里不再出现)。block 端点已被 X 从 API 下线(v2 返回 code 34,v1.1 要更高访问级别),真要拉黑只能网页手动。「删掉spam」= 隐藏 + 静音,做到 API 上限。
先 dry-run,人审 borderline,再 apply。 启发式会把真人评论("机器人🤖"、"저지능🤪")和 spam 变体("我在济源呀🌷" + 隐形字符)分错边。flagged 直接处理,borderline 必须 Claude 逐条看。
# 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,自动跳过、续跑。
向用户汇报:隐藏几条、失败几条(及原因)、静音几个号;提醒 block 需网页手动。
| 坑 | 现实 |
|----|------|
| raw 查询 401 Unauthorized | query 参数里的 : 必须 URL 编码(to%3Ajianshuo),不是 auth 问题,别去换 oauth1/oauth2 |
| xurl block 报 code 34 | block 端点已从 X API 移除(v2/v1.1 都不行),用 mute 替代,别反复试 |
| hide 报 "Invalid Request" | 该回复所在会话的根推文不是用户的(用户只是参与别人的串),串主才有权隐藏——记为 hide-failed,账号照样静音 |
| hide 报 429 | 限流约 50 次/15 分钟,等窗口刷新重跑脚本即可(状态文件保证幂等) |
| 纯文本 spam 漏网 | "我在济源呀" 这类同城话术靠隐形字符(U+034F/零宽符)混过滤器——脚本已检测,新变体出现时把特征加进 NAME_KW / INVISIBLE |
| 误伤真人 | emoji 启发式会扫进真人短评——这就是 borderline 名单存在的原因,必须人审 |
xurl delete POST_IDstate/cleaned.jsonl — 每条处理过的回复一行(id / author / status)。重跑跳过已处理;想重头来删掉此文件。
Integration with protocols.io API for managing scientific protocols. This skill should be used when working with protocols.io to search, create, update, or publish protocols; manage protocol steps and materials; handle discussions and comments; organize workspaces; upload and manage files; or integrate protocols.io functionality into workflows. Applicable for protocol discovery, collaborative protocol development, experiment tracking, lab protocol management, and scientific documentation.
Analyzes job descriptions and generates tailored resumes that highlight relevant experience, skills, and achievements to maximize interview chances
Generate Excalidraw diagrams from natural language descriptions. Use when asked to "create a diagram", "make a flowchart", "visualize a process", "draw a system architecture", "create a mind map", or "generate an Excalidraw file". Supports flowcharts, relationship diagrams, mind maps, and system architecture diagrams. Outputs .excalidraw JSON files that can be opened directly in Excalidraw.
Build and distribute Expo development clients locally or via TestFlight
Use when you have a written implementation plan to execute in a separate session with review checkpoints
Data structure for annotated matrices in single-cell analysis. Use when working with .h5ad files or integrating with the scverse ecosystem. This is the data format skill—for analysis workflows use scanpy; for probabilistic models use scvi-tools; for population-scale queries use cellxgene-census.
Benchling R&D platform integration. Access registry (DNA, proteins), inventory, ELN entries, workflows via API, build Benchling Apps, query Data Warehouse, for lab data management automation.
Comprehensive molecular biology toolkit. Use for sequence manipulation, file parsing (FASTA/GenBank/PDB), phylogenetics, and programmatic NCBI/PubMed access (Bio.Entrez). Best for batch processing, custom bioinformatics pipelines, BLAST automation. For quick lookups use gget; for multi-service integration use bioservices.
Take jianshuo/wjs-cleaning-spam from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.