#898 by GitHub stars
joeseesun/qiaomu-opencli-skills
Use opencli CLI to interact with social/content websites (Bilibili, Zhihu, Twitter/X, YouTube, Weibo, 小红书, V2EX, Reddit, HackerNews, 雪球, BOSS直聘 etc.)
History
Review weekly changes to SKILL.md before updating. Dates mark the weeks in which we observed each version; checks apply to the recorded commits.
View weekly changes
qiaomu-opencli-autofix/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
4d9a08ebff74 → 4d9a08ebff74
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 4d9a08ebff74
No earlier version was observed for comparison.
qiaomu-opencli-browser/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
4d9a08ebff74 → 4d9a08ebff74
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 4d9a08ebff74
No earlier version was observed for comparison.
qiaomu-opencli-explorer/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
4d9a08ebff74 → 4d9a08ebff74
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 4d9a08ebff74
No earlier version was observed for comparison.
qiaomu-opencli-oneshot/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
4d9a08ebff74 → 4d9a08ebff74
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 4d9a08ebff74
No earlier version was observed for comparison.
qiaomu-opencli-usage/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
4d9a08ebff74 → 4d9a08ebff74
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 4d9a08ebff74
No earlier version was observed for comparison.
qiaomu-smart-search/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Instructions only → After Instructions only
4d9a08ebff74 → 4d9a08ebff74
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Instructions only
First observation → 4d9a08ebff74
No earlier version was observed for comparison.
Heat
1.4- Star growth, last 7 daysAhead of 36% of tracked repositories
- Star growth, last 24 hoursAhead of 3% of tracked repositories
- Rank movement, last 7 daysAhead of 1% of tracked repositories
- Commits, last 30 daysAhead of 0% of tracked repositories
- Accounts asking about it through MCP, last 7 daysNot available
- Hot votes this weekAhead of 0% of tracked repositories
Heat never changes the order by stars, and sponsorship never touches it. How heat works
Stars over time
Individual skills in this repository
- qiaomu-opencli-autofix
qiaomu-opencli-autofix - qiaomu-opencli-browser
qiaomu-opencli-browser - qiaomu-opencli-explorer
qiaomu-opencli-explorer - qiaomu-opencli-oneshot
qiaomu-opencli-oneshot - qiaomu-opencli-usage
qiaomu-opencli-usage - qiaomu-smart-search
qiaomu-smart-search
How it works
qiaomu-opencli-autofix
When your agent uses it
Automatically fix broken OpenCLI adapters when commands fail. Load this skill when an opencli command fails — it guides you through diagnosing the failure via OPENCLI_DIAGNOSTIC, patching the adapter, and retrying. Works with any AI agent.
What it loads into context
Frontmatter
92 tokensAlways available to the agent
SKILL.md
2,356 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Safety Boundaries
- Prerequisites
- When to Use This Skill
- Before Entering Repair: "Empty" ≠ "Broken"
- Step 1: Collect Diagnostic Context
- Step 2: Analyze the Failure
- Step 3: Explore the Current Website
- Step 4: Patch the Adapter
- Step 5: Verify the Fix
- When to Stop
- Example Repair Session
Files
SKILL.mdcore9,715 bytesSKILL.mdcore9,715 bytesSKILL.mdcore9,715 bytesSKILL.mdcore9,715 bytesSKILL.mdcore9,715 bytesSKILL.mdcore9,715 bytesSKILL.mdcore9,715 bytesSKILL.mdcore9,715 bytesSKILL.mdcore9,715 bytesSKILL.mdcore9,715 bytes
Read SKILL.md
# OpenCLI AutoFix — Automatic Adapter Self-Repair
When an `opencli` command fails because a website changed its DOM, API, or response schema, **automatically diagnose, fix the adapter, and retry** — don't just report the error.
## Safety Boundaries
**Before starting any repair, check these hard stops:**
- **`AUTH_REQUIRED`** (exit code 77) — **STOP.** Do not modify code. Tell the user to log into the site in Chrome.
- **`BROWSER_CONNECT`** (exit code 69) — **STOP.** Do not modify code. Tell the user to run `opencli doctor`.
- **CAPTCHA / rate limiting** — **STOP.** Not an adapter issue.
**Scope constraint:**
- **Only modify the file at `RepairContext.adapter.sourcePath`** — this is the authoritative adapter location (may be `clis/<site>/` in repo or `~/.opencli/clis/<site>/` for npm installs)View the complete source on GitHubqiaomu-opencli-browser
When your agent uses it
Make websites accessible for AI agents. Navigate, click, type, extract, wait — using Chrome with existing login sessions. No LLM API key needed.
What it loads into context
Frontmatter
71 tokensAlways available to the agent
SKILL.md
3,341 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Prerequisites
- Critical Rules
- Command Cost Guide
- Action Chaining Rules
- Core Workflow
- Commands
- Example: Extract HN Stories
- Example: Fill a Form
- Saving as Reusable CLI — Complete Workflow
- Tips
- Common Pitfalls
- Troubleshooting
Files
SKILL.mdcore13,535 bytesSKILL.mdcore13,535 bytesSKILL.mdcore13,535 bytesSKILL.mdcore13,535 bytesSKILL.mdcore13,535 bytesSKILL.mdcore13,535 bytesSKILL.mdcore13,535 bytesSKILL.mdcore13,535 bytesSKILL.mdcore13,535 bytesSKILL.mdcore13,535 bytesSKILL.mdcore13,535 bytesSKILL.mdcore13,535 bytesSKILL.mdcore13,535 bytesSKILL.mdcore13,535 bytesSKILL.mdcore13,535 bytesSKILL.mdcore13,535 bytesSKILL.mdcore13,535 bytes
Read SKILL.md
# OpenCLI Browser — Browser Automation for AI Agents
Control Chrome step-by-step via CLI. Reuses existing login sessions — no passwords needed.
## Prerequisites
```bash
opencli doctor # Verify extension + daemon connectivity
```
Requires: Chrome running + OpenCLI Browser Bridge extension installed.
## Critical Rules
View the complete source on GitHubqiaomu-opencli-explorer
When your agent uses it
Use when creating a new OpenCLI adapter from scratch, adding support for a new website or platform, exploring a site's API endpoints via browser DevTools, or when a user asks to automatically generate a CLI for a website (e.g. "帮我生成 xxx.com 的 cli"). Covers automated generation, API discovery workflow, authentication strategy selection, TS adapter writing, and testing.
What it loads into context
Frontmatter
128 tokensAlways available to the agent
SKILL.md
9,699 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- AI Agent 开发者必读:用浏览器探索
- 核心流程
- Step 1: 发现 API
- Step 2: 选择认证策略
- Step 2.5: 准备工作(写代码之前)
- Step 3: 编写适配器
- Step 4: 测试
- Step 5: 提交发布
- 进阶模式: 级联请求 (Cascading Requests)
- 常见陷阱
- 用 AI Agent 自动生成适配器
- Record Workflow
Files
SKILL.mdcore34,246 bytesSKILL.mdcore34,246 bytesSKILL.mdcore34,246 bytesSKILL.mdcore34,246 bytesSKILL.mdcore34,246 bytesSKILL.mdcore34,246 bytesSKILL.mdcore34,246 bytesSKILL.mdcore34,246 bytesSKILL.mdcore34,246 bytesSKILL.mdcore34,246 bytesSKILL.mdcore34,246 bytesSKILL.mdcore34,246 bytesSKILL.mdcore34,246 bytes
Read SKILL.md
# CLI-EXPLORER — 适配器探索式开发完全指南
> 本文档教你(或 AI Agent)如何为 OpenCLI 添加一个新网站的命令。
> 从零到发布,覆盖 API 发现、方案选择、适配器编写、测试验证全流程。
> [!TIP]
> **只想为一个具体页面快速生成一个命令?** 看 [opencli-oneshot skill](../opencli-oneshot/SKILL.md)(~150 行,4 步搞定)。
> 本文档适合从零探索一个新站点的完整流程。
> [!TIP]
> **想要全自动生成?** 直接运行 `opencli generate <url> [--goal <goal>]`,内部会自动走完 explore → synthesize → cascade → verify 全流程。
> 返回 `SkillOutput`(success / blocked / needs-human-check)。如果自动生成失败或需要人工介入,再按本文档的手动流程继续。
---View the complete source on GitHubqiaomu-opencli-oneshot
When your agent uses it
Use when quickly generating a single OpenCLI command from a specific URL and goal description. 4-step process — open page, capture API, write TS adapter, test. For full site exploration, use opencli-explorer instead.
What it loads into context
Frontmatter
95 tokensAlways available to the agent
SKILL.md
1,756 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- 输入
- 流程
- 认证速查
- 模板
- 测试(必做)
- 就这样,没了
Files
SKILL.mdcore6,278 bytesSKILL.mdcore6,278 bytes
Read SKILL.md
# CLI-ONESHOT — 单点快速 CLI 生成
> 给一个 URL + 一句话描述,4 步生成一个 CLI 命令。
> 完整探索式开发请看 [opencli-explorer skill](../opencli-explorer/SKILL.md)。
---
## 输入
| 项目 | 示例 |
|------|------|
| **URL** | `https://x.com/jakevin7/lists` |
| **Goal** | 获取我的 Twitter Lists |
View the complete source on GitHubqiaomu-opencli-usage
When your agent uses it
Use when running OpenCLI commands to interact with websites (Bilibili, Twitter, Reddit, Xiaohongshu, etc.), desktop apps (Cursor, Notion), or public APIs (HackerNews, arXiv). Covers installation, command reference, and output formats for 79+ adapters.
What it loads into context
Frontmatter
140 tokensAlways available to the agent
SKILL.md
3,857 tokensWhen the skill is activated
Reference documents
7,960 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Install & Run
- Prerequisites
- Quick Lookup by Capability
- Command Quick Reference
- Self-Repair
- Related Skills
Files
SKILL.mdcore12,040 bytesSKILL.mdcore12,040 bytesSKILL.mdcore12,040 bytesSKILL.mdcore12,040 bytesSKILL.mdcore12,040 bytescommands.mddoc31,410 bytes
Read SKILL.md
# OpenCLI Usage Guide
> Make any website or Electron App your CLI. Reuse Chrome login, zero risk, AI-powered discovery.
## Install & Run
```bash
# npm global install (recommended)
npm install -g @jackwener/opencli
opencli <command>
# Or from source
cd ~/code/opencli && npm install
npx tsx src/main.ts <command>View the complete source on GitHubqiaomu-smart-search
When your agent uses it
基于 opencli 命令的智能搜索路由器。当用户想要搜索、查询、查找或研究信息时,尤其是涉及指定网站、社交媒体、技术资料、新闻、购物、旅游、求职、金融或中文内容时,务必使用此 skill
What it loads into context
Frontmatter
87 tokensAlways available to the agent
SKILL.md
1,809 tokensWhen the skill is activated
Reference documents
2,900 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- 强制预检
- 主路由规则
- 单题预算与频率限制
- 查询结束汇报
- AI 源选择
- AI 查询词建议
- 专用源补充时机
- 处理不可用的源
- 参考文件
Files
SKILL.mdcore6,375 bytesreferences/sources-ai.mddoc3,142 bytesreferences/sources-info.mddoc968 bytesreferences/sources-media.mddoc1,185 bytesreferences/sources-other.mddoc935 bytesreferences/sources-shopping.mddoc795 bytesreferences/sources-social.mddoc1,216 bytesreferences/sources-tech.mddoc1,171 bytesreferences/sources-travel.mddoc506 bytes
Read SKILL.md
# 智能搜索路由器
根据话题和场景,将查询路由到最佳的 opencli 搜索源。此 skill 的核心目标不是记忆命令,而是先定位数据源,再让 Agent 通过 `opencli` 自己读取实时帮助,避免文档漂移。
## 强制预检
每次使用前,必须先做下面两步:
- 运行 `opencli list -f yaml`
- 用 live registry 确认候选站点是否存在,并检查 `strategy`、`browser`、`domain`
选定站点后,必须再做下面两步:
- 运行 `opencli <site> -h` 查看该站点有哪些子命令View the complete source on GitHubSkills included
- qiaomu-opencli-autofix
- qiaomu-opencli-browser
- qiaomu-opencli-explorer
- qiaomu-opencli-oneshot
- qiaomu-opencli-usage
- qiaomu-smart-search
Repository facts
- License
- MIT
- Created
- Mar 16, 2026
- Last pushed
- Apr 9, 2026
- Forks
- 78
- Open issues
- 6
- Project activity
- Slowing
Rank over the last 12 weeks
Now #898 · best #582 · down 238 in 30 days
- #882 on Nov 2
- #887 on Nov 3
- #891 on Nov 4
- #892 on Nov 5
- #894 on Nov 6
- #898 since Nov 7
27 earlier periods
- #545 on Aug 2
- #567 on Aug 6
- #574 from Aug 10 to Aug 11
- #582 on Aug 17
- #589 on Aug 20
- #598 on Aug 21
- #608 on Aug 24
- #596 on Aug 29
- #635 on Sep 1
- #624 on Sep 2
- #629 on Sep 7
- #641 on Sep 9
- #636 on Sep 12
- #664 on Sep 17
- #681 on Sep 22
- #671 on Sep 27
- #660 on Oct 1
- #702 on Oct 10
- #699 on Oct 11
- #716 on Oct 12
- #710 on Oct 18
- #841 on Oct 25
- #858 on Oct 28
- #863 on Oct 29
- #865 on Oct 30
- #870 on Oct 31
- #872 on Nov 1
Before you install
Network or broad shellAutomated signals, not a guarantee
Checked Nov 4, 2026
Not fully analyzed: some files were too long, unreadable or missing. This never lowers the level.
Show 42 notes
qiaomu-opencli-autofix/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedqiaomu-opencli-autofix/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedqiaomu-opencli-autofix/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedqiaomu-opencli-autofix/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedqiaomu-opencli-autofix/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedqiaomu-opencli-autofix/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedqiaomu-opencli-autofix/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedqiaomu-opencli-autofix/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedqiaomu-opencli-autofix/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedqiaomu-opencli-browser/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedqiaomu-opencli-browser/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedqiaomu-opencli-browser/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedqiaomu-opencli-browser/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedqiaomu-opencli-browser/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedqiaomu-opencli-browser/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedqiaomu-opencli-browser/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedqiaomu-opencli-browser/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedqiaomu-opencli-browser/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedqiaomu-opencli-browser/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedqiaomu-opencli-browser/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzed
- No broad tool permissions
- 13 dangerous shell commandsin 2 files: qiaomu-opencli-browser/SKILL.md:24 qiaomu-opencli-usage/commands.md:487
- 149 network referencesin 5 files: qiaomu-opencli-explorer/SKILL.md:42 qiaomu-opencli-oneshot/SKILL.md:18 qiaomu-opencli-browser/SKILL.md:46 and 2 more
- No hidden or obfuscated text
- No instruction overrides
- No executable scripts
- 1 reference to secretsin 1 file: qiaomu-opencli-oneshot/SKILL.md:98
- No requests to vote in Hot
Show all 163 signals by file
qiaomu-opencli-autofix/SKILL.md
- Network accessline 76
}, "page": { "url": "https://example.com/search", - Network accessline 77
"page": { "url": "https://example.com/search", "snapshot": "// DOM snapshot with [N] indices", - Network accessline 78
"url": "https://example.com/search", - Network accessline 119
# Open the page and inspect current DOM opencli browser open https://example.com/target-page && opencli browser state - Network accessline 120
opencli browser open https://example.com/target-page && opencli browser state - Network accessline 129
# Open page with network interceptor, then trigger the action manually opencli browser open https://example.com/target-page && opencli browser state - Network accessline 130
opencli browser open https://example.com/target-page && opencli browser state - Network accessline 158
// Before: const resp = await page.evaluate(`fetch('/api/v1/old-endpoint')...`) - Network accessline 159
// After: const resp = await page.evaluate(`fetch('/api/v2/new-endpoint')...`) - Network accessline 216
4. AI explores: opencli browser open https://www.zhihu.com/hot && opencli browser state
qiaomu-opencli-browser/SKILL.md
- Dangerous shell operationline 24
2. **ALWAYS use `click`/`type`/`select` for interaction, NEVER use `eval` to click or type** — `eval "el.click()"` bypasses scrollIntoView and CDP click pipeline, causing failures on off-screen elements. Use `state` to find the `[N]` index, - Dangerous shell operationline 28
6. **`eval` is read-only** — use `eval` ONLY for data extraction (`JSON.stringify(...)`), never for clicking, typing, or navigating. Always wrap in IIFE to avoid variable conflicts: `eval "(function(){ const x = ...; return JSON.stringify(x - Network accessline 46
# GOOD: open + inspect in one call (saves 1 round trip) opencli browser open https://example.com && opencli browser state - Network accessline 47
opencli browser open https://example.com && opencli browser state - Dangerous shell operationline 136
opencli browser eval "document.title" - Dangerous shell operationline 137
opencli browser eval "JSON.stringify([...document.querySelectorAll('h2')].map(e => e.textContent))" - Dangerous shell operationline 140
opencli browser eval "(function(){ const items = [...document.querySelectorAll('.item')]; return JSON.stringify(items.map(e => e.textContent)); })()" - Dangerous shell operationline 146
opencli browser eval "document.querySelector('.title').textContent" - Dangerous shell operationline 149
opencli browser eval "(document.querySelector('.title') || document.querySelector('h1') || {textContent:''}).textContent" - Dangerous shell operationline 150
opencli browser eval "document.querySelector('.title')?.textContent ?? 'not found'" - Network accessline 181
opencli browser open https://news.ycombinator.com - Dangerous shell operationline 183
opencli browser eval "JSON.stringify([...document.querySelectorAll('.titleline a')].slice(0,5).map(a => ({title: a.textContent, url: a.href})))" - Network accessline 190
opencli browser open https://httpbin.org/forms/post - Network accessline 202
# 1. Explore the website opencli browser open https://news.ycombinator.com - Network accessline 203
opencli browser open https://news.ycombinator.com - Network accessline 206
# 2. Discover APIs (crucial for high-quality adapters) opencli browser eval "fetch('/api/...').then(r=>r.json())" # Trigger API calls - Dangerous shell operationline 207
opencli browser eval "fetch('/api/...').then(r=>r.json())" # Trigger API calls - Network accessline 207
opencli browser eval "fetch('/api/...').then(r=>r.json())" # Trigger API calls - Network accessline 214
# 4. Edit the adapter (fill in func logic) # - If API found: use fetch() directly (Strategy.PUBLIC or COOKIE) - Network accessline 215
# - If API found: use fetch() directly (Strategy.PUBLIC or COOKIE) - Network accessline 241
func: async (_page, kwargs) => { const limit = Math.min(Math.max(1, kwargs.limit ?? 5), 50); const resp = await fetch('https://hacker-news.firebaseio.com/v0/topstories.json'); - Network accessline 242
const limit = Math.min(Math.max(1, kwargs.limit ?? 5), 50); const resp = await fetch('https://hacker-news.firebaseio.com/v0/topstories.json'); const ids = await resp.json(); - Network accessline 243
const resp = await fetch('https://hacker-news.firebaseio.com/v0/topstories.json'); - Network accessline 245
return Promise.all( ids.slice(0, limit).map(async (id: number, i: number) => { const item = await (await fetch(`https://hacker-news.firebaseio.com/v0/item/${id}.json`)).json(); - Network accessline 246
ids.slice(0, limit).map(async (id: number, i: number) => { const item = await (await fetch(`https://hacker-news.firebaseio.com/v0/item/${id}.json`)).json(); return { rank: i + 1, title: item.title, score: item.score, url: it - Network accessline 247
const item = await (await fetch(`https://hacker-news.firebaseio.com/v0/item/${id}.json`)).json(); - Network accessline 265
**Always prefer API over UI** — if you discovered an API during browsing, use `fetch()` directly. - Dangerous shell operationline 271
3. **Use `eval` for data extraction** — `eval "JSON.stringify(...)"` is faster than multiple `get` calls - Dangerous shell operationline 280
opencli browser eval "document.querySelector('form').submit()" - Network accessline 280
opencli browser eval "document.querySelector('form').submit()" # GOOD: construct the URL and navigate opencli browser open "https://github.com/search?q=opencli&type=repositories" - Network accessline 282
opencli browser open "https://github.com/search?q=opencli&type=repositories" - Network accessline 291
5. **`evaluate` runs in browser context** — `page.evaluate()` in adapters executes inside the browser. Node.js APIs (`fs`, `path`, `process`) are NOT available. Use `fetch()` for network calls, DOM APIs for page data.
qiaomu-opencli-explorer/SKILL.md
- Network accessline 42
| 3. 模拟交互 | `browser_click` + `browser_wait_for` | 点击"字幕""评论""关注"等按钮 | | 4. 二次抓包 | `browser_network_requests` | 对比步骤 2,找出新触发的 API | | 5. 验证 API | `browser_evaluate` | `fetch(url, {credentials:'include'})` 测试返回结构 | - Network accessline 43
| 4. 二次抓包 | `browser_network_requests` | 对比步骤 2,找出新触发的 API | | 5. 验证 API | `browser_evaluate` | `fetch(url, {credentials:'include'})` 测试返回结构 | | 6. 写代码 | — | 基于确认的 API 写适配器 | - Network accessline 44
| 5. 验证 API | `browser_evaluate` | `fetch(url, {credentials:'include'})` 测试返回结构 | - Network accessline 50
|------------|------------| | 只用 `opencli explore` 命令,等结果自动出来 | 用浏览器工具打开页面,主动浏览 | | 直接在代码里 `fetch(url)`,不看浏览器实际请求 | 先在浏览器中确认 API 可用,再写代码 | - Network accessline 51
| 只用 `opencli explore` 命令,等结果自动出来 | 用浏览器工具打开页面,主动浏览 | | 直接在代码里 `fetch(url)`,不看浏览器实际请求 | 先在浏览器中确认 API 可用,再写代码 | | 页面打开后直接抓包,期望所有 API 都出现 | 模拟点击交互(展开评论/切换标签/加载更多) | - Network accessline 52
| 直接在代码里 `fetch(url)`,不看浏览器实际请求 | 先在浏览器中确认 API 可用,再写代码 | - Network accessline 62
1. browser_navigate → https://space.bilibili.com/{uid}/fans/follow - Network accessline 65
GET /x/relation/stat?vmid={uid} → [200] 3. browser_evaluate → 验证 API: fetch('/x/relation/followings?vmid=137702077&pn=1&ps=5', {credentials:'include'}) - Network accessline 66
3. browser_evaluate → 验证 API: fetch('/x/relation/followings?vmid=137702077&pn=1&ps=5', {credentials:'include'}) → { code: 0, data: { total: 1342, list: [{mid, uname, sign, ...}] } } - Network accessline 67
fetch('/x/relation/followings?vmid=137702077&pn=1&ps=5', {credentials:'include'}) - Network accessline 98
opencli explore https://www.example.com --site mysite - Network accessline 115
# 在浏览器中打开目标页面,观察网络请求 opencli explore https://www.example.com --site mysite -v - Network accessline 116
opencli explore https://www.example.com --site mysite -v - Network accessline 162
opencli cascade https://api.example.com/hot - Network accessline 168
直接 fetch(url) 能拿到数据? - Network accessline 169
→ ✅ Tier 1: public(公开 API,不需要浏览器) → ❌ fetch(url, {credentials:'include'}) 带 Cookie 能拿到? → ✅ Tier 2: cookie(最常见,evaluate 步骤内 fetch) - Network accessline 170
→ ❌ fetch(url, {credentials:'include'}) 带 Cookie 能拿到? - Network accessline 260
const ps = Math.min(kwargs.limit ?? 50, 50); // 尊重 API 的 ps 上限 const payload = await fetchJson(page, `https://api.example.com/list?pn=${pn}&ps=${ps}` - Network accessline 261
const payload = await fetchJson(page, `https://api.example.com/list?pn=${pn}&ps=${ps}` ); - Network accessline 262
`https://api.example.com/list?pn=${pn}&ps=${ps}` - Network accessline 290
columns: ['rank', 'title', 'replies'], func: async (_page, kwargs) => { const res = await fetch('https://www.v2ex.com/api/topics/hot.json'); - Network accessline 291
func: async (_page, kwargs) => { const res = await fetch('https://www.v2ex.com/api/topics/hot.json'); const data = await res.json(); - Network accessline 292
const res = await fetch('https://www.v2ex.com/api/topics/hot.json'); - Network accessline 319
columns: ['rank', 'title', 'heat', 'answers'], func: async (page, kwargs) => { await page.goto('https://www.zhihu.com'); // 先加载页面建立 session - Network accessline 320
func: async (page, kwargs) => { await page.goto('https://www.zhihu.com'); // 先加载页面建立 session const data = await page.evaluate(`(async () => { - Network accessline 321
await page.goto('https://www.zhihu.com'); // 先加载页面建立 session const data = await page.evaluate(`(async () => { const res = await fetch('/api/v3/feed/topstory/hot-lists/total?limit=50', { - Network accessline 322
const data = await page.evaluate(`(async () => { const res = await fetch('/api/v3/feed/topstory/hot-lists/total?limit=50', { credentials: 'include' - Network accessline 323
const res = await fetch('/api/v3/feed/topstory/hot-lists/total?limit=50', { - Network accessline 365
columns: ['rank', 'title', 'type', 'author', 'votes'], func: async (page, kwargs) => { await page.goto('https://www.zhihu.com'); - Network accessline 366
func: async (page, kwargs) => { await page.goto('https://www.zhihu.com'); const data = await page.evaluate(`(async () => { - Network accessline 367
await page.goto('https://www.zhihu.com'); - Network accessline 368
const data = await page.evaluate(`(async () => { const q = encodeURIComponent('${kwargs.query}'); const res = await fetch('/api/v4/search_v3?q=' + q + '&t=general&limit=${kwargs.limit}', { - Network accessline 369
const q = encodeURIComponent('${kwargs.query}'); const res = await fetch('/api/v4/search_v3?q=' + q + '&t=general&limit=${kwargs.limit}', { credentials: 'include' - Network accessline 370
const res = await fetch('/api/v4/search_v3?q=' + q + '&t=general&limit=${kwargs.limit}', { - Network accessline 410
columns: ['rank', 'user', 'action', 'content', 'note', 'time'], func: async (page, kwargs) => { await page.goto('https://www.xiaohongshu.com/notification'); - Network accessline 411
func: async (page, kwargs) => { await page.goto('https://www.xiaohongshu.com/notification'); await page.wait(3); - Network accessline 412
await page.goto('https://www.xiaohongshu.com/notification'); - Network accessline 466
columns: ['rank', 'author', 'text', 'likes'], func: async (page, kwargs) => { await page.goto('https://x.com'); - Network accessline 467
func: async (page, kwargs) => { await page.goto('https://x.com'); const data = await page.evaluate(` - Network accessline 468
await page.goto('https://x.com'); - Network accessline 484
const variables = JSON.stringify({ rawQuery: '${kwargs.query}', count: 20 }); const url = '/i/api/graphql/xxx/SearchTimeline?variables=' + encodeURIComponent(variables); const res = await fetch(url, { headers, credentials: ' - Network accessline 485
const url = '/i/api/graphql/xxx/SearchTimeline?variables=' + encodeURIComponent(variables); const res = await fetch(url, { headers, credentials: 'include' }); return await res.json(); - Network accessline 486
const res = await fetch(url, { headers, credentials: 'include' }); - Network accessline 507
columns: ['rank', 'title', 'likes', 'url'], func: async (page, kwargs) => { await page.goto(`https://www.xiaohongshu.com/user/profile/${kwargs.id}`); - Network accessline 508
func: async (page, kwargs) => { await page.goto(`https://www.xiaohongshu.com/user/profile/${kwargs.id}`); await page.wait(5); - Network accessline 509
await page.goto(`https://www.xiaohongshu.com/user/profile/${kwargs.id}`); - Network accessline 527
title: note.display_title || '', likes: note.interact_info?.liked_count || '0', url: `https://explore/${note.note_id || note.id}` - Network accessline 528
likes: note.interact_info?.liked_count || '0', url: `https://explore/${note.note_id || note.id}` }); - Network accessline 529
url: `https://explore/${note.note_id || note.id}` - Network accessline 652
// Step 1: 建立 Session await page.goto(`https://www.bilibili.com/video/${kwargs.bvid}/`); - Network accessline 653
await page.goto(`https://www.bilibili.com/video/${kwargs.bvid}/`); - Network accessline 672
// Step 5: 拉取最终数据 (CDN JSON) const items = await page.evaluate(`(async () => { const res = await fetch(${JSON.stringify('https:' + url)}); - Network accessline 673
const items = await page.evaluate(`(async () => { const res = await fetch(${JSON.stringify('https:' + url)}); const json = await res.json(); - Network accessline 674
const res = await fetch(${JSON.stringify('https:' + url)}); - Network accessline 720
# 一键:探索 → 分析 → 合成 → 注册 opencli generate https://www.example.com --goal "hot" - Network accessline 721
opencli generate https://www.example.com --goal "hot" - Network accessline 723
# 或分步执行: opencli explore https://www.example.com --site mysite # 发现 API - Network accessline 724
opencli explore https://www.example.com --site mysite # 发现 API - Network accessline 725
opencli explore https://www.example.com --auto --click "字幕,CC" # 模拟点击触发懒加载 API - Network accessline 757
# 1. 启动录制(建议 --timeout 给足操作时间) opencli record "https://example.com/page" --timeout 120000 - Network accessline 758
opencli record "https://example.com/page" --timeout 120000 - Network accessline 793
browser: true pipeline: - navigate: https://... - Network accessline 794
pipeline: - navigate: https://... - evaluate: | - Network accessline 795
- navigate: https://... - Network accessline 796
- evaluate: | (async () => { const res = await fetch('/approval/getList.json?procInsId=...', { credentials: 'include' }); - Network accessline 797
(async () => { const res = await fetch('/approval/getList.json?procInsId=...', { credentials: 'include' }); const data = await res.json(); - Network accessline 798
const res = await fetch('/approval/getList.json?procInsId=...', { credentials: 'include' }); - Network accessline 818
columns: ['step', 'operator', 'action', 'time'], func: async (page, kwargs) => { await page.goto('https://tae.alibaba-inc.com/expense/pc.html?_authType=SAML'); - Network accessline 819
func: async (page, kwargs) => { await page.goto('https://tae.alibaba-inc.com/expense/pc.html?_authType=SAML'); await page.wait(2); - Network accessline 820
await page.goto('https://tae.alibaba-inc.com/expense/pc.html?_authType=SAML'); - Network accessline 821
await page.wait(2); const result = await page.evaluate(`(async () => { const res = await fetch('/approval/getList.json?taskId=&procInsId=${kwargs.proc_ins_id}', { - Network accessline 822
const result = await page.evaluate(`(async () => { const res = await fetch('/approval/getList.json?taskId=&procInsId=${kwargs.proc_ins_id}', { credentials: 'include' - Network accessline 823
const res = await fetch('/approval/getList.json?taskId=&procInsId=${kwargs.proc_ins_id}', { - Network accessline 848
| 现象 | 原因 | 解法 | |------|------|------| | 捕获 0 条请求 | 拦截器注入失败,或页面无 JSON API | 检查 daemon 是否运行:`curl localhost:19825/status` | - Network accessline 849
|------|------|------| | 捕获 0 条请求 | 拦截器注入失败,或页面无 JSON API | 检查 daemon 是否运行:`curl localhost:19825/status` | | 捕获量少(1~3 条) | 页面是只读详情页,首屏数据已在注入前发出 | 手动操作触发更多请求(搜索/翻页),或换用列表页 | - Network accessline 850
| 捕获 0 条请求 | 拦截器注入失败,或页面无 JSON API | 检查 daemon 是否运行:`curl localhost:19825/status` |
qiaomu-opencli-oneshot/SKILL.md
- Network accessline 18
| 项目 | 示例 | |------|------| | **URL** | `https://x.com/jakevin7/lists` | - Network accessline 19
|------|------| | **URL** | `https://x.com/jakevin7/lists` | | **Goal** | 获取我的 Twitter Lists | - Network accessline 20
| **URL** | `https://x.com/jakevin7/lists` | - Network accessline 54
// Tier 2 (Cookie): 大多数情况 fetch('/api/endpoint', { credentials: 'include' }).then(r => r.json()) - Network accessline 55
fetch('/api/endpoint', { credentials: 'include' }).then(r => r.json()) - Network accessline 57
// Tier 3 (Header): 如 Twitter 需要额外 header const ct0 = document.cookie.match(/ct0=([^;]+)/)?.[1]; fetch('/api/endpoint', { - Network accessline 58
[Credential-related source omitted] - Network accessline 59
fetch('/api/endpoint', { - Network accessline 77
fetch(url) 直接能拿到? → Tier 1: public (TS pipeline, browser: false) - Network accessline 78
fetch(url, {credentials:'include'})? → Tier 2: cookie (TS pipeline 或 func()) - Access to secretsline 98
[Credential-related source omitted] - Network accessline 103
columns: ['rank', 'title', 'value'], func: async (page, kwargs) => { await page.goto('https://www.example.com/target-page'); - Network accessline 104
func: async (page, kwargs) => { await page.goto('https://www.example.com/target-page'); const data = await page.evaluate(`(async () => { - Network accessline 105
await page.goto('https://www.example.com/target-page'); const data = await page.evaluate(`(async () => { const res = await fetch('/api/target', { credentials: 'include' }); - Network accessline 106
const data = await page.evaluate(`(async () => { const res = await fetch('/api/target', { credentials: 'include' }); const d = await res.json(); - Network accessline 107
const res = await fetch('/api/target', { credentials: 'include' }); - Network accessline 140
func: async (page, kwargs) => { // 1. 导航 await page.goto('https://www.example.com/target-page'); - Network accessline 141
// 1. 导航 await page.goto('https://www.example.com/target-page'); await page.wait(3); - Network accessline 142
await page.goto('https://www.example.com/target-page'); - Network accessline 185
columns: ['rank', 'name', 'value'], func: async (page, kwargs) => { await page.goto('https://x.com'); - Network accessline 186
func: async (page, kwargs) => { await page.goto('https://x.com'); const data = await page.evaluate(`(async () => { - Network accessline 187
await page.goto('https://x.com'); - Network accessline 190
if (!ct0) return { error: 'Not logged in' }; const bearer = 'AAAAAAAAAAAAAAAAAAAAANRILgAAAAAAnNwIzUejRCOuH5E6I8xnZz4puTs%3D...'; const res = await fetch('/i/api/graphql/QUERY_ID/Endpoint', { - Network accessline 191
const bearer = 'AAAAAAAAAAAAAAAAAAAAANRILgAAAAAAnNwIzUejRCOuH5E6I8xnZz4puTs%3D...'; const res = await fetch('/i/api/graphql/QUERY_ID/Endpoint', { headers: { - Network accessline 192
const res = await fetch('/i/api/graphql/QUERY_ID/Endpoint', {
qiaomu-opencli-usage/commands.md
- Network accessline 106
# Browser (login required) opencli bloomberg news "https://..." # 阅读 Bloomberg 文章全文 (link positional) - Network accessline 107
opencli bloomberg news "https://..." # 阅读 Bloomberg 文章全文 (link positional) - Dangerous shell operationline 487
opencli quark rm <id> # 删除文件 - Network accessline 619
opencli twitter follow elonmusk # 关注用户 opencli twitter unfollow elonmusk # 取消关注 opencli twitter bookmark https://x.com/... # 收藏推文 - Network accessline 620
opencli twitter unfollow elonmusk # 取消关注 opencli twitter bookmark https://x.com/... # 收藏推文 opencli twitter unbookmark https://x.com/... # 取消收藏 - Network accessline 621
opencli twitter bookmark https://x.com/... # 收藏推文 - Network accessline 622
opencli twitter unbookmark https://x.com/... # 取消收藏 - Network accessline 623
opencli twitter post "Hello world" # 发布推文 (text positional) opencli twitter like https://x.com/... # 点赞推文 (url positional) opencli twitter likes elonmusk # 用户点赞列表 - Network accessline 624
opencli twitter like https://x.com/... # 点赞推文 (url positional) - Network accessline 625
opencli twitter likes elonmusk # 用户点赞列表 opencli twitter reply https://x.com/... "Nice!" # 回复推文 (url + text positional) opencli twitter delete https://x.com/... # 删除推文 (url positional) - Network accessline 626
opencli twitter reply https://x.com/... "Nice!" # 回复推文 (url + text positional) - Network accessline 627
opencli twitter delete https://x.com/... # 删除推文 (url positional) - Network accessline 631
opencli twitter following elonmusk # 用户的关注列表 (user positional) opencli twitter notifications --limit 20 # 通知列表 opencli twitter hide-reply https://x.com/... # 隐藏回复 (url positional) - Network accessline 632
opencli twitter notifications --limit 20 # 通知列表 opencli twitter hide-reply https://x.com/... # 隐藏回复 (url positional) opencli twitter download elonmusk # 下载用户媒体 (username positional, 支持 --tweet-url) - Network accessline 633
opencli twitter hide-reply https://x.com/... # 隐藏回复 (url positional) opencli twitter download elonmusk # 下载用户媒体 (username positional, 支持 --tweet-url) opencli twitter accept "群,微信" # 自动接受含关键词的 DM 请求 (query positional) - Network accessline 661
opencli web read --url "https://..." # 抓取任意网页并导出为 Markdown - Network accessline 679
opencli weixin download --url "https://mp.weixin.qq.com/s/xxx" # 下载公众号文章为 Markdown - Network accessline 787
opencli youtube search "rust" # 搜索视频 (query positional) opencli youtube video "https://www.youtube.com/watch?v=xxx" # 视频元数据 - Network accessline 788
opencli youtube video "https://www.youtube.com/watch?v=xxx" # 视频元数据 - Network accessline 789
opencli youtube transcript "https://www.youtube.com/watch?v=xxx" # 获取视频字幕/转录
How the signals fit together
Facts from a static read of the files at the pinned commit. They describe what the code does, not why.
Some files could not be read; the facts below still hold.
Signal confidence: 3 facts
- Network access in code of the SKILL.mdqiaomu-opencli-autofix/SKILL.md:120High confidence
- Network access in code of the SKILL.mdqiaomu-opencli-autofix/SKILL.md:130High confidence
- Network access in code of the SKILL.mdqiaomu-opencli-autofix/SKILL.md:216High confidence
Works with
| Agent | Status | Evidence | Install to |
|---|---|---|---|
| Claude Code | Compatible | Standard SKILL.md qiaomu-opencli-autofix/SKILL.md | .claude/skills/<skill-name>/ |
| Codex | Compatible | Standard SKILL.md qiaomu-opencli-autofix/SKILL.md | .agents/skills/<skill-name>/ |
| Cursor | Compatible | Standard SKILL.md qiaomu-opencli-autofix/SKILL.md | .cursor/skills/<skill-name>/ |
| Gemini CLI | Compatible | Standard SKILL.md qiaomu-opencli-autofix/SKILL.md | .gemini/skills/<skill-name>/ |
| GitHub Copilot | Compatible | Standard SKILL.md qiaomu-opencli-autofix/SKILL.md | .github/skills/<skill-name>/ |
| OpenCode | Compatible | Standard SKILL.md qiaomu-opencli-autofix/SKILL.md | .opencode/skills/<skill-name>/ |
- Native The repository ships a manifest, folder or frontmatter field for this agent.
- Compatible A standard SKILL.md that this agent can read.
- Unknown No evidence either way.
Derived automatically from paths, manifests and frontmatter. Not tested on each agent.
Explore alternatives and comparisons
Add this badge to your README
It updates every night and links to this page.
[](https://hotskills.dev/skill/joeseesun-qiaomu-opencli-skills/)