@optima-chat/scout-cli 0.1.12 → 0.2.0

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/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Optima Scout CLI
2
2
 
3
- AI-powered Amazon product research tool for Claude Code and LLMs.
3
+ AI-powered Amazon product research and 1688 supplier sourcing tool for Claude Code and LLMs.
4
4
 
5
5
  ## Installation
6
6
 
@@ -14,11 +14,14 @@ npm install -g @optima-chat/scout-cli
14
14
  # Initialize Claude Code skills
15
15
  scout init
16
16
 
17
- # Search products
17
+ # Search Amazon products
18
18
  scout search "coffee maker"
19
19
 
20
20
  # Get product details
21
21
  scout product B01GJOMWVA
22
+
23
+ # Search 1688 suppliers
24
+ scout supplier-search "咖啡机"
22
25
  ```
23
26
 
24
27
  ## Commands
@@ -57,6 +60,20 @@ Get detailed product information.
57
60
  scout product B004YAVF8I --domain amazon.com
58
61
  ```
59
62
 
63
+ ### `scout supplier-search <keyword>`
64
+
65
+ Search for suppliers on 1688.com.
66
+
67
+ **Options:**
68
+ - `-l, --limit <number>` - Result limit (default: `20`, max: `100`)
69
+ - `-f, --format <format>` - Output: `json` | `text`
70
+
71
+ **Example:**
72
+ ```bash
73
+ scout supplier-search "咖啡机" --limit 10
74
+ scout supplier-search "蓝牙耳机" --format json
75
+ ```
76
+
60
77
  ## Configuration
61
78
 
