@jackwener/opencli 1.1.0 → 1.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agents/skills/cross-project-adapter-migration/SKILL.md +2 -2
- package/.github/pull_request_template.md +7 -0
- package/.github/workflows/doc-check.yml +36 -0
- package/.github/workflows/docs.yml +7 -42
- package/CHANGELOG.md +23 -0
- package/CLI-EXPLORER.md +9 -8
- package/README.md +25 -10
- package/README.zh-CN.md +26 -11
- package/SKILL.md +95 -31
- package/dist/browser/cdp.js +6 -1
- package/dist/browser/page.d.ts +4 -1
- package/dist/browser/page.js +7 -1
- package/dist/build-manifest.js +23 -16
- package/dist/cli-manifest.json +431 -276
- package/dist/cli.d.ts +6 -0
- package/dist/cli.js +189 -162
- package/dist/clis/apple-podcasts/commands.test.d.ts +2 -0
- package/dist/clis/apple-podcasts/commands.test.js +76 -0
- package/dist/clis/apple-podcasts/search.js +2 -2
- package/dist/clis/apple-podcasts/top.js +9 -2
- package/dist/clis/arxiv/search.js +1 -1
- package/dist/clis/bilibili/dynamic.js +1 -1
- package/dist/clis/bilibili/favorite.js +1 -1
- package/dist/clis/bilibili/feed.js +1 -1
- package/dist/clis/bilibili/following.js +1 -1
- package/dist/clis/bilibili/history.js +1 -1
- package/dist/clis/bilibili/me.js +1 -1
- package/dist/clis/bilibili/ranking.js +1 -1
- package/dist/clis/bilibili/search.js +3 -3
- package/dist/clis/bilibili/subtitle.js +1 -1
- package/dist/clis/bilibili/user-videos.js +1 -1
- package/dist/{bilibili.d.ts → clis/bilibili/utils.d.ts} +1 -1
- package/dist/clis/bloomberg/businessweek.js +17 -0
- package/dist/clis/bloomberg/economics.js +17 -0
- package/dist/clis/bloomberg/feeds.d.ts +1 -0
- package/dist/clis/bloomberg/feeds.js +15 -0
- package/dist/clis/bloomberg/industries.d.ts +1 -0
- package/dist/clis/bloomberg/industries.js +17 -0
- package/dist/clis/bloomberg/main.d.ts +1 -0
- package/dist/clis/bloomberg/main.js +17 -0
- package/dist/clis/bloomberg/markets.d.ts +1 -0
- package/dist/clis/bloomberg/markets.js +17 -0
- package/dist/clis/bloomberg/news.d.ts +1 -0
- package/dist/clis/bloomberg/news.js +105 -0
- package/dist/clis/bloomberg/opinions.d.ts +1 -0
- package/dist/clis/bloomberg/opinions.js +17 -0
- package/dist/clis/bloomberg/politics.d.ts +1 -0
- package/dist/clis/bloomberg/politics.js +17 -0
- package/dist/clis/bloomberg/tech.d.ts +1 -0
- package/dist/clis/bloomberg/tech.js +17 -0
- package/dist/clis/bloomberg/utils.d.ts +34 -0
- package/dist/clis/bloomberg/utils.js +364 -0
- package/dist/clis/bloomberg/utils.test.d.ts +1 -0
- package/dist/clis/bloomberg/utils.test.js +129 -0
- package/dist/clis/boss/batchgreet.js +2 -2
- package/dist/clis/boss/chatlist.js +2 -2
- package/dist/clis/boss/detail.js +2 -2
- package/dist/clis/boss/greet.js +4 -4
- package/dist/clis/boss/search.js +1 -1
- package/dist/clis/boss/send.js +1 -1
- package/dist/clis/boss/stats.js +2 -2
- package/dist/clis/chaoxing/assignments.js +1 -1
- package/dist/clis/chaoxing/exams.js +1 -1
- package/dist/{chaoxing.d.ts → clis/chaoxing/utils.d.ts} +1 -1
- package/dist/{chaoxing.js → clis/chaoxing/utils.js} +0 -2
- package/dist/clis/chaoxing/utils.test.d.ts +1 -0
- package/dist/{chaoxing.test.js → clis/chaoxing/utils.test.js} +1 -1
- package/dist/clis/chatgpt/read.js +1 -1
- package/dist/clis/chatwise/export.js +1 -1
- package/dist/clis/chatwise/model.js +2 -2
- package/dist/clis/chatwise/screenshot.js +1 -1
- package/dist/clis/codex/export.js +1 -1
- package/dist/clis/codex/model.js +2 -2
- package/dist/clis/codex/screenshot.js +1 -1
- package/dist/clis/coupang/add-to-cart.js +3 -4
- package/dist/clis/coupang/search.js +2 -4
- package/dist/clis/coupang/utils.test.d.ts +1 -0
- package/dist/{coupang.test.js → clis/coupang/utils.test.js} +1 -1
- package/dist/clis/ctrip/search.js +1 -1
- package/dist/clis/cursor/export.js +1 -1
- package/dist/clis/cursor/model.js +2 -2
- package/dist/clis/cursor/screenshot.js +1 -1
- package/dist/clis/jike/comment.js +2 -3
- package/dist/clis/jike/create.js +1 -2
- package/dist/clis/jike/feed.js +0 -1
- package/dist/clis/jike/like.js +1 -2
- package/dist/clis/jike/notifications.js +0 -1
- package/dist/clis/jike/post.yaml +1 -0
- package/dist/clis/jike/repost.js +1 -2
- package/dist/clis/jike/search.js +2 -3
- package/dist/clis/jike/topic.yaml +1 -0
- package/dist/clis/jike/user.yaml +1 -0
- package/dist/clis/jimeng/history.yaml +0 -1
- package/dist/clis/linkedin/search.js +7 -7
- package/dist/clis/linux-do/category.yaml +1 -0
- package/dist/clis/linux-do/search.yaml +4 -3
- package/dist/clis/linux-do/topic.yaml +1 -0
- package/dist/clis/notion/export.js +1 -1
- package/dist/clis/reddit/comment.js +3 -4
- package/dist/clis/reddit/read.js +4 -5
- package/dist/clis/reddit/save.js +2 -3
- package/dist/clis/reddit/saved.js +0 -1
- package/dist/clis/reddit/search.yaml +1 -0
- package/dist/clis/reddit/subscribe.js +0 -1
- package/dist/clis/reddit/upvote.js +2 -3
- package/dist/clis/reddit/upvoted.js +0 -1
- package/dist/clis/reddit/user-comments.yaml +1 -0
- package/dist/clis/reddit/user-posts.yaml +1 -0
- package/dist/clis/reddit/user.yaml +1 -0
- package/dist/clis/reuters/search.js +1 -1
- package/dist/clis/smzdm/search.js +2 -3
- package/dist/clis/stackoverflow/search.yaml +1 -0
- package/dist/clis/steam/top-sellers.yaml +29 -0
- package/dist/clis/twitter/accept.js +2 -2
- package/dist/clis/twitter/article.js +2 -2
- package/dist/clis/twitter/block.d.ts +1 -0
- package/dist/clis/twitter/block.js +88 -0
- package/dist/clis/twitter/delete.js +1 -1
- package/dist/clis/twitter/hide-reply.d.ts +1 -0
- package/dist/clis/twitter/hide-reply.js +66 -0
- package/dist/clis/twitter/like.js +1 -1
- package/dist/clis/twitter/post.js +1 -1
- package/dist/clis/twitter/reply-dm.js +1 -1
- package/dist/clis/twitter/reply.js +2 -2
- package/dist/clis/twitter/search.js +1 -1
- package/dist/clis/twitter/thread.js +2 -2
- package/dist/clis/twitter/trending.d.ts +1 -0
- package/dist/clis/twitter/trending.js +91 -0
- package/dist/clis/twitter/unblock.d.ts +1 -0
- package/dist/clis/twitter/unblock.js +71 -0
- package/dist/clis/v2ex/topic.yaml +1 -0
- package/dist/clis/weibo/hot.js +0 -1
- package/dist/clis/weread/book.js +1 -1
- package/dist/clis/weread/highlights.js +1 -1
- package/dist/clis/weread/notes.js +1 -1
- package/dist/clis/weread/search.js +1 -1
- package/dist/clis/wikipedia/search.js +1 -1
- package/dist/clis/xiaohongshu/creator-note-detail.d.ts +15 -0
- package/dist/clis/xiaohongshu/creator-note-detail.js +69 -5
- package/dist/clis/xiaohongshu/creator-note-detail.test.js +80 -33
- package/dist/clis/xiaohongshu/creator-notes.js +35 -5
- package/dist/clis/xiaohongshu/creator-notes.test.js +35 -6
- package/dist/clis/xiaohongshu/creator-profile.js +0 -1
- package/dist/clis/xiaohongshu/creator-stats.js +0 -1
- package/dist/clis/xiaohongshu/download.js +2 -3
- package/dist/clis/xiaohongshu/feed.yaml +0 -1
- package/dist/clis/xiaohongshu/notifications.yaml +0 -1
- package/dist/clis/xiaohongshu/search.js +2 -2
- package/dist/clis/xiaohongshu/user.js +1 -2
- package/dist/clis/yahoo-finance/quote.js +0 -1
- package/dist/clis/youtube/search.js +1 -1
- package/dist/clis/youtube/transcript.js +1 -1
- package/dist/clis/youtube/video.js +1 -1
- package/dist/clis/zhihu/download.js +1 -2
- package/dist/clis/zhihu/question.js +1 -1
- package/dist/clis/zhihu/search.yaml +4 -3
- package/dist/commanderAdapter.d.ts +21 -0
- package/dist/commanderAdapter.js +111 -0
- package/dist/{engine.d.ts → discovery.d.ts} +0 -6
- package/dist/{engine.js → discovery.js} +1 -98
- package/dist/download/index.d.ts +2 -6
- package/dist/download/index.js +19 -46
- package/dist/engine.test.d.ts +1 -1
- package/dist/engine.test.js +8 -7
- package/dist/execution.d.ts +22 -0
- package/dist/execution.js +129 -0
- package/dist/explore.js +121 -107
- package/dist/external-clis.yaml +48 -0
- package/dist/external.d.ts +7 -2
- package/dist/external.js +11 -14
- package/dist/main.js +1 -1
- package/dist/pipeline/steps/browser.js +8 -2
- package/dist/registry.d.ts +2 -0
- package/dist/registry.js +2 -0
- package/dist/runtime.d.ts +5 -0
- package/dist/runtime.js +8 -0
- package/dist/serialization.d.ts +34 -0
- package/dist/serialization.js +63 -0
- package/dist/types.d.ts +4 -1
- package/docs/.vitepress/config.mts +14 -3
- package/docs/adapters/browser/arxiv.md +27 -0
- package/docs/adapters/browser/barchart.md +32 -0
- package/docs/adapters/browser/bloomberg.md +70 -0
- package/docs/adapters/browser/chaoxing.md +39 -0
- package/docs/adapters/browser/grok.md +35 -0
- package/docs/adapters/browser/hf.md +42 -0
- package/docs/adapters/browser/jike.md +45 -0
- package/docs/adapters/browser/jimeng.md +39 -0
- package/docs/adapters/browser/linux-do.md +45 -0
- package/docs/adapters/browser/sinafinance.md +35 -0
- package/docs/adapters/browser/stackoverflow.md +35 -0
- package/docs/adapters/browser/steam.md +26 -0
- package/docs/adapters/browser/twitter.md +3 -0
- package/docs/adapters/browser/weread.md +48 -0
- package/docs/adapters/browser/wikipedia.md +30 -0
- package/docs/adapters/browser/xiaohongshu.md +5 -1
- package/docs/adapters/desktop/chatgpt.md +3 -3
- package/docs/adapters/index.md +13 -0
- package/docs/advanced/download.md +4 -4
- package/docs/developer/architecture.md +17 -4
- package/package.json +1 -1
- package/scripts/check-doc-coverage.sh +69 -0
- package/scripts/copy-yaml.cjs +7 -0
- package/src/browser/cdp.ts +6 -1
- package/src/browser/page.ts +7 -1
- package/src/build-manifest.ts +25 -19
- package/src/cli.ts +218 -139
- package/src/clis/apple-podcasts/commands.test.ts +95 -0
- package/src/clis/apple-podcasts/search.ts +2 -2
- package/src/clis/apple-podcasts/top.ts +12 -2
- package/src/clis/arxiv/search.ts +1 -1
- package/src/clis/bilibili/dynamic.ts +1 -1
- package/src/clis/bilibili/favorite.ts +1 -1
- package/src/clis/bilibili/feed.ts +1 -1
- package/src/clis/bilibili/following.ts +1 -1
- package/src/clis/bilibili/history.ts +1 -1
- package/src/clis/bilibili/me.ts +1 -1
- package/src/clis/bilibili/ranking.ts +1 -1
- package/src/clis/bilibili/search.ts +3 -3
- package/src/clis/bilibili/subtitle.ts +1 -1
- package/src/clis/bilibili/user-videos.ts +1 -1
- package/src/{bilibili.ts → clis/bilibili/utils.ts} +1 -1
- package/src/clis/bloomberg/businessweek.ts +18 -0
- package/src/clis/bloomberg/economics.ts +18 -0
- package/src/clis/bloomberg/feeds.ts +16 -0
- package/src/clis/bloomberg/industries.ts +18 -0
- package/src/clis/bloomberg/main.ts +18 -0
- package/src/clis/bloomberg/markets.ts +18 -0
- package/src/clis/bloomberg/news.ts +136 -0
- package/src/clis/bloomberg/opinions.ts +18 -0
- package/src/clis/bloomberg/politics.ts +18 -0
- package/src/clis/bloomberg/tech.ts +18 -0
- package/src/clis/bloomberg/utils.test.ts +135 -0
- package/src/clis/bloomberg/utils.ts +429 -0
- package/src/clis/boss/batchgreet.ts +2 -2
- package/src/clis/boss/chatlist.ts +2 -2
- package/src/clis/boss/detail.ts +2 -2
- package/src/clis/boss/greet.ts +4 -4
- package/src/clis/boss/search.ts +1 -1
- package/src/clis/boss/send.ts +1 -1
- package/src/clis/boss/stats.ts +2 -2
- package/src/clis/chaoxing/assignments.ts +1 -1
- package/src/clis/chaoxing/exams.ts +1 -1
- package/src/{chaoxing.test.ts → clis/chaoxing/utils.test.ts} +1 -1
- package/src/{chaoxing.ts → clis/chaoxing/utils.ts} +1 -3
- package/src/clis/chatgpt/README.zh-CN.md +3 -3
- package/src/clis/chatgpt/read.ts +1 -1
- package/src/clis/chatwise/export.ts +1 -1
- package/src/clis/chatwise/model.ts +2 -2
- package/src/clis/chatwise/screenshot.ts +1 -1
- package/src/clis/codex/export.ts +1 -1
- package/src/clis/codex/model.ts +2 -2
- package/src/clis/codex/screenshot.ts +1 -1
- package/src/clis/coupang/add-to-cart.ts +3 -4
- package/src/clis/coupang/search.ts +2 -4
- package/src/{coupang.test.ts → clis/coupang/utils.test.ts} +1 -1
- package/src/clis/ctrip/search.ts +1 -1
- package/src/clis/cursor/export.ts +1 -1
- package/src/clis/cursor/model.ts +2 -2
- package/src/clis/cursor/screenshot.ts +1 -1
- package/src/clis/jike/comment.ts +2 -3
- package/src/clis/jike/create.ts +1 -2
- package/src/clis/jike/feed.ts +0 -1
- package/src/clis/jike/like.ts +1 -2
- package/src/clis/jike/notifications.ts +0 -1
- package/src/clis/jike/post.yaml +1 -0
- package/src/clis/jike/repost.ts +1 -2
- package/src/clis/jike/search.ts +2 -3
- package/src/clis/jike/topic.yaml +1 -0
- package/src/clis/jike/user.yaml +1 -0
- package/src/clis/jimeng/history.yaml +0 -1
- package/src/clis/linkedin/search.ts +7 -7
- package/src/clis/linux-do/category.yaml +1 -0
- package/src/clis/linux-do/search.yaml +4 -3
- package/src/clis/linux-do/topic.yaml +1 -0
- package/src/clis/notion/export.ts +1 -1
- package/src/clis/reddit/comment.ts +3 -4
- package/src/clis/reddit/read.ts +4 -5
- package/src/clis/reddit/save.ts +2 -3
- package/src/clis/reddit/saved.ts +0 -1
- package/src/clis/reddit/search.yaml +1 -0
- package/src/clis/reddit/subscribe.ts +0 -1
- package/src/clis/reddit/upvote.ts +2 -3
- package/src/clis/reddit/upvoted.ts +0 -1
- package/src/clis/reddit/user-comments.yaml +1 -0
- package/src/clis/reddit/user-posts.yaml +1 -0
- package/src/clis/reddit/user.yaml +1 -0
- package/src/clis/reuters/search.ts +1 -1
- package/src/clis/smzdm/search.ts +2 -3
- package/src/clis/stackoverflow/search.yaml +1 -0
- package/src/clis/steam/top-sellers.yaml +29 -0
- package/src/clis/twitter/accept.ts +2 -2
- package/src/clis/twitter/article.ts +2 -2
- package/src/clis/twitter/block.ts +92 -0
- package/src/clis/twitter/delete.ts +1 -1
- package/src/clis/twitter/hide-reply.ts +70 -0
- package/src/clis/twitter/like.ts +1 -1
- package/src/clis/twitter/post.ts +1 -1
- package/src/clis/twitter/reply-dm.ts +1 -1
- package/src/clis/twitter/reply.ts +2 -2
- package/src/clis/twitter/search.ts +1 -1
- package/src/clis/twitter/thread.ts +2 -2
- package/src/clis/twitter/trending.ts +113 -0
- package/src/clis/twitter/unblock.ts +75 -0
- package/src/clis/v2ex/topic.yaml +1 -0
- package/src/clis/weibo/hot.ts +0 -1
- package/src/clis/weread/book.ts +1 -1
- package/src/clis/weread/highlights.ts +1 -1
- package/src/clis/weread/notes.ts +1 -1
- package/src/clis/weread/search.ts +1 -1
- package/src/clis/wikipedia/search.ts +1 -1
- package/src/clis/xiaohongshu/creator-note-detail.test.ts +82 -33
- package/src/clis/xiaohongshu/creator-note-detail.ts +89 -5
- package/src/clis/xiaohongshu/creator-notes.test.ts +39 -6
- package/src/clis/xiaohongshu/creator-notes.ts +44 -5
- package/src/clis/xiaohongshu/creator-profile.ts +0 -1
- package/src/clis/xiaohongshu/creator-stats.ts +0 -1
- package/src/clis/xiaohongshu/download.ts +2 -3
- package/src/clis/xiaohongshu/feed.yaml +0 -1
- package/src/clis/xiaohongshu/notifications.yaml +0 -1
- package/src/clis/xiaohongshu/search.ts +2 -2
- package/src/clis/xiaohongshu/user.ts +1 -2
- package/src/clis/yahoo-finance/quote.ts +0 -1
- package/src/clis/youtube/search.ts +1 -1
- package/src/clis/youtube/transcript.ts +1 -1
- package/src/clis/youtube/video.ts +1 -1
- package/src/clis/zhihu/download.ts +1 -2
- package/src/clis/zhihu/question.ts +1 -1
- package/src/clis/zhihu/search.yaml +4 -3
- package/src/commanderAdapter.ts +113 -0
- package/src/{engine.ts → discovery.ts} +1 -108
- package/src/download/index.ts +21 -54
- package/src/engine.test.ts +8 -7
- package/src/execution.ts +138 -0
- package/src/explore.ts +135 -109
- package/src/external-clis.yaml +9 -0
- package/src/external.ts +15 -12
- package/src/main.ts +1 -1
- package/src/pipeline/steps/browser.ts +7 -2
- package/src/registry.ts +5 -0
- package/src/runtime.ts +9 -0
- package/src/serialization.ts +79 -0
- package/src/types.ts +1 -1
- package/tests/e2e/browser-public.test.ts +25 -0
- package/tests/e2e/public-commands.test.ts +55 -1
- package/dist/clis/twitter/trending.yaml +0 -46
- package/docs/public/CNAME +0 -1
- package/src/clis/twitter/trending.yaml +0 -46
- /package/dist/{bilibili.js → clis/bilibili/utils.js} +0 -0
- /package/dist/{chaoxing.test.d.ts → clis/bloomberg/businessweek.d.ts} +0 -0
- /package/dist/{coupang.test.d.ts → clis/bloomberg/economics.d.ts} +0 -0
- /package/dist/{coupang.d.ts → clis/coupang/utils.d.ts} +0 -0
- /package/dist/{coupang.js → clis/coupang/utils.js} +0 -0
- /package/src/{coupang.ts → clis/coupang/utils.ts} +0 -0
|
@@ -4,7 +4,7 @@ import { getVisibleChatMessages } from './ax.js';
|
|
|
4
4
|
export const readCommand = cli({
|
|
5
5
|
site: 'chatgpt',
|
|
6
6
|
name: 'read',
|
|
7
|
-
description: '
|
|
7
|
+
description: 'Read the last visible message from the focused ChatGPT Desktop window',
|
|
8
8
|
domain: 'localhost',
|
|
9
9
|
strategy: Strategy.PUBLIC,
|
|
10
10
|
browser: false,
|
|
@@ -8,7 +8,7 @@ export const exportCommand = cli({
|
|
|
8
8
|
strategy: Strategy.UI,
|
|
9
9
|
browser: true,
|
|
10
10
|
args: [
|
|
11
|
-
{ name: 'output', required: false,
|
|
11
|
+
{ name: 'output', required: false, help: 'Output file (default: /tmp/chatwise-export.md)' },
|
|
12
12
|
],
|
|
13
13
|
columns: ['Status', 'File', 'Messages'],
|
|
14
14
|
func: async (page, kwargs) => {
|
|
@@ -7,11 +7,11 @@ export const modelCommand = cli({
|
|
|
7
7
|
strategy: Strategy.UI,
|
|
8
8
|
browser: true,
|
|
9
9
|
args: [
|
|
10
|
-
{ name: '
|
|
10
|
+
{ name: 'model-name', required: false, positional: true, help: 'Model to switch to (e.g. gpt-4, claude-3)' },
|
|
11
11
|
],
|
|
12
12
|
columns: ['Status', 'Model'],
|
|
13
13
|
func: async (page, kwargs) => {
|
|
14
|
-
const desiredModel = kwargs
|
|
14
|
+
const desiredModel = kwargs['model-name'];
|
|
15
15
|
if (!desiredModel) {
|
|
16
16
|
// Read current model
|
|
17
17
|
const currentModel = await page.evaluate(`
|
|
@@ -8,7 +8,7 @@ export const screenshotCommand = cli({
|
|
|
8
8
|
strategy: Strategy.UI,
|
|
9
9
|
browser: true,
|
|
10
10
|
args: [
|
|
11
|
-
{ name: 'output', required: false,
|
|
11
|
+
{ name: 'output', required: false, help: 'Output file path (default: /tmp/chatwise-snapshot)' },
|
|
12
12
|
],
|
|
13
13
|
columns: ['Status', 'File'],
|
|
14
14
|
func: async (page, kwargs) => {
|
|
@@ -8,7 +8,7 @@ export const exportCommand = cli({
|
|
|
8
8
|
strategy: Strategy.UI,
|
|
9
9
|
browser: true,
|
|
10
10
|
args: [
|
|
11
|
-
{ name: 'output', required: false,
|
|
11
|
+
{ name: 'output', required: false, help: 'Output file (default: /tmp/codex-export.md)' },
|
|
12
12
|
],
|
|
13
13
|
columns: ['Status', 'File', 'Messages'],
|
|
14
14
|
func: async (page, kwargs) => {
|
package/dist/clis/codex/model.js
CHANGED
|
@@ -7,11 +7,11 @@ export const modelCommand = cli({
|
|
|
7
7
|
strategy: Strategy.UI,
|
|
8
8
|
browser: true,
|
|
9
9
|
args: [
|
|
10
|
-
{ name: '
|
|
10
|
+
{ name: 'model-name', required: false, positional: true, help: 'The ID of the model to switch to (e.g. gpt-4)' }
|
|
11
11
|
],
|
|
12
12
|
columns: ['Status', 'Model'],
|
|
13
13
|
func: async (page, kwargs) => {
|
|
14
|
-
const desiredModel = kwargs
|
|
14
|
+
const desiredModel = kwargs['model-name'];
|
|
15
15
|
if (!desiredModel) {
|
|
16
16
|
// Just read the current model. We traverse iframes/webviews if needed.
|
|
17
17
|
const currentModel = await page.evaluate(`
|
|
@@ -8,7 +8,7 @@ export const screenshotCommand = cli({
|
|
|
8
8
|
strategy: Strategy.UI,
|
|
9
9
|
browser: true,
|
|
10
10
|
args: [
|
|
11
|
-
{ name: 'output', required: false,
|
|
11
|
+
{ name: 'output', required: false, help: 'Output file path (default: /tmp/codex-snapshot.txt)' },
|
|
12
12
|
],
|
|
13
13
|
columns: ['Status', 'File'],
|
|
14
14
|
func: async (page, kwargs) => {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { cli, Strategy } from '../../registry.js';
|
|
2
|
-
import { canonicalizeProductUrl, normalizeProductId } from '
|
|
2
|
+
import { canonicalizeProductUrl, normalizeProductId } from './utils.js';
|
|
3
3
|
function escapeJsString(value) {
|
|
4
4
|
return JSON.stringify(value);
|
|
5
5
|
}
|
|
@@ -99,12 +99,12 @@ cli({
|
|
|
99
99
|
strategy: Strategy.COOKIE,
|
|
100
100
|
browser: true,
|
|
101
101
|
args: [
|
|
102
|
-
{ name: '
|
|
102
|
+
{ name: 'product-id', required: false, help: 'Coupang product ID' },
|
|
103
103
|
{ name: 'url', required: false, help: 'Canonical product URL' },
|
|
104
104
|
],
|
|
105
105
|
columns: ['ok', 'product_id', 'url', 'message'],
|
|
106
106
|
func: async (page, kwargs) => {
|
|
107
|
-
const rawProductId = kwargs
|
|
107
|
+
const rawProductId = kwargs['product-id'] ?? kwargs['product-id'];
|
|
108
108
|
const productId = normalizeProductId(rawProductId);
|
|
109
109
|
const targetUrl = canonicalizeProductUrl(kwargs.url, productId);
|
|
110
110
|
if (!productId && !targetUrl) {
|
|
@@ -112,7 +112,6 @@ cli({
|
|
|
112
112
|
}
|
|
113
113
|
const finalUrl = targetUrl || canonicalizeProductUrl('', productId);
|
|
114
114
|
await page.goto(finalUrl);
|
|
115
|
-
await page.wait(3);
|
|
116
115
|
const result = await page.evaluate(buildAddToCartEvaluate(productId));
|
|
117
116
|
const loginHints = result?.loginHints ?? {};
|
|
118
117
|
if (loginHints.hasLoginLink && !loginHints.hasMyCoupang) {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { cli, Strategy } from '../../registry.js';
|
|
2
|
-
import { mergeSearchItems, normalizeSearchItem, sanitizeSearchItems } from '
|
|
2
|
+
import { mergeSearchItems, normalizeSearchItem, sanitizeSearchItems } from './utils.js';
|
|
3
3
|
function escapeJsString(value) {
|
|
4
4
|
return JSON.stringify(value);
|
|
5
5
|
}
|
|
@@ -404,7 +404,7 @@ cli({
|
|
|
404
404
|
strategy: Strategy.COOKIE,
|
|
405
405
|
browser: true,
|
|
406
406
|
args: [
|
|
407
|
-
{ name: 'query', required: true, help: 'Search keyword' },
|
|
407
|
+
{ name: 'query', required: true, positional: true, help: 'Search keyword' },
|
|
408
408
|
{ name: 'page', type: 'int', default: 1, help: 'Search result page number' },
|
|
409
409
|
{ name: 'limit', type: 'int', default: 20, help: 'Max results (max 50)' },
|
|
410
410
|
{ name: 'filter', required: false, help: 'Optional search filter (currently supports: rocket)' },
|
|
@@ -420,7 +420,6 @@ cli({
|
|
|
420
420
|
const initialPage = filter ? 1 : pageNumber;
|
|
421
421
|
const url = `https://www.coupang.com/np/search?q=${encodeURIComponent(query)}&channel=user&page=${initialPage}`;
|
|
422
422
|
await page.goto(url);
|
|
423
|
-
await page.wait(3);
|
|
424
423
|
if (filter) {
|
|
425
424
|
const filterResult = await page.evaluate(buildApplyFilterEvaluate(filter));
|
|
426
425
|
if (!filterResult?.ok) {
|
|
@@ -432,7 +431,6 @@ cli({
|
|
|
432
431
|
const filteredUrl = new URL(locationInfo?.href || url);
|
|
433
432
|
filteredUrl.searchParams.set('page', String(pageNumber));
|
|
434
433
|
await page.goto(filteredUrl.toString());
|
|
435
|
-
await page.wait(3);
|
|
436
434
|
}
|
|
437
435
|
}
|
|
438
436
|
await page.autoScroll({ times: filter ? 3 : 2, delayMs: 1500 });
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { describe, expect, it } from 'vitest';
|
|
2
|
-
import { canonicalizeProductUrl, dedupeSearchItems, normalizeProductId, normalizeSearchItem, sanitizeSearchItems, } from './
|
|
2
|
+
import { canonicalizeProductUrl, dedupeSearchItems, normalizeProductId, normalizeSearchItem, sanitizeSearchItems, } from './utils.js';
|
|
3
3
|
describe('normalizeProductId', () => {
|
|
4
4
|
it('extracts product id from canonical path', () => {
|
|
5
5
|
expect(normalizeProductId('https://www.coupang.com/vp/products/123456789')).toBe('123456789');
|
|
@@ -10,7 +10,7 @@ cli({
|
|
|
10
10
|
domain: 'www.ctrip.com',
|
|
11
11
|
strategy: Strategy.COOKIE,
|
|
12
12
|
args: [
|
|
13
|
-
{ name: 'query', required: true, help: 'Search keyword (city or attraction)' },
|
|
13
|
+
{ name: 'query', required: true, positional: true, help: 'Search keyword (city or attraction)' },
|
|
14
14
|
{ name: 'limit', type: 'int', default: 15, help: 'Number of results' },
|
|
15
15
|
],
|
|
16
16
|
columns: ['rank', 'name', 'type', 'score', 'price', 'url'],
|
|
@@ -9,7 +9,7 @@ function makeExportCommand(site, readSelector) {
|
|
|
9
9
|
strategy: Strategy.UI,
|
|
10
10
|
browser: true,
|
|
11
11
|
args: [
|
|
12
|
-
{ name: 'output', required: false,
|
|
12
|
+
{ name: 'output', required: false, help: `Output file (default: /tmp/${site}-export.md)` },
|
|
13
13
|
],
|
|
14
14
|
columns: ['Status', 'File', 'Messages'],
|
|
15
15
|
func: async (page, kwargs) => {
|
|
@@ -7,11 +7,11 @@ export const modelCommand = cli({
|
|
|
7
7
|
strategy: Strategy.UI,
|
|
8
8
|
browser: true,
|
|
9
9
|
args: [
|
|
10
|
-
{ name: '
|
|
10
|
+
{ name: 'model-name', required: false, positional: true, help: 'The ID of the model to switch to (e.g. claude-3.5-sonnet)' }
|
|
11
11
|
],
|
|
12
12
|
columns: ['Status', 'Model'],
|
|
13
13
|
func: async (page, kwargs) => {
|
|
14
|
-
const desiredModel = kwargs
|
|
14
|
+
const desiredModel = kwargs['model-name'];
|
|
15
15
|
if (!desiredModel) {
|
|
16
16
|
// Just read the current model
|
|
17
17
|
const currentModel = await page.evaluate(`
|
|
@@ -9,7 +9,7 @@ function makeScreenshotCommand(site) {
|
|
|
9
9
|
strategy: Strategy.UI,
|
|
10
10
|
browser: true,
|
|
11
11
|
args: [
|
|
12
|
-
{ name: 'output', required: false,
|
|
12
|
+
{ name: 'output', required: false, help: `Output file path (default: /tmp/${site}-snapshot.txt)` },
|
|
13
13
|
],
|
|
14
14
|
columns: ['Status', 'File'],
|
|
15
15
|
func: async (page, kwargs) => {
|
|
@@ -13,13 +13,12 @@ cli({
|
|
|
13
13
|
strategy: Strategy.UI,
|
|
14
14
|
browser: true,
|
|
15
15
|
args: [
|
|
16
|
-
{ name: 'id', type: 'string', required: true, help: '帖子 ID' },
|
|
17
|
-
{ name: 'text', type: 'string', required: true, help: '评论内容' },
|
|
16
|
+
{ name: 'id', type: 'string', required: true, positional: true, help: '帖子 ID' },
|
|
17
|
+
{ name: 'text', type: 'string', required: true, positional: true, help: '评论内容' },
|
|
18
18
|
],
|
|
19
19
|
columns: ['status', 'message'],
|
|
20
20
|
func: async (page, kwargs) => {
|
|
21
21
|
await page.goto(`https://web.okjike.com/originalPost/${kwargs.id}`);
|
|
22
|
-
await page.wait(5);
|
|
23
22
|
// 1. 找到评论输入框并填入文本
|
|
24
23
|
const inputResult = await page.evaluate(`(async () => {
|
|
25
24
|
try {
|
package/dist/clis/jike/create.js
CHANGED
|
@@ -13,13 +13,12 @@ cli({
|
|
|
13
13
|
strategy: Strategy.UI,
|
|
14
14
|
browser: true,
|
|
15
15
|
args: [
|
|
16
|
-
{ name: 'text', type: 'string', required: true, help: '动态正文内容' },
|
|
16
|
+
{ name: 'text', type: 'string', required: true, positional: true, help: '动态正文内容' },
|
|
17
17
|
],
|
|
18
18
|
columns: ['status', 'message'],
|
|
19
19
|
func: async (page, kwargs) => {
|
|
20
20
|
// 1. 导航到首页(有内联发帖框)
|
|
21
21
|
await page.goto('https://web.okjike.com');
|
|
22
|
-
await page.wait(5);
|
|
23
22
|
// 2. 在发帖框中输入文本
|
|
24
23
|
const textResult = await page.evaluate(`(async () => {
|
|
25
24
|
try {
|
package/dist/clis/jike/feed.js
CHANGED
package/dist/clis/jike/like.js
CHANGED
|
@@ -13,13 +13,12 @@ cli({
|
|
|
13
13
|
strategy: Strategy.UI,
|
|
14
14
|
browser: true,
|
|
15
15
|
args: [
|
|
16
|
-
{ name: 'id', type: 'string', required: true, help: '帖子 ID' },
|
|
16
|
+
{ name: 'id', type: 'string', required: true, positional: true, help: '帖子 ID' },
|
|
17
17
|
],
|
|
18
18
|
columns: ['status', 'message'],
|
|
19
19
|
func: async (page, kwargs) => {
|
|
20
20
|
// 1. 导航到帖子详情页
|
|
21
21
|
await page.goto(`https://web.okjike.com/originalPost/${kwargs.id}`);
|
|
22
|
-
await page.wait(5);
|
|
23
22
|
// 2. 找到点赞按钮并点击
|
|
24
23
|
const result = await page.evaluate(`(async () => {
|
|
25
24
|
try {
|
|
@@ -33,7 +33,6 @@ cli({
|
|
|
33
33
|
const limit = kwargs.limit || 20;
|
|
34
34
|
// 1. 直接导航到通知页
|
|
35
35
|
await page.goto('https://web.okjike.com/notification');
|
|
36
|
-
await page.wait(5);
|
|
37
36
|
// 3. 优先用 React fiber 提取通知数据
|
|
38
37
|
// 通知 fiber 数据结构与帖子不同,需查找含 type + user 字段的 props
|
|
39
38
|
const fiberResults = (await page.evaluate(`(() => {
|
package/dist/clis/jike/post.yaml
CHANGED
package/dist/clis/jike/repost.js
CHANGED
|
@@ -14,13 +14,12 @@ cli({
|
|
|
14
14
|
strategy: Strategy.UI,
|
|
15
15
|
browser: true,
|
|
16
16
|
args: [
|
|
17
|
-
{ name: 'id', type: 'string', required: true, help: '帖子 ID' },
|
|
17
|
+
{ name: 'id', type: 'string', required: true, positional: true, help: '帖子 ID' },
|
|
18
18
|
{ name: 'text', type: 'string', required: false, help: '转发附言(可选)' },
|
|
19
19
|
],
|
|
20
20
|
columns: ['status', 'message'],
|
|
21
21
|
func: async (page, kwargs) => {
|
|
22
22
|
await page.goto(`https://web.okjike.com/originalPost/${kwargs.id}`);
|
|
23
|
-
await page.wait(5);
|
|
24
23
|
// 1. 点击操作栏中的转发按钮(第三个子元素)
|
|
25
24
|
const clickResult = await page.evaluate(`(async () => {
|
|
26
25
|
try {
|
package/dist/clis/jike/search.js
CHANGED
|
@@ -14,17 +14,16 @@ cli({
|
|
|
14
14
|
strategy: Strategy.COOKIE,
|
|
15
15
|
browser: true,
|
|
16
16
|
args: [
|
|
17
|
-
{ name: '
|
|
17
|
+
{ name: 'query', type: 'string', required: true, positional: true },
|
|
18
18
|
{ name: 'limit', type: 'int', default: 20 },
|
|
19
19
|
],
|
|
20
20
|
columns: ['author', 'content', 'likes', 'comments', 'time', 'url'],
|
|
21
21
|
func: async (page, kwargs) => {
|
|
22
|
-
const keyword = kwargs.
|
|
22
|
+
const keyword = kwargs.query;
|
|
23
23
|
const limit = kwargs.limit || 20;
|
|
24
24
|
// 1. 直接导航到搜索页
|
|
25
25
|
const encodedKeyword = encodeURIComponent(keyword);
|
|
26
26
|
await page.goto(`https://web.okjike.com/search?q=${encodedKeyword}`);
|
|
27
|
-
await page.wait(5);
|
|
28
27
|
// 2. 通过 React fiber 提取帖子数据
|
|
29
28
|
const extract = async () => {
|
|
30
29
|
return (await page.evaluate(`(() => {
|
package/dist/clis/jike/user.yaml
CHANGED
|
@@ -321,15 +321,15 @@ cli({
|
|
|
321
321
|
strategy: Strategy.HEADER,
|
|
322
322
|
browser: true,
|
|
323
323
|
args: [
|
|
324
|
-
{ name: 'query', type: 'string', required: true, help: 'Job search keywords' },
|
|
324
|
+
{ name: 'query', type: 'string', required: true, positional: true, help: 'Job search keywords' },
|
|
325
325
|
{ name: 'location', type: 'string', required: false, help: 'Location text such as San Francisco Bay Area' },
|
|
326
326
|
{ name: 'limit', type: 'int', default: 10, help: 'Number of jobs to return (max 100)' },
|
|
327
327
|
{ name: 'start', type: 'int', default: 0, help: 'Result offset for pagination' },
|
|
328
328
|
{ name: 'details', type: 'bool', default: false, help: 'Include full job description and apply URL (slower)' },
|
|
329
329
|
{ name: 'company', type: 'string', required: false, help: 'Comma-separated company names or LinkedIn company IDs' },
|
|
330
|
-
{ name: '
|
|
331
|
-
{ name: '
|
|
332
|
-
{ name: '
|
|
330
|
+
{ name: 'experience-level', type: 'string', required: false, help: 'Comma-separated: internship, entry, associate, mid-senior, director, executive' },
|
|
331
|
+
{ name: 'job-type', type: 'string', required: false, help: 'Comma-separated: full-time, part-time, contract, temporary, volunteer, internship, other' },
|
|
332
|
+
{ name: 'date-posted', type: 'string', required: false, help: 'One of: any, month, week, 24h' },
|
|
333
333
|
{ name: 'remote', type: 'string', required: false, help: 'Comma-separated: on-site, hybrid, remote' },
|
|
334
334
|
],
|
|
335
335
|
columns: ['rank', 'title', 'company', 'location', 'listed', 'salary', 'url'],
|
|
@@ -353,9 +353,9 @@ cli({
|
|
|
353
353
|
limit,
|
|
354
354
|
start,
|
|
355
355
|
companyIds,
|
|
356
|
-
experienceLevels: mapFilterValues(kwargs
|
|
357
|
-
jobTypes: mapFilterValues(kwargs
|
|
358
|
-
datePostedValues: mapFilterValues(kwargs
|
|
356
|
+
experienceLevels: mapFilterValues(kwargs['experience-level'], EXPERIENCE_LEVELS, 'experience_level'),
|
|
357
|
+
jobTypes: mapFilterValues(kwargs['job-type'], JOB_TYPES, 'job_type'),
|
|
358
|
+
datePostedValues: mapFilterValues(kwargs['date-posted'], DATE_POSTED, 'date_posted'),
|
|
359
359
|
remoteTypes: mapFilterValues(kwargs.remote, REMOTE_TYPES, 'remote'),
|
|
360
360
|
};
|
|
361
361
|
const data = await fetchJobCards(page, input);
|
|
@@ -5,10 +5,11 @@ domain: linux.do
|
|
|
5
5
|
browser: true
|
|
6
6
|
|
|
7
7
|
args:
|
|
8
|
-
|
|
8
|
+
query:
|
|
9
|
+
positional: true
|
|
9
10
|
type: str
|
|
10
11
|
required: true
|
|
11
|
-
description: Search
|
|
12
|
+
description: Search query
|
|
12
13
|
limit:
|
|
13
14
|
type: int
|
|
14
15
|
default: 20
|
|
@@ -19,7 +20,7 @@ pipeline:
|
|
|
19
20
|
|
|
20
21
|
- evaluate: |
|
|
21
22
|
(async () => {
|
|
22
|
-
const keyword = ${{ args.
|
|
23
|
+
const keyword = ${{ args.query | json }};
|
|
23
24
|
const res = await fetch('/search.json?q=' + encodeURIComponent(keyword), { credentials: 'include' });
|
|
24
25
|
if (!res.ok) throw new Error('HTTP ' + res.status + ' - 请先登录 linux.do');
|
|
25
26
|
let data;
|
|
@@ -8,7 +8,7 @@ export const exportCommand = cli({
|
|
|
8
8
|
strategy: Strategy.UI,
|
|
9
9
|
browser: true,
|
|
10
10
|
args: [
|
|
11
|
-
{ name: 'output', required: false,
|
|
11
|
+
{ name: 'output', required: false, help: 'Output file (default: /tmp/notion-export.md)' },
|
|
12
12
|
],
|
|
13
13
|
columns: ['Status', 'File'],
|
|
14
14
|
func: async (page, kwargs) => {
|
|
@@ -7,18 +7,17 @@ cli({
|
|
|
7
7
|
strategy: Strategy.COOKIE,
|
|
8
8
|
browser: true,
|
|
9
9
|
args: [
|
|
10
|
-
{ name: '
|
|
11
|
-
{ name: 'text', type: 'string', required: true, help: 'Comment text' },
|
|
10
|
+
{ name: 'post-id', type: 'string', required: true, help: 'Post ID (e.g. 1abc123) or fullname (t3_xxx)' },
|
|
11
|
+
{ name: 'text', type: 'string', required: true, positional: true, help: 'Comment text' },
|
|
12
12
|
],
|
|
13
13
|
columns: ['status', 'message'],
|
|
14
14
|
func: async (page, kwargs) => {
|
|
15
15
|
if (!page)
|
|
16
16
|
throw new Error('Requires browser');
|
|
17
17
|
await page.goto('https://www.reddit.com');
|
|
18
|
-
await page.wait(3);
|
|
19
18
|
const result = await page.evaluate(`(async () => {
|
|
20
19
|
try {
|
|
21
|
-
let postId = ${JSON.stringify(kwargs
|
|
20
|
+
let postId = ${JSON.stringify(kwargs['post-id'])};
|
|
22
21
|
const urlMatch = postId.match(/comments\\/([a-z0-9]+)/);
|
|
23
22
|
if (urlMatch) postId = urlMatch[1];
|
|
24
23
|
const fullname = postId.startsWith('t3_') || postId.startsWith('t1_')
|
package/dist/clis/reddit/read.js
CHANGED
|
@@ -14,12 +14,12 @@ cli({
|
|
|
14
14
|
domain: 'reddit.com',
|
|
15
15
|
strategy: Strategy.COOKIE,
|
|
16
16
|
args: [
|
|
17
|
-
{ name: '
|
|
17
|
+
{ name: 'post-id', required: true, help: 'Post ID (e.g. 1abc123) or full URL' },
|
|
18
18
|
{ name: 'sort', default: 'best', help: 'Comment sort: best, top, new, controversial, old, qa' },
|
|
19
19
|
{ name: 'limit', type: 'int', default: 25, help: 'Number of top-level comments' },
|
|
20
20
|
{ name: 'depth', type: 'int', default: 2, help: 'Max reply depth (1=no replies, 2=one level of replies, etc.)' },
|
|
21
21
|
{ name: 'replies', type: 'int', default: 5, help: 'Max replies shown per comment at each level (sorted by score)' },
|
|
22
|
-
{ name: '
|
|
22
|
+
{ name: 'max-length', type: 'int', default: 2000, help: 'Max characters per comment body (min 100)' },
|
|
23
23
|
],
|
|
24
24
|
columns: ['type', 'author', 'score', 'text'],
|
|
25
25
|
func: async (page, kwargs) => {
|
|
@@ -27,12 +27,11 @@ cli({
|
|
|
27
27
|
const limit = Math.max(1, kwargs.limit ?? 25);
|
|
28
28
|
const maxDepth = Math.max(1, kwargs.depth ?? 2);
|
|
29
29
|
const maxReplies = Math.max(1, kwargs.replies ?? 5);
|
|
30
|
-
const maxLength = Math.max(100, kwargs
|
|
30
|
+
const maxLength = Math.max(100, kwargs['max-length'] ?? 2000);
|
|
31
31
|
await page.goto('https://www.reddit.com');
|
|
32
|
-
await page.wait(2);
|
|
33
32
|
const data = await page.evaluate(`
|
|
34
33
|
(async function() {
|
|
35
|
-
var postId = ${JSON.stringify(kwargs
|
|
34
|
+
var postId = ${JSON.stringify(kwargs['post-id'])};
|
|
36
35
|
var urlMatch = postId.match(/comments\\/([a-z0-9]+)/);
|
|
37
36
|
if (urlMatch) postId = urlMatch[1];
|
|
38
37
|
|
package/dist/clis/reddit/save.js
CHANGED
|
@@ -7,7 +7,7 @@ cli({
|
|
|
7
7
|
strategy: Strategy.COOKIE,
|
|
8
8
|
browser: true,
|
|
9
9
|
args: [
|
|
10
|
-
{ name: '
|
|
10
|
+
{ name: 'post-id', type: 'string', required: true, help: 'Post ID (e.g. 1abc123) or fullname (t3_xxx)' },
|
|
11
11
|
{ name: 'undo', type: 'boolean', default: false, help: 'Unsave instead of save' },
|
|
12
12
|
],
|
|
13
13
|
columns: ['status', 'message'],
|
|
@@ -15,10 +15,9 @@ cli({
|
|
|
15
15
|
if (!page)
|
|
16
16
|
throw new Error('Requires browser');
|
|
17
17
|
await page.goto('https://www.reddit.com');
|
|
18
|
-
await page.wait(3);
|
|
19
18
|
const result = await page.evaluate(`(async () => {
|
|
20
19
|
try {
|
|
21
|
-
let postId = ${JSON.stringify(kwargs
|
|
20
|
+
let postId = ${JSON.stringify(kwargs['post-id'])};
|
|
22
21
|
const urlMatch = postId.match(/comments\\/([a-z0-9]+)/);
|
|
23
22
|
if (urlMatch) postId = urlMatch[1];
|
|
24
23
|
const fullname = postId.startsWith('t3_') || postId.startsWith('t1_')
|
|
@@ -7,7 +7,7 @@ cli({
|
|
|
7
7
|
strategy: Strategy.COOKIE,
|
|
8
8
|
browser: true,
|
|
9
9
|
args: [
|
|
10
|
-
{ name: '
|
|
10
|
+
{ name: 'post-id', type: 'string', required: true, help: 'Post ID (e.g. 1abc123) or fullname (t3_xxx)' },
|
|
11
11
|
{ name: 'direction', type: 'string', default: 'up', help: 'Vote direction: up, down, none' },
|
|
12
12
|
],
|
|
13
13
|
columns: ['status', 'message'],
|
|
@@ -15,10 +15,9 @@ cli({
|
|
|
15
15
|
if (!page)
|
|
16
16
|
throw new Error('Requires browser');
|
|
17
17
|
await page.goto('https://www.reddit.com');
|
|
18
|
-
await page.wait(3);
|
|
19
18
|
const result = await page.evaluate(`(async () => {
|
|
20
19
|
try {
|
|
21
|
-
let postId = ${JSON.stringify(kwargs
|
|
20
|
+
let postId = ${JSON.stringify(kwargs['post-id'])};
|
|
22
21
|
// Extract ID from URL if needed
|
|
23
22
|
const urlMatch = postId.match(/comments\\/([a-z0-9]+)/);
|
|
24
23
|
if (urlMatch) postId = urlMatch[1];
|
|
@@ -10,7 +10,7 @@ cli({
|
|
|
10
10
|
domain: 'www.reuters.com',
|
|
11
11
|
strategy: Strategy.COOKIE,
|
|
12
12
|
args: [
|
|
13
|
-
{ name: 'query', required: true, help: 'Search query' },
|
|
13
|
+
{ name: 'query', required: true, positional: true, help: 'Search query' },
|
|
14
14
|
{ name: 'limit', type: 'int', default: 10, help: 'Number of results (max 40)' },
|
|
15
15
|
],
|
|
16
16
|
columns: ['rank', 'title', 'date', 'section', 'url'],
|
|
@@ -13,16 +13,15 @@ cli({
|
|
|
13
13
|
domain: 'www.smzdm.com',
|
|
14
14
|
strategy: Strategy.COOKIE,
|
|
15
15
|
args: [
|
|
16
|
-
{ name: '
|
|
16
|
+
{ name: 'query', required: true, positional: true, help: 'Search keyword' },
|
|
17
17
|
{ name: 'limit', type: 'int', default: 20, help: 'Number of results' },
|
|
18
18
|
],
|
|
19
19
|
columns: ['rank', 'title', 'price', 'mall', 'comments', 'url'],
|
|
20
20
|
func: async (page, kwargs) => {
|
|
21
|
-
const q = encodeURIComponent(kwargs.
|
|
21
|
+
const q = encodeURIComponent(kwargs.query);
|
|
22
22
|
const limit = kwargs.limit || 20;
|
|
23
23
|
// Navigate directly to search results page
|
|
24
24
|
await page.goto(`https://search.smzdm.com/?c=home&s=${q}&v=b`);
|
|
25
|
-
await page.wait(2);
|
|
26
25
|
const data = await page.evaluate(`
|
|
27
26
|
(() => {
|
|
28
27
|
const limit = ${limit};
|