62
79
  Set API endpoint via environment variable:
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const browserCommand: Command;
3
+ //# sourceMappingURL=browser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../../src/commands/browser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC,eAAO,MAAM,cAAc,SAC+B,CAAC"}
@@ -0,0 +1,614 @@
1
+ import { Command } from 'commander';
2
+ import { api } from '../utils/api.js';
3
+ export const browserCommand = new Command('browser')
4
+ .description('Interact with user browser via extension');
5
+ async function queryElements(session, selector, attrs, limit = 200) {
6
+ try {
7
+ const result = await api.post('/api/browser/query', {
8
+ session,
9
+ selector,
10
+ attributes: attrs,
11
+ limit,
12
+ });
13
+ return result;
14
+ }
15
+ catch {
16
+ return [];
17
+ }
18
+ }
19
+ async function downloadMedia(product, outputDir, referer) {
20
+ const fs = await import('fs');
21
+ const path = await import('path');
22
+ const https = await import('https');
23
+ const http = await import('http');
24
+ const downloadFile = (url, destPath) => {
25
+ return new Promise((resolve, reject) => {
26
+ const protocol = url.startsWith('https') ? https : http;
27
+ const file = fs.createWriteStream(destPath);
28
+ protocol
29
+ .get(url, { headers: { 'User-Agent': 'Mozilla/5.0', Referer: referer } }, (response) => {
30
+ if (response.statusCode === 200) {
31
+ response.pipe(file);
32
+ file.on('finish', () => {
33
+ file.close();
34
+ resolve();
35
+ });
36
+ }
37
+ else {
38
+ file.close();
39
+ fs.unlinkSync(destPath);
40
+ reject(new Error(`HTTP ${response.statusCode}`));
41
+ }
42
+ })
43
+ .on('error', (err) => {
44
+ file.close();
45
+ reject(err);
46
+ });
47
+ });
48
+ };
49
+ let imgSuccess = 0;
50
+ for (let i = 0; i < product.images.length; i++) {
51
+ const url = product.images[i];
52
+ const ext = url.includes('.webp') ? 'webp' : url.includes('.png') ? 'png' : 'jpg';
53
+ const imgPath = path.join(outputDir, `image_${String(i + 1).padStart(2, '0')}.${ext}`);
54
+ try {
55
+ await downloadFile(url, imgPath);
56
+ imgSuccess++;
57
+ console.error(` ✓ image_${String(i + 1).padStart(2, '0')}.${ext}`);
58
+ }
59
+ catch (e) {
60
+ console.error(` ✗ image_${String(i + 1).padStart(2, '0')}: ${e}`);
61
+ }
62
+ }
63
+ let vidSuccess = 0;
64
+ for (let i = 0; i < product.videos.length; i++) {
65
+ const url = product.videos[i];
66
+ const vidPath = path.join(outputDir, `video_${String(i + 1).padStart(2, '0')}.mp4`);
67
+ try {
68
+ await downloadFile(url, vidPath);
69
+ vidSuccess++;
70
+ console.error(` ✓ video_${String(i + 1).padStart(2, '0')}.mp4`);
71
+ }
72
+ catch (e) {
73
+ console.error(` ✗ video_${String(i + 1).padStart(2, '0')}: ${e}`);
74
+ }
75
+ }
76
+ return { images: imgSuccess, videos: vidSuccess };
77
+ }
78
+ // ============================================
79
+ // Basic browser commands
80
+ // ============================================
81
+ // Status check
82
+ browserCommand
83
+ .command('status')
84
+ .description('Check browser connection status')
85
+ .option('-s, --session <id>', 'Session ID', process.env.SESSION_ID)
86
+ .action(async (options) => {
87
+ try {
88
+ if (!options.session) {
89
+ console.error(JSON.stringify({ error: 'Session ID is required. Use --session or set SESSION_ID env var.' }));
90
+ process.exit(1);
91
+ }
92
+ const result = await api.get(`/api/browser/status?session=${options.session}`);
93
+ console.log(JSON.stringify(result, null, 2));
94
+ }
95
+ catch (error) {
96
+ console.error(JSON.stringify({ error: error instanceof Error ? error.message : String(error) }));
97
+ process.exit(1);
98
+ }
99
+ });
100
+ // List connections
101
+ browserCommand
102
+ .command('connections')
103
+ .description('List all connected browsers')
104
+ .action(async () => {
105
+ try {
106
+ const result = await api.get('/api/browser/connections');
107
+ console.log(JSON.stringify(result, null, 2));
108
+ }
109
+ catch (error) {
110
+ console.error(JSON.stringify({ error: error instanceof Error ? error.message : String(error) }));
111
+ process.exit(1);
112
+ }
113
+ });
114
+ // Screenshot
115
+ browserCommand
116
+ .command('screenshot')
117
+ .description('Capture current page screenshot and save to file')
118
+ .option('-s, --session <id>', 'Session ID', process.env.SESSION_ID)
119
+ .option('-f, --format <format>', 'Image format (png|jpeg)', 'png')
120
+ .option('-o, --output <path>', 'Output file path (default: ./screenshot-<timestamp>.<format>)')
121
+ .action(async (options) => {
122
+ try {
123
+ if (!options.session) {
124
+ console.error(JSON.stringify({ error: 'Session ID is required. Use --session or set SESSION_ID env var.' }));
125
+ process.exit(1);
126
+ }
127
+ const result = await api.post('/api/browser/screenshot', {
128
+ session: options.session,
129
+ format: options.format,
130
+ });
131
+ const base64Data = result.dataUrl.replace(/^data:image\/\w+;base64,/, '');
132
+ const buffer = Buffer.from(base64Data, 'base64');
133
+ const timestamp = new Date().toISOString().replace(/[:.]/g, '-');
134
+ const outputPath = options.output || `./screenshot-${timestamp}.${options.format}`;
135
+ const fs = await import('fs');
136
+ fs.writeFileSync(outputPath, buffer);
137
+ console.log(JSON.stringify({ success: true, path: outputPath, size: buffer.length }));
138
+ }
139
+ catch (error) {
140
+ console.error(JSON.stringify({ error: error instanceof Error ? error.message : String(error) }));
141
+ process.exit(1);
142
+ }
143
+ });
144
+ // Query elements
145
+ browserCommand
146
+ .command('query <selector>')
147
+ .description('Query page elements using CSS selector')
148
+ .option('-s, --session <id>', 'Session ID', process.env.SESSION_ID)
149
+ .option('-a, --attributes <attrs>', 'Attributes to extract (comma-separated)')
150
+ .option('--schema <json>', 'Extraction schema (JSON format)')
151
+ .option('-l, --limit <n>', 'Maximum number of elements', parseInt)
152
+ .action(async (selector, options) => {
153
+ try {
154
+ if (!options.session) {
155
+ console.error(JSON.stringify({ error: 'Session ID is required. Use --session or set SESSION_ID env var.' }));
156
+ process.exit(1);
157
+ }
158
+ const result = await api.post('/api/browser/query', {
159
+ session: options.session,
160
+ selector,
161
+ attributes: options.attributes?.split(','),
162
+ schema: options.schema ? JSON.parse(options.schema) : undefined,
163
+ limit: options.limit,
164
+ });
165
+ console.log(JSON.stringify(result, null, 2));
166
+ }
167
+ catch (error) {
168
+ console.error(JSON.stringify({ error: error instanceof Error ? error.message : String(error) }));
169
+ process.exit(1);
170
+ }
171
+ });
172
+ // Click element
173
+ browserCommand
174
+ .command('click <selector>')
175
+ .description('Click a page element')
176
+ .option('-s, --session <id>', 'Session ID', process.env.SESSION_ID)
177
+ .option('-i, --index <n>', 'Element index (when multiple matches)', (v) => parseInt(v, 10), 0)
178
+ .action(async (selector, options) => {
179
+ try {
180
+ if (!options.session) {
181
+ console.error(JSON.stringify({ error: 'Session ID is required. Use --session or set SESSION_ID env var.' }));
182
+ process.exit(1);
183
+ }
184
+ const result = await api.post('/api/browser/click', {
185
+ session: options.session,
186
+ selector,
187
+ index: options.index,
188
+ });
189
+ console.log(JSON.stringify(result));
190
+ }
191
+ catch (error) {
192
+ console.error(JSON.stringify({ error: error instanceof Error ? error.message : String(error) }));
193
+ process.exit(1);
194
+ }
195
+ });
196
+ // Scroll page
197
+ browserCommand
198
+ .command('scroll')
199
+ .description('Scroll the page')
200
+ .option('-s, --session <id>', 'Session ID', process.env.SESSION_ID)
201
+ .option('-d, --direction <dir>', 'Direction: up/down/left/right', 'down')
202
+ .option('--distance <px>', 'Distance in pixels', (v) => parseInt(v, 10), 500)
203
+ .action(async (options) => {
204
+ try {
205
+ if (!options.session) {
206
+ console.error(JSON.stringify({ error: 'Session ID is required. Use --session or set SESSION_ID env var.' }));
207
+ process.exit(1);
208
+ }
209
+ const result = await api.post('/api/browser/scroll', {
210
+ session: options.session,
211
+ direction: options.direction,
212
+ distance: options.distance,
213
+ });
214
+ console.log(JSON.stringify(result));
215
+ }
216
+ catch (error) {
217
+ console.error(JSON.stringify({ error: error instanceof Error ? error.message : String(error) }));
218
+ process.exit(1);
219
+ }
220
+ });
221
+ // Navigate
222
+ browserCommand
223
+ .command('navigate <url>')
224
+ .description('Navigate to a URL')
225
+ .option('-s, --session <id>', 'Session ID', process.env.SESSION_ID)
226
+ .action(async (url, options) => {
227
+ try {
228
+ if (!options.session) {
229
+ console.error(JSON.stringify({ error: 'Session ID is required. Use --session or set SESSION_ID env var.' }));
230
+ process.exit(1);
231
+ }
232
+ const result = await api.post('/api/browser/navigate', {
233
+ session: options.session,
234
+ url,
235
+ });
236
+ console.log(JSON.stringify(result));
237
+ }
238
+ catch (error) {
239
+ console.error(JSON.stringify({ error: error instanceof Error ? error.message : String(error) }));
240
+ process.exit(1);
241
+ }
242
+ });
243
+ // Page info
244
+ browserCommand
245
+ .command('page-info')
246
+ .description('Get current page information')
247
+ .option('-s, --session <id>', 'Session ID', process.env.SESSION_ID)
248
+ .action(async (options) => {
249
+ try {
250
+ if (!options.session) {
251
+ console.error(JSON.stringify({ error: 'Session ID is required. Use --session or set SESSION_ID env var.' }));
252
+ process.exit(1);
253
+ }
254
+ const result = await api.post('/api/browser/page-info', {
255
+ session: options.session,
256
+ });
257
+ console.log(JSON.stringify(result, null, 2));
258
+ }
259
+ catch (error) {
260
+ console.error(JSON.stringify({ error: error instanceof Error ? error.message : String(error) }));
261
+ process.exit(1);
262
+ }
263
+ });
264
+ // ============================================
265
+ // Platform-specific scrapers
266
+ // ============================================
267
+ // UI image patterns to filter out (Taobao/Tmall)
268
+ const TAOBAO_UI_PATTERNS = [
269
+ '/tps/',
270
+ 'tps-',
271
+ '-tps-',
272
+ 'icon',
273
+ 'logo',
274
+ '.gif',
275
+ 'avatar',
276
+ 'TB1',
277
+ 'atmosphere',
278
+ 'storag-merlin',
279
+ '-2-tps-',
280
+ 'shopmanager', // shop logo/management images
281
+ 'O1CN01KsDwNS', // common UI element
282
+ 'O1CN01Dqo1gd', // common UI element
283
+ 'O1CN01z163bz', // badge/tag
284
+ 'O1CN012pqGiT', // UI element
285
+ ];
286
+ // Helper to check if URL is a UI image
287
+ function isUiImage(url) {
288
+ return TAOBAO_UI_PATTERNS.some((p) => url.includes(p));
289
+ }
290
+ // Helper to check if URL is a product image (from seller's store)
291
+ function isProductImage(url, sellerId) {
292
+ // Must be from alicdn
293
+ if (!url.includes('alicdn'))
294
+ return false;
295
+ // Filter out UI images
296
+ if (isUiImage(url))
297
+ return false;
298
+ // Product images typically have seller ID or O1CN pattern for product photos
299
+ if (sellerId && url.includes(sellerId))
300
+ return true;
301
+ // Main product images often have these patterns
302
+ if (url.includes('/bao/uploaded/') || url.includes('/imgextra/')) {
303
+ // But filter out small sizes (likely thumbnails/icons)
304
+ if (url.includes('-96-') || url.includes('-64-') || url.includes('-48-'))
305
+ return false;
306
+ return true;
307
+ }
308
+ return false;
309
+ }
310
+ // Taobao / Tmall
311
+ browserCommand
312
+ .command('taobao')
313
+ .description('Scrape product from Taobao/Tmall detail page')
314
+ .option('-s, --session <id>', 'Session ID', process.env.SESSION_ID)
315
+ .option('-o, --output <dir>', 'Output directory (default: ./taobao-<itemId>)')
316
+ .option('-d, --download', 'Download images and videos', false)
317
+ .action(async (options) => {
318
+ try {
319
+ if (!options.session) {
320
+ console.error(JSON.stringify({ error: 'Session ID is required. Use --session or set SESSION_ID env var.' }));
321
+ process.exit(1);
322
+ }
323
+ const fs = await import('fs');
324
+ const path = await import('path');
325
+ console.error('抓取页面信息...');
326
+ const pageInfo = await api.post('/api/browser/page-info', {
327
+ session: options.session,
328
+ });
329
+ // Validate URL
330
+ if (!pageInfo.url.includes('taobao.com') && !pageInfo.url.includes('tmall.com')) {
331
+ console.error(JSON.stringify({ error: '当前页面不是淘宝/天猫商品页' }));
332
+ process.exit(1);
333
+ }
334
+ const itemIdMatch = pageInfo.url.match(/id=(\d+)/);
335
+ const itemId = itemIdMatch ? itemIdMatch[1] : 'unknown';
336
+ const title = pageInfo.title.replace(/-淘宝网|-天猫.*$/g, '').trim();
337
+ if (itemId === 'unknown') {
338
+ console.error(JSON.stringify({ error: '无法从 URL 提取商品 ID' }));
339
+ process.exit(1);
340
+ }
341
+ const product = {
342
+ platform: 'taobao',
343
+ item_id: itemId,
344
+ title,
345
+ url: `https://item.taobao.com/item.htm?id=${itemId}`,
346
+ price: {},
347
+ images: [],
348
+ videos: [],
349
+ specs: {},
350
+ scraped_at: new Date().toISOString(),
351
+ };
352
+ // Price
353
+ console.error('抓取价格...');
354
+ const priceElements = await queryElements(options.session, "[class*='price'], [class*='Price']", undefined, 20);
355
+ for (const el of priceElements) {
356
+ const text = String(el.text || '');
357
+ const couponMatch = text.match(/券后[¥¥]?(\d+)/);
358
+ if (couponMatch)
359
+ product.price.current = parseInt(couponMatch[1], 10);
360
+ const origMatch = text.match(/优惠前[¥¥]?(\d+)/);
361
+ if (origMatch)
362
+ product.price.original = parseInt(origMatch[1], 10);
363
+ if (!product.price.current && !product.price.original) {
364
+ const priceMatch = text.match(/[¥¥](\d+)/);
365
+ if (priceMatch)
366
+ product.price.current = parseInt(priceMatch[1], 10);
367
+ }
368
+ }
369
+ // Scroll to load lazy images (detail description images)
370
+ console.error('滚动页面加载详情图...');
371
+ for (let i = 0; i < 5; i++) {
372
+ await api.post('/api/browser/scroll', {
373
+ session: options.session,
374
+ direction: 'down',
375
+ distance: 1500,
376
+ });
377
+ await new Promise((r) => setTimeout(r, 500)); // wait for images to load
378
+ }
379
+ // Scroll back to top
380
+ await api.post('/api/browser/scroll', {
381
+ session: options.session,
382
+ direction: 'up',
383
+ distance: 10000,
384
+ });
385
+ // Extract seller ID from existing images for better filtering
386
+ let sellerId;
387
+ const testImages = await queryElements(options.session, 'img', ['@src'], 50);
388
+ for (const el of testImages) {
389
+ const src = String(el.src || '');
390
+ // Seller ID pattern: /i1/12345678/ or similar
391
+ const match = src.match(/\/i\d\/(\d{6,})\//);
392
+ if (match) {
393
+ sellerId = match[1];
394
+ console.error(`检测到卖家ID: ${sellerId}`);
395
+ break;
396
+ }
397
+ }
398
+ // Images - with better filtering
399
+ console.error('抓取图片...');
400
+ const imageElements = await queryElements(options.session, 'img', ['@src', '@data-src'], 300);
401
+ const seenImages = new Set();
402
+ for (const el of imageElements) {
403
+ let src = String(el.src || el['data-src'] || '');
404
+ if (!src)
405
+ continue;
406
+ // Normalize URL
407
+ if (src.startsWith('//'))
408
+ src = 'https:' + src;
409
+ src = src.replace(/_\d+x\d+[^/]*$/, '').replace(/\?.*$/, '');
410
+ // Check if it's a product image
411
+ if (!isProductImage(src, sellerId))
412
+ continue;
413
+ // Dedupe and add
414
+ if (src.length > 40 && !seenImages.has(src)) {
415
+ seenImages.add(src);
416
+ product.images.push(src);
417
+ }
418
+ }
419
+ // Also look for detail description images (often in iframes or specific containers)
420
+ console.error('抓取详情图...');
421
+ const detailImages = await queryElements(options.session, '#desc img, .detail-content img, [class*="descV8"] img, [class*="description"] img', ['@src', '@data-src'], 200);
422
+ for (const el of detailImages) {
423
+ let src = String(el.src || el['data-src'] || '');
424
+ if (!src || !src.includes('alicdn'))
425
+ continue;
426
+ if (src.startsWith('//'))
427
+ src = 'https:' + src;
428
+ src = src.replace(/\?.*$/, '');
429
+ if (src.length > 40 && !seenImages.has(src) && !isUiImage(src)) {
430
+ seenImages.add(src);
431
+ product.images.push(src);
432
+ }
433
+ }
434
+ // Videos
435
+ console.error('抓取视频...');
436
+ const videoElements = await queryElements(options.session, 'video, source', ['@src', '@data-src'], 20);
437
+ const seenVideos = new Set();
438
+ for (const el of videoElements) {
439
+ let src = String(el.src || el['data-src'] || '');
440
+ if (src && !seenVideos.has(src)) {
441
+ if (src.startsWith('//'))
442
+ src = 'https:' + src;
443
+ seenVideos.add(src);
444
+ product.videos.push(src);
445
+ }
446
+ }
447
+ // Specs
448
+ console.error('抓取规格...');
449
+ const specElements = await queryElements(options.session, "[class*='sku'], [class*='Sku'], [class*='attr']", undefined, 50);
450
+ const specKeys = ['开关类型', '插头类型', '颜色分类', '尺寸', '材质', '品牌', '型号', '产地'];
451
+ for (const el of specElements) {
452
+ const text = String(el.text || '');
453
+ for (const key of specKeys) {
454
+ if (text.includes(key) && !product.specs[key]) {
455
+ const match = text.match(new RegExp(`${key}([^开插颜尺材品型产]+)`));
456
+ if (match)
457
+ product.specs[key] = match[1].trim().slice(0, 60);
458
+ }
459
+ }
460
+ }
461
+ // Save
462
+ const outputDir = options.output || `./taobao-${itemId}`;
463
+ if (!fs.existsSync(outputDir))
464
+ fs.mkdirSync(outputDir, { recursive: true });
465
+ fs.writeFileSync(path.join(outputDir, 'product.json'), JSON.stringify(product, null, 2));
466
+ // Download
467
+ if (options.download) {
468
+ console.error('下载媒体文件...');
469
+ const result = await downloadMedia(product, outputDir, 'https://item.taobao.com/');
470
+ console.error(`下载完成: ${result.images}/${product.images.length} 图片, ${result.videos}/${product.videos.length} 视频`);
471
+ }
472
+ console.log(JSON.stringify({
473
+ success: true,
474
+ platform: 'taobao',
475
+ item_id: product.item_id,
476
+ title: product.title,
477
+ price: product.price,
478
+ images_count: product.images.length,
479
+ videos_count: product.videos.length,
480
+ specs_count: Object.keys(product.specs).length,
481
+ output_dir: outputDir,
482
+ }));
483
+ }
484
+ catch (error) {
485
+ console.error(JSON.stringify({ error: error instanceof Error ? error.message : String(error) }));
486
+ process.exit(1);
487
+ }
488
+ });
489
+ // 1688 (Alibaba China)
490
+ browserCommand
491
+ .command('1688')
492
+ .description('Scrape product from 1688.com detail page')
493
+ .option('-s, --session <id>', 'Session ID', process.env.SESSION_ID)
494
+ .option('-o, --output <dir>', 'Output directory (default: ./1688-<itemId>)')
495
+ .option('-d, --download', 'Download images and videos', false)
496
+ .action(async (options) => {
497
+ try {
498
+ if (!options.session) {
499
+ console.error(JSON.stringify({ error: 'Session ID is required. Use --session or set SESSION_ID env var.' }));
500
+ process.exit(1);
501
+ }
502
+ const fs = await import('fs');
503
+ const path = await import('path');
504
+ console.error('抓取页面信息...');
505
+ const pageInfo = await api.post('/api/browser/page-info', {
506
+ session: options.session,
507
+ });
508
+ if (!pageInfo.url.includes('1688.com')) {
509
+ console.error(JSON.stringify({ error: '当前页面不是 1688 商品页' }));
510
+ process.exit(1);
511
+ }
512
+ // 1688 URL pattern: /offer/123456.html or offerId=123456
513
+ const itemIdMatch = pageInfo.url.match(/offer\/(\d+)\.html/) || pageInfo.url.match(/offerId=(\d+)/);
514
+ const itemId = itemIdMatch ? itemIdMatch[1] : 'unknown';
515
+ const title = pageInfo.title.replace(/-阿里巴巴|-1688\.com/g, '').trim();
516
+ if (itemId === 'unknown') {
517
+ console.error(JSON.stringify({ error: '无法从 URL 提取商品 ID' }));
518
+ process.exit(1);
519
+ }
520
+ const product = {
521
+ platform: '1688',
522
+ item_id: itemId,
523
+ title,
524
+ url: `https://detail.1688.com/offer/${itemId}.html`,
525
+ price: {},
526
+ images: [],
527
+ videos: [],
528
+ specs: {},
529
+ scraped_at: new Date().toISOString(),
530
+ };
531
+ // Price - 1688 uses different price patterns (阶梯价, 批发价)
532
+ console.error('抓取价格...');
533
+ const priceElements = await queryElements(options.session, "[class*='price'], [class*='Price']", undefined, 30);
534
+ for (const el of priceElements) {
535
+ const text = String(el.text || '');
536
+ // 1688 price patterns
537
+ const priceMatch = text.match(/[¥¥](\d+\.?\d*)/);
538
+ if (priceMatch && !product.price.current) {
539
+ product.price.current = parseFloat(priceMatch[1]);
540
+ }
541
+ }
542
+ // Images - 1688 uses cbu01.alicdn.com
543
+ console.error('抓取图片...');
544
+ const imageElements = await queryElements(options.session, 'img', ['@src', '@data-src'], 200);
545
+ const seenImages = new Set();
546
+ for (const el of imageElements) {
547
+ let src = String(el.src || el['data-src'] || '');
548
+ if (!src.includes('alicdn') && !src.includes('1688.com'))
549
+ continue;
550
+ if (['icon', 'logo', '/tps/', '.gif', 'avatar'].some((x) => src.includes(x)))
551
+ continue;
552
+ src = src.replace(/_\d+x\d+[^/]*$/, '').replace(/\?.*$/, '');
553
+ if (src.startsWith('//'))
554
+ src = 'https:' + src;
555
+ if (src.length > 40 && !seenImages.has(src)) {
556
+ seenImages.add(src);
557
+ product.images.push(src);
558
+ }
559
+ }
560
+ // Videos
561
+ console.error('抓取视频...');
562
+ const videoElements = await queryElements(options.session, 'video, source', ['@src', '@data-src'], 20);
563
+ const seenVideos = new Set();
564
+ for (const el of videoElements) {
565
+ let src = String(el.src || el['data-src'] || '');
566
+ if (src && !seenVideos.has(src)) {
567
+ if (src.startsWith('//'))
568
+ src = 'https:' + src;
569
+ seenVideos.add(src);
570
+ product.videos.push(src);
571
+ }
572
+ }
573
+ // Specs
574
+ console.error('抓取规格...');
575
+ const specElements = await queryElements(options.session, "[class*='attr'], [class*='sku'], [class*='prop']", undefined, 50);
576
+ const specKeys = ['颜色', '尺码', '尺寸', '材质', '品牌', '型号', '产地', '货号'];
577
+ for (const el of specElements) {
578
+ const text = String(el.text || '');
579
+ for (const key of specKeys) {
580
+ if (text.includes(key) && !product.specs[key]) {
581
+ const match = text.match(new RegExp(`${key}[::]*([^颜尺材品型产货\\s]+)`));
582
+ if (match)
583
+ product.specs[key] = match[1].trim().slice(0, 60);
584
+ }
585
+ }
586
+ }
587
+ // Save
588
+ const outputDir = options.output || `./1688-${itemId}`;
589
+ if (!fs.existsSync(outputDir))
590
+ fs.mkdirSync(outputDir, { recursive: true });
591
+ fs.writeFileSync(path.join(outputDir, 'product.json'), JSON.stringify(product, null, 2));
592
+ if (options.download) {
593
+ console.error('下载媒体文件...');
594
+ const result = await downloadMedia(product, outputDir, 'https://detail.1688.com/');
595
+ console.error(`下载完成: ${result.images}/${product.images.length} 图片, ${result.videos}/${product.videos.length} 视频`);
596
+ }
597
+ console.log(JSON.stringify({
598
+ success: true,
599
+ platform: '1688',
600
+ item_id: product.item_id,
601
+ title: product.title,
602
+ price: product.price,
603
+ images_count: product.images.length,
604
+ videos_count: product.videos.length,
605
+ specs_count: Object.keys(product.specs).length,
606
+ output_dir: outputDir,
607
+ }));
608
+ }
609
+ catch (error) {
610
+ console.error(JSON.stringify({ error: error instanceof Error ? error.message : String(error) }));
611
+ process.exit(1);
612
+ }
613
+ });
614
+ //# sourceMappingURL=browser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser.js","sourceRoot":"","sources":["../../src/commands/browser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=browser.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser.test.d.ts","sourceRoot":"","sources":["../../src/commands/browser.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,228 @@
1
+ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
2
+ import { browserCommand } from './browser.js';
3
+ // Mock fetch globally
4
+ const mockFetch = vi.fn();
5
+ global.fetch = mockFetch;
6
+ // Helper to run command and capture output
7
+ async function runCommand(args) {
8
+ const stdout = [];
9
+ const stderr = [];
10
+ let exitCode = 0;
11
+ const originalLog = console.log;
12
+ const originalError = console.error;
13
+ const originalExit = process.exit;
14
+ console.log = (...args) => stdout.push(args.map(String).join(' '));
15
+ console.error = (...args) => stderr.push(args.map(String).join(' '));
16
+ process.exit = ((code) => {
17
+ exitCode = code ?? 0;
18
+ throw new Error('process.exit called');
19
+ });
20
+ try {
21
+ await browserCommand.parseAsync(['node', 'test', ...args]);
22
+ }
23
+ catch (e) {
24
+ if (e.message !== 'process.exit called') {
25
+ throw e;
26
+ }
27
+ }
28
+ finally {
29
+ console.log = originalLog;
30
+ console.error = originalError;
31
+ process.exit = originalExit;
32
+ }
33
+ return { stdout: stdout.join('\n'), stderr: stderr.join('\n'), exitCode };
34
+ }
35
+ describe('browserCommand', () => {
36
+ beforeEach(() => {
37
+ mockFetch.mockReset();
38
+ // Clear SESSION_ID env var
39
+ delete process.env.SESSION_ID;
40
+ });
41
+ afterEach(() => {
42
+ vi.restoreAllMocks();
43
+ });
44
+ describe('status', () => {
45
+ it('should require session ID', async () => {
46
+ const { stderr, exitCode } = await runCommand(['status']);
47
+ expect(exitCode).toBe(1);
48
+ expect(stderr).toContain('Session ID is required');
49
+ });
50
+ it('should call API with session ID', async () => {
51
+ mockFetch.mockResolvedValueOnce({
52
+ ok: true,
53
+ json: () => Promise.resolve({ connected: true, pageUrl: 'https://example.com' }),
54
+ });
55
+ const { stdout, exitCode } = await runCommand(['status', '--session', 'test-session']);
56
+ expect(exitCode).toBe(0);
57
+ expect(mockFetch).toHaveBeenCalledWith(expect.stringContaining('/api/browser/status?session=test-session'));
58
+ const output = JSON.parse(stdout);
59
+ expect(output.connected).toBe(true);
60
+ });
61
+ it('should use SESSION_ID env var', async () => {
62
+ process.env.SESSION_ID = 'env-session';
63
+ mockFetch.mockResolvedValueOnce({
64
+ ok: true,
65
+ json: () => Promise.resolve({ connected: false }),
66
+ });
67
+ // Note: commander default value is evaluated at definition time,
68
+ // so we need to pass the option explicitly or the env var won't be used
69
+ // This test verifies the behavior when --session is not provided
70
+ const { exitCode } = await runCommand(['status']);
71
+ // Without --session, it should use the env var or fail
72
+ // Since commander default is process.env.SESSION_ID, it should work
73
+ expect(exitCode === 0 || mockFetch.mock.calls.length > 0).toBe(true);
74
+ });
75
+ });
76
+ describe('connections', () => {
77
+ it('should list all connections', async () => {
78
+ mockFetch.mockResolvedValueOnce({
79
+ ok: true,
80
+ json: () => Promise.resolve([
81
+ { sessionId: 'session-1', pageUrl: 'https://taobao.com' },
82
+ { sessionId: 'session-2', pageUrl: 'https://1688.com' },
83
+ ]),
84
+ });
85
+ const { stdout, exitCode } = await runCommand(['connections']);
86
+ expect(exitCode).toBe(0);
87
+ const output = JSON.parse(stdout);
88
+ expect(output).toHaveLength(2);
89
+ });
90
+ });
91
+ describe('query', () => {
92
+ it('should require session ID', async () => {
93
+ const { stderr, exitCode } = await runCommand(['query', '.item']);
94
+ expect(exitCode).toBe(1);
95
+ expect(stderr).toContain('Session ID is required');
96
+ });
97
+ it('should send query request', async () => {
98
+ mockFetch.mockResolvedValueOnce({
99
+ ok: true,
100
+ json: () => Promise.resolve([{ text: 'Item 1' }, { text: 'Item 2' }]),
101
+ });
102
+ const { stdout, exitCode } = await runCommand(['query', '.item-card', '--session', 'test']);
103
+ expect(exitCode).toBe(0);
104
+ expect(mockFetch).toHaveBeenCalledWith(expect.stringContaining('/api/browser/query'), expect.objectContaining({
105
+ method: 'POST',
106
+ body: expect.stringContaining('.item-card'),
107
+ }));
108
+ const output = JSON.parse(stdout);
109
+ expect(output).toHaveLength(2);
110
+ });
111
+ it('should support schema option', async () => {
112
+ mockFetch.mockResolvedValueOnce({
113
+ ok: true,
114
+ json: () => Promise.resolve([{ title: 'Product 1', price: '99' }]),
115
+ });
116
+ const schema = '{"title":".title","price":".price"}';
117
+ await runCommand(['query', '.product', '--session', 'test', '--schema', schema]);
118
+ expect(mockFetch).toHaveBeenCalledWith(expect.any(String), expect.objectContaining({
119
+ body: expect.stringContaining('"schema":{"title":".title","price":".price"}'),
120
+ }));
121
+ });
122
+ it('should support limit option', async () => {
123
+ mockFetch.mockResolvedValueOnce({
124
+ ok: true,
125
+ json: () => Promise.resolve([]),
126
+ });
127
+ await runCommand(['query', '.item', '--session', 'test', '--limit', '10']);
128
+ expect(mockFetch).toHaveBeenCalledWith(expect.any(String), expect.objectContaining({
129
+ body: expect.stringContaining('"limit":10'),
130
+ }));
131
+ });
132
+ });
133
+ describe('click', () => {
134
+ it('should send click request', async () => {
135
+ mockFetch.mockResolvedValueOnce({
136
+ ok: true,
137
+ json: () => Promise.resolve({ clicked: true, selector: '.btn', index: 0 }),
138
+ });
139
+ const { stdout, exitCode } = await runCommand(['click', '.btn', '--session', 'test']);
140
+ expect(exitCode).toBe(0);
141
+ const output = JSON.parse(stdout);
142
+ expect(output.clicked).toBe(true);
143
+ });
144
+ it('should support index option', async () => {
145
+ mockFetch.mockResolvedValueOnce({
146
+ ok: true,
147
+ json: () => Promise.resolve({ clicked: true }),
148
+ });
149
+ await runCommand(['click', '.btn', '--session', 'test', '--index', '2']);
150
+ expect(mockFetch).toHaveBeenCalledWith(expect.any(String), expect.objectContaining({
151
+ body: expect.stringContaining('"index":2'),
152
+ }));
153
+ });
154
+ });
155
+ describe('scroll', () => {
156
+ it('should send scroll request with defaults', async () => {
157
+ mockFetch.mockResolvedValueOnce({
158
+ ok: true,
159
+ json: () => Promise.resolve({ scrolled: true, direction: 'down', distance: 500 }),
160
+ });
161
+ const { exitCode } = await runCommand(['scroll', '--session', 'test']);
162
+ expect(exitCode).toBe(0);
163
+ expect(mockFetch).toHaveBeenCalledWith(expect.any(String), expect.objectContaining({
164
+ body: expect.stringContaining('"direction":"down"'),
165
+ }));
166
+ });
167
+ it('should support direction and distance options', async () => {
168
+ mockFetch.mockResolvedValueOnce({
169
+ ok: true,
170
+ json: () => Promise.resolve({ scrolled: true }),
171
+ });
172
+ await runCommand(['scroll', '--session', 'test', '--direction', 'up', '--distance', '1000']);
173
+ // Verify direction is passed correctly
174
+ expect(mockFetch).toHaveBeenCalledWith(expect.any(String), expect.objectContaining({
175
+ body: expect.stringContaining('"direction":"up"'),
176
+ }));
177
+ });
178
+ });
179
+ describe('navigate', () => {
180
+ it('should send navigate request', async () => {
181
+ mockFetch.mockResolvedValueOnce({
182
+ ok: true,
183
+ json: () => Promise.resolve({ navigating: true, url: 'https://taobao.com' }),
184
+ });
185
+ const { exitCode } = await runCommand(['navigate', 'https://taobao.com', '--session', 'test']);
186
+ expect(exitCode).toBe(0);
187
+ expect(mockFetch).toHaveBeenCalledWith(expect.any(String), expect.objectContaining({
188
+ body: expect.stringContaining('https://taobao.com'),
189
+ }));
190
+ });
191
+ });
192
+ describe('page-info', () => {
193
+ it('should get page info', async () => {
194
+ mockFetch.mockResolvedValueOnce({
195
+ ok: true,
196
+ json: () => Promise.resolve({
197
+ url: 'https://example.com',
198
+ title: 'Example Page',
199
+ scrollPosition: { x: 0, y: 100 },
200
+ }),
201
+ });
202
+ const { stdout, exitCode } = await runCommand(['page-info', '--session', 'test']);
203
+ expect(exitCode).toBe(0);
204
+ const output = JSON.parse(stdout);
205
+ expect(output.url).toBe('https://example.com');
206
+ expect(output.title).toBe('Example Page');
207
+ });
208
+ });
209
+ describe('error handling', () => {
210
+ it('should handle API errors', async () => {
211
+ mockFetch.mockResolvedValueOnce({
212
+ ok: false,
213
+ status: 500,
214
+ statusText: 'Internal Server Error',
215
+ });
216
+ const { stderr, exitCode } = await runCommand(['connections']);
217
+ expect(exitCode).toBe(1);
218
+ expect(stderr).toContain('API error');
219
+ });
220
+ it('should handle network errors', async () => {
221
+ mockFetch.mockRejectedValueOnce(new Error('Network error'));
222
+ const { stderr, exitCode } = await runCommand(['connections']);
223
+ expect(exitCode).toBe(1);
224
+ expect(stderr).toContain('Network error');
225
+ });
226
+ });
227
+ });
228
+ //# sourceMappingURL=browser.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser.test.js","sourceRoot":"","sources":["../../src/commands/browser.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const supplierSearchCommand: Command;
3
+ //# sourceMappingURL=supplier-search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"supplier-search.d.ts","sourceRoot":"","sources":["../../src/commands/supplier-search.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC,eAAO,MAAM,qBAAqB,SAsC9B,CAAC"}
@@ -0,0 +1,76 @@
1
+ import { Command } from 'commander';
2
+ import { api } from '../utils/api.js';
3
+ export const supplierSearchCommand = new Command('supplier-search')
4
+ .description('Search for suppliers on 1688.com')
5
+ .argument('<keyword>', 'Search keyword')
6
+ .option('-l, --limit <number>', 'Number of results to return', '20')
7
+ .option('-f, --format <format>', 'Output format (json|text)', 'text')
8
+ .action(async (keyword, options) => {
9
+ try {
10
+ const limit = parseInt(options.limit, 10);
11
+ const response = await api.searchSuppliers(keyword, limit);
12
+ if (!response.suppliers || response.suppliers.length === 0) {
13
+ if (options.format === 'json') {
14
+ console.log(JSON.stringify({ suppliers: [], total: 0 }));
15
+ }
16
+ else {
17
+ console.log('未找到供应商');
18
+ }
19
+ return;
20
+ }
21
+ if (options.format === 'json') {
22
+ // JSON output for LLM/API integration
23
+ console.log(JSON.stringify(response, null, 2));
24
+ }
25
+ else {
26
+ // Human-readable text output
27
+ printSuppliersText(response);
28
+ }
29
+ }
30
+ catch (error) {
31
+ if (options.format === 'json') {
32
+ console.error(JSON.stringify({
33
+ error: error instanceof Error ? error.message : String(error),
34
+ }));
35
+ }
36
+ else {
37
+ console.error(`错误: ${error instanceof Error ? error.message : String(error)}`);
38
+ }
39
+ process.exit(1);
40
+ }
41
+ });
42
+ /**
43
+ * Print suppliers in human-readable text format
44
+ */
45
+ function printSuppliersText(response) {
46
+ const { suppliers, total, cached, timestamp } = response;
47
+ console.log(`\n找到 ${total} 个供应商${cached ? ' (缓存)' : ''}:\n`);
48
+ suppliers.forEach((supplier, index) => {
49
+ console.log(`${index + 1}. ${supplier.title}`);
50
+ console.log(` 价格: ¥${supplier.price.min} - ¥${supplier.price.max}`);
51
+ console.log(` 起订量: ${supplier.minOrderQuantity} 台`);
52
+ console.log(` 供应商: ${supplier.supplier.name} (${supplier.supplier.location})`);
53
+ console.log(` 评分: ${'★'.repeat(Math.round(supplier.supplier.rating))}${'☆'.repeat(5 - Math.round(supplier.supplier.rating))} ${supplier.supplier.rating.toFixed(1)}`);
54
+ // Optional fields
55
+ if (supplier.sales) {
56
+ console.log(` 销量: ${supplier.sales}`);
57
+ }
58
+ if (supplier.sellerYears) {
59
+ console.log(` 经营年限: ${supplier.sellerYears} 年`);
60
+ }
61
+ if (supplier.tags && supplier.tags.length > 0) {
62
+ console.log(` 标签: ${supplier.tags.slice(0, 3).join(', ')}`);
63
+ }
64
+ // Price tiers
65
+ if (supplier.priceTiers && supplier.priceTiers.length > 1) {
66
+ console.log(` 阶梯价格:`);
67
+ supplier.priceTiers.forEach((tier) => {
68
+ console.log(` - ${tier.quantity}: ¥${tier.price}`);
69
+ });
70
+ }
71
+ console.log(` 链接: ${supplier.url}`);
72
+ console.log('');
73
+ });
74
+ console.log(`数据时间: ${new Date(timestamp).toLocaleString('zh-CN')}`);
75
+ }
76
+ //# sourceMappingURL=supplier-search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"supplier-search.js","sourceRoot":"","sources":["../../src/commands/supplier-search.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -5,6 +5,7 @@ import { searchCommand } from './commands/search.js';
5
5
  import { productCommand } from './commands/product.js';
6
6
  import { initCommand } from './commands/init.js';
7
7
  import { infoCommand } from './commands/info.js';
8
+ import { supplierSearchCommand } from './commands/supplier-search.js';
8
9
  const require = createRequire(import.meta.url);
9
10
  const packageJson = require('../package.json');
10
11
  const program = new Command();
@@ -17,6 +18,7 @@ program.addCommand(initCommand);
17
18
  program.addCommand(searchCommand);
18
19
  program.addCommand(productCommand);
19
20
  program.addCommand(infoCommand);
21
+ program.addCommand(supplierSearchCommand);
20
22
  // Parse arguments
21
23
  program.parse();
22
24
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEjD,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,WAAW,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;AAE/C,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,OAAO,CAAC;KACb,WAAW,CAAC,wDAAwD,CAAC;KACrE,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;AAEhC,oBAAoB;AACpB,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;AAChC,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;AAClC,OAAO,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC;AACnC,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;AAEhC,kBAAkB;AAClB,OAAO,CAAC,KAAK,EAAE,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AAEtE,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,WAAW,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;AAE/C,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,OAAO,CAAC;KACb,WAAW,CAAC,wDAAwD,CAAC;KACrE,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;AAEhC,oBAAoB;AACpB,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;AAChC,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;AAClC,OAAO,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC;AACnC,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;AAChC,OAAO,CAAC,UAAU,CAAC,qBAAqB,CAAC,CAAC;AAE1C,kBAAkB;AAClB,OAAO,CAAC,KAAK,EAAE,CAAC"}
@@ -13,6 +13,10 @@ export declare class ApiClient {
13
13
  * Get product details by ASIN
14
14
  */
15
15
  getProduct(asin: string, domain?: string): Promise<ApiResponse<ProductResponse>>;
16
+ /**
17
+ * Search for 1688 suppliers
18
+ */
19
+ searchSuppliers(keyword: string, limit?: number): Promise<any>;
16
20
  /**
17
21
  * Health check
18
22
  */
@@ -1 +1 @@
1
- {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/utils/api.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAEpF;;GAEG;AACH,qBAAa,SAAS;IACpB,OAAO,CAAC,OAAO,CAAS;gBAEZ,OAAO,GAAE,MAAsB;IAI3C;;OAEG;IACG,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,SAAe,GAAG,OAAO,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC;IAcxF;;OAEG;IACG,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,SAAe,GAAG,OAAO,CAAC,WAAW,CAAC,eAAe,CAAC,CAAC;IAa5F;;OAEG;IACG,MAAM,IAAI,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;CASpF;AAGD,eAAO,MAAM,GAAG,WAAkB,CAAC"}
1
+ {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/utils/api.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAEpF;;GAEG;AACH,qBAAa,SAAS;IACpB,OAAO,CAAC,OAAO,CAAS;gBAEZ,OAAO,GAAE,MAAsB;IAI3C;;OAEG;IACG,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,SAAe,GAAG,OAAO,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC;IAcxF;;OAEG;IACG,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,SAAe,GAAG,OAAO,CAAC,WAAW,CAAC,eAAe,CAAC,CAAC;IAa5F;;OAEG;IACG,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,SAAK,GAAG,OAAO,CAAC,GAAG,CAAC;IAchE;;OAEG;IACG,MAAM,IAAI,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;CASpF;AAGD,eAAO,MAAM,GAAG,WAAkB,CAAC"}
package/dist/utils/api.js CHANGED
@@ -32,6 +32,19 @@ export class ApiClient {
32
32
  }
33
33
  return response.json();
34
34
  }
35
+ /**
36
+ * Search for 1688 suppliers
37
+ */
38
+ async searchSuppliers(keyword, limit = 20) {
39
+ const url = new URL(`${this.baseUrl}/api/suppliers/search`);
40
+ url.searchParams.append('keyword', keyword);
41
+ url.searchParams.append('limit', limit.toString());
42
+ const response = await fetch(url.toString());
43
+ if (!response.ok) {
44
+ throw new Error(`API error: ${response.status} ${response.statusText}`);
45
+ }
46
+ return response.json();
47
+ }
35
48
  /**
36
49
  * Health check
37
50
  */
@@ -1 +1 @@
1
- {"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/utils/api.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAGrC;;GAEG;AACH,MAAM,OAAO,SAAS;IACZ,OAAO,CAAS;IAExB,YAAY,UAAkB,MAAM,CAAC,MAAM;QACzC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,MAAM,CAAC,KAAa,EAAE,MAAM,GAAG,YAAY;QAC/C,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC,OAAO,sBAAsB,CAAC,CAAC;QAC3D,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QACpC,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAE1C,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC;QAE7C,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,cAAc,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;QAC1E,CAAC;QAED,OAAO,QAAQ,CAAC,IAAI,EAA0C,CAAC;IACjE,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,UAAU,CAAC,IAAY,EAAE,MAAM,GAAG,YAAY;QAClD,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC,OAAO,iBAAiB,IAAI,EAAE,CAAC,CAAC;QAC5D,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAE1C,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC;QAE7C,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,cAAc,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;QAC1E,CAAC;QAED,OAAO,QAAQ,CAAC,IAAI,EAA2C,CAAC;IAClE,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,MAAM;QACV,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,SAAS,CAAC,CAAC;QAEvD,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,wBAAwB,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;QAC7D,CAAC;QAED,OAAO,QAAQ,CAAC,IAAI,EAAyE,CAAC;IAChG,CAAC;CACF;AAED,mBAAmB;AACnB,MAAM,CAAC,MAAM,GAAG,GAAG,IAAI,SAAS,EAAE,CAAC"}
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/utils/api.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAGrC;;GAEG;AACH,MAAM,OAAO,SAAS;IACZ,OAAO,CAAS;IAExB,YAAY,UAAkB,MAAM,CAAC,MAAM;QACzC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,MAAM,CAAC,KAAa,EAAE,MAAM,GAAG,YAAY;QAC/C,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC,OAAO,sBAAsB,CAAC,CAAC;QAC3D,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QACpC,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAE1C,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC;QAE7C,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,cAAc,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;QAC1E,CAAC;QAED,OAAO,QAAQ,CAAC,IAAI,EAA0C,CAAC;IACjE,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,UAAU,CAAC,IAAY,EAAE,MAAM,GAAG,YAAY;QAClD,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC,OAAO,iBAAiB,IAAI,EAAE,CAAC,CAAC;QAC5D,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAE1C,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC;QAE7C,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,cAAc,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;QAC1E,CAAC;QAED,OAAO,QAAQ,CAAC,IAAI,EAA2C,CAAC;IAClE,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,eAAe,CAAC,OAAe,EAAE,KAAK,GAAG,EAAE;QAC/C,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC,OAAO,uBAAuB,CAAC,CAAC;QAC5D,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QAC5C,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;QAEnD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC;QAE7C,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,cAAc,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;QAC1E,CAAC;QAED,OAAO,QAAQ,CAAC,IAAI,EAAE,CAAC;IACzB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,MAAM;QACV,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,SAAS,CAAC,CAAC;QAEvD,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,wBAAwB,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;QAC7D,CAAC;QAED,OAAO,QAAQ,CAAC,IAAI,EAAyE,CAAC;IAChG,CAAC;CACF;AAED,mBAAmB;AACnB,MAAM,CAAC,MAAM,GAAG,GAAG,IAAI,SAAS,EAAE,CAAC"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@optima-chat/scout-cli",
3
- "version": "0.1.12",
4
- "description": "AI-powered Amazon product research CLI tool - Search products and get detailed analytics",
3
+ "version": "0.2.0",
4
+ "description": "AI-powered Amazon product research and 1688 supplier sourcing CLI tool - Search products, find suppliers, and get detailed analytics",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
7
7
  "bin": {
@@ -24,6 +24,9 @@
24
24
  "optima-scout",
25
25
  "amazon",
26
26
  "product-research",
27
+ "1688",
28
+ "supplier",
29
+ "sourcing",
27
30
  "cli",
28
31
  "e-commerce",
29
32
  "product-selection",