1688-cli 0.1.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.
Files changed (80) hide show
  1. package/AGENTS.md +118 -0
  2. package/README.md +48 -0
  3. package/dist/auth/cookies.js +31 -0
  4. package/dist/auth/cookies.js.map +1 -0
  5. package/dist/auth/verify.js +25 -0
  6. package/dist/auth/verify.js.map +1 -0
  7. package/dist/cli.js +373 -0
  8. package/dist/cli.js.map +1 -0
  9. package/dist/commands/cart-add.js +199 -0
  10. package/dist/commands/cart-add.js.map +1 -0
  11. package/dist/commands/cart-list.js +168 -0
  12. package/dist/commands/cart-list.js.map +1 -0
  13. package/dist/commands/cart-remove.js +119 -0
  14. package/dist/commands/cart-remove.js.map +1 -0
  15. package/dist/commands/checkout-confirm.js +407 -0
  16. package/dist/commands/checkout-confirm.js.map +1 -0
  17. package/dist/commands/checkout-prepare.js +244 -0
  18. package/dist/commands/checkout-prepare.js.map +1 -0
  19. package/dist/commands/doctor.js +246 -0
  20. package/dist/commands/doctor.js.map +1 -0
  21. package/dist/commands/image-search.js +210 -0
  22. package/dist/commands/image-search.js.map +1 -0
  23. package/dist/commands/login.js +209 -0
  24. package/dist/commands/login.js.map +1 -0
  25. package/dist/commands/logout.js +59 -0
  26. package/dist/commands/logout.js.map +1 -0
  27. package/dist/commands/offer.js +185 -0
  28. package/dist/commands/offer.js.map +1 -0
  29. package/dist/commands/order-get.js +76 -0
  30. package/dist/commands/order-get.js.map +1 -0
  31. package/dist/commands/order-list.js +176 -0
  32. package/dist/commands/order-list.js.map +1 -0
  33. package/dist/commands/order-logistics.js +152 -0
  34. package/dist/commands/order-logistics.js.map +1 -0
  35. package/dist/commands/search.js +250 -0
  36. package/dist/commands/search.js.map +1 -0
  37. package/dist/commands/seller-chat.js +213 -0
  38. package/dist/commands/seller-chat.js.map +1 -0
  39. package/dist/commands/seller-inquire.js +110 -0
  40. package/dist/commands/seller-inquire.js.map +1 -0
  41. package/dist/commands/seller-lookup-ww.js +6 -0
  42. package/dist/commands/seller-lookup-ww.js.map +1 -0
  43. package/dist/commands/seller-messages.js +181 -0
  44. package/dist/commands/seller-messages.js.map +1 -0
  45. package/dist/commands/whoami.js +53 -0
  46. package/dist/commands/whoami.js.map +1 -0
  47. package/dist/commands/workflows.js +264 -0
  48. package/dist/commands/workflows.js.map +1 -0
  49. package/dist/daemon/client.js +75 -0
  50. package/dist/daemon/client.js.map +1 -0
  51. package/dist/daemon/manager.js +128 -0
  52. package/dist/daemon/manager.js.map +1 -0
  53. package/dist/daemon/protocol.js +5 -0
  54. package/dist/daemon/protocol.js.map +1 -0
  55. package/dist/daemon/server.js +197 -0
  56. package/dist/daemon/server.js.map +1 -0
  57. package/dist/daemon/throttle.js +17 -0
  58. package/dist/daemon/throttle.js.map +1 -0
  59. package/dist/io/errors.js +10 -0
  60. package/dist/io/errors.js.map +1 -0
  61. package/dist/io/output.js +17 -0
  62. package/dist/io/output.js.map +1 -0
  63. package/dist/io/prompt.js +17 -0
  64. package/dist/io/prompt.js.map +1 -0
  65. package/dist/session/context.js +91 -0
  66. package/dist/session/context.js.map +1 -0
  67. package/dist/session/dispatch.js +50 -0
  68. package/dist/session/dispatch.js.map +1 -0
  69. package/dist/session/lock.js +23 -0
  70. package/dist/session/lock.js.map +1 -0
  71. package/dist/session/paths.js +31 -0
  72. package/dist/session/paths.js.map +1 -0
  73. package/dist/session/shared.js +104 -0
  74. package/dist/session/shared.js.map +1 -0
  75. package/dist/session/state.js +27 -0
  76. package/dist/session/state.js.map +1 -0
  77. package/dist/util/time.js +17 -0
  78. package/dist/util/time.js.map +1 -0
  79. package/package.json +44 -0
  80. package/scripts/postinstall.mjs +49 -0
@@ -0,0 +1,185 @@
1
+ import { dispatch } from '../session/dispatch.js';
2
+ import { emit, info } from '../io/output.js';
3
+ import { CliError } from '../io/errors.js';
4
+ const SKU_API_RE = /wosc\.queryofferskuselectormodel/i;
5
+ export async function execute(ctx, args) {
6
+ if (!/^\d+$/.test(args.offerId)) {
7
+ throw new CliError(2, 'BAD_INPUT', `Invalid offerId: ${args.offerId}`);
8
+ }
9
+ const page = await ctx.newPage();
10
+ let resolveSku;
11
+ const skuPromise = new Promise((r) => {
12
+ resolveSku = r;
13
+ });
14
+ const onResp = async (resp) => {
15
+ if (!SKU_API_RE.test(resp.url()))
16
+ return;
17
+ try {
18
+ const text = await resp.text();
19
+ const json = parseMtop(text);
20
+ if (json?.data?.skuSelectorBizModel)
21
+ resolveSku(json.data.skuSelectorBizModel);
22
+ }
23
+ catch {
24
+ /* ignore parse errors */
25
+ }
26
+ };
27
+ page.on('response', onResp);
28
+ const url = `https://detail.1688.com/offer/${args.offerId}.html`;
29
+ info(`Fetching offer ${args.offerId}...`);
30
+ try {
31
+ await page.goto(url, { waitUntil: 'domcontentloaded', timeout: 30000 });
32
+ }
33
+ catch (e) {
34
+ throw new CliError(9, 'NETWORK_ERROR', `Failed to load offer page: ${e.message}`);
35
+ }
36
+ if (/login\.1688\.com|login\.taobao\.com/.test(page.url())) {
37
+ throw new CliError(3, 'NOT_LOGGED_IN', 'Session expired. Run `1688 login`.');
38
+ }
39
+ const sku = (await Promise.race([
40
+ skuPromise,
41
+ new Promise((res) => setTimeout(() => res(null), 18000)),
42
+ ]));
43
+ page.off('response', onResp);
44
+ const dom = await scrapeDom(page);
45
+ return assemble(args.offerId, url, sku, dom);
46
+ }
47
+ function parseMtop(text) {
48
+ const t = text.trim();
49
+ const m = t.match(/^\s*mtopjsonp\d+\(([\s\S]*)\)\s*$/);
50
+ return JSON.parse(m ? m[1] : t);
51
+ }
52
+ async function scrapeDom(page) {
53
+ const raw = await page.title();
54
+ const title = raw.replace(/\s*-\s*阿里巴巴\s*$/, '').trim();
55
+ const info = await page.evaluate(() => {
56
+ function txt(sel) {
57
+ const e = document.querySelector(sel);
58
+ return e?.textContent?.trim() ?? null;
59
+ }
60
+ function imgSrc(sel) {
61
+ const e = document.querySelector(sel);
62
+ return e?.src ?? e?.getAttribute('data-src') ?? null;
63
+ }
64
+ return {
65
+ supplierName: txt('h1') ?? null,
66
+ // Try common image carousel selectors
67
+ mainImage: imgSrc('.v-image-wrap img') ??
68
+ imgSrc('.ant-image-img') ??
69
+ imgSrc('img[alt*="主图"]'),
70
+ sendArea: null,
71
+ };
72
+ });
73
+ return { title, ...info };
74
+ }
75
+ function assemble(offerId, url, sku, dom) {
76
+ const priceRange = sku?.skuPriceScale ?? null;
77
+ const { min: priceMin, max: priceMax } = parseRange(priceRange);
78
+ const options = (sku?.skuProps ?? []).map((p) => ({
79
+ prop: p.prop ?? '',
80
+ values: (p.value ?? []).map((v) => ({
81
+ name: v.name ?? '',
82
+ imageUrl: v.imageUrl ?? null,
83
+ })),
84
+ }));
85
+ const skus = Object.entries(sku?.skuInfoMap ?? {}).map(([k, v]) => ({
86
+ skuId: v.skuId ?? '',
87
+ specs: v.specAttrs ?? k,
88
+ price: parseFloatOrNull(v.discountPrice ?? v.price),
89
+ stock: parseIntOrNull(v.canBookCount),
90
+ }));
91
+ const freight = {
92
+ receiveAddress: sku?.extraInfo?.freightInfo?.receiveAddress ?? null,
93
+ sendArea: dom.sendArea,
94
+ unitWeight: sku?.extraInfo?.freightInfo?.unitWeight ?? null,
95
+ };
96
+ const fallbackImage = options[0]?.values[0]?.imageUrl ?? dom.mainImage ?? null;
97
+ return {
98
+ offerId,
99
+ title: dom.title,
100
+ url,
101
+ priceRange,
102
+ priceMin,
103
+ priceMax,
104
+ unitName: null,
105
+ supplier: { name: dom.supplierName, userId: null },
106
+ freight,
107
+ options,
108
+ skus,
109
+ mainImage: fallbackImage,
110
+ };
111
+ }
112
+ function parseRange(s) {
113
+ if (!s)
114
+ return { min: null, max: null };
115
+ const matches = Array.from(s.matchAll(/([\d.]+)/g)).map((m) => parseFloat(m[1]));
116
+ if (matches.length === 0)
117
+ return { min: null, max: null };
118
+ return {
119
+ min: matches[0] ?? null,
120
+ max: matches.length > 1 ? matches[1] : matches[0],
121
+ };
122
+ }
123
+ function parseFloatOrNull(s) {
124
+ if (s === undefined)
125
+ return null;
126
+ const n = parseFloat(s);
127
+ return Number.isFinite(n) ? n : null;
128
+ }
129
+ function parseIntOrNull(s) {
130
+ if (s === undefined)
131
+ return null;
132
+ const n = parseInt(s, 10);
133
+ return Number.isFinite(n) ? n : null;
134
+ }
135
+ export async function run(opts) {
136
+ if (!opts.offerId) {
137
+ throw new CliError(2, 'BAD_INPUT', 'offerId required.');
138
+ }
139
+ const data = await dispatch('offer', { offerId: opts.offerId }, { headed: opts.headed, profile: opts.profile });
140
+ emit({
141
+ human: () => printOffer(data),
142
+ data,
143
+ });
144
+ }
145
+ function printOffer(o) {
146
+ process.stdout.write(`${o.title}\n`);
147
+ process.stdout.write(` offerId: ${o.offerId}\n`);
148
+ if (o.priceRange) {
149
+ process.stdout.write(` price: ${o.priceRange}\n`);
150
+ }
151
+ else if (o.priceMin !== null) {
152
+ const range = o.priceMax !== null && o.priceMax !== o.priceMin
153
+ ? `¥${o.priceMin.toFixed(2)} - ¥${o.priceMax.toFixed(2)}`
154
+ : `¥${o.priceMin.toFixed(2)}`;
155
+ process.stdout.write(` price: ${range}\n`);
156
+ }
157
+ if (o.supplier.name) {
158
+ process.stdout.write(` supplier: ${o.supplier.name}\n`);
159
+ }
160
+ if (o.freight.receiveAddress) {
161
+ process.stdout.write(` freight: to ${o.freight.receiveAddress}` +
162
+ (o.freight.unitWeight ? `, ${o.freight.unitWeight}kg/unit` : '') +
163
+ '\n');
164
+ }
165
+ process.stdout.write(` url: ${o.url}\n`);
166
+ if (o.options.length) {
167
+ process.stdout.write(`\nOptions (${o.options.length}):\n`);
168
+ for (const opt of o.options) {
169
+ process.stdout.write(` ${opt.prop}: ${opt.values.map((v) => v.name).slice(0, 5).join(' | ')}`);
170
+ if (opt.values.length > 5)
171
+ process.stdout.write(` ... (+${opt.values.length - 5})`);
172
+ process.stdout.write('\n');
173
+ }
174
+ }
175
+ if (o.skus.length) {
176
+ const sample = o.skus.slice(0, 5);
177
+ process.stdout.write(`\nSKUs (${o.skus.length} total, showing ${sample.length}):\n`);
178
+ for (const s of sample) {
179
+ const price = s.price !== null ? `¥${s.price.toFixed(2)}` : '?';
180
+ const stock = s.stock !== null ? `${s.stock} in stock` : '';
181
+ process.stdout.write(` ${price.padEnd(10)} ${stock.padEnd(15)} ${s.specs}\n`);
182
+ }
183
+ }
184
+ }
185
+ //# sourceMappingURL=offer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"offer.js","sourceRoot":"","sources":["../../src/commands/offer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,76 @@
1
+ import { dispatch } from '../session/dispatch.js';
2
+ import { emit, info } from '../io/output.js';
3
+ import { CliError } from '../io/errors.js';
4
+ import { execute as orderListExecute, } from './order-list.js';
5
+ const SCAN_PAGE_SIZE = 50;
6
+ const STATUS_LABELS = {
7
+ waitbuyerpay: '待付款',
8
+ waitsellersend: '待发货',
9
+ waitbuyerreceive: '待收货',
10
+ success: '已完成',
11
+ cancel: '已取消',
12
+ };
13
+ export async function execute(ctx, args) {
14
+ if (!/^\d+$/.test(args.orderId)) {
15
+ throw new CliError(2, 'BAD_INPUT', `Invalid orderId: ${args.orderId}`);
16
+ }
17
+ const status = args.statusHint ?? 'all';
18
+ for (let p = 1; p <= args.maxScanPages; p++) {
19
+ info(`Scanning page ${p} (tradeStatus=${status})...`);
20
+ const listArgs = {
21
+ status,
22
+ page: p,
23
+ pageSize: SCAN_PAGE_SIZE,
24
+ };
25
+ const result = await orderListExecute(ctx, listArgs);
26
+ const match = result.orders.find((o) => o.orderId === args.orderId);
27
+ if (match)
28
+ return match;
29
+ if (result.orders.length === 0)
30
+ break;
31
+ if (p >= result.totalPages)
32
+ break;
33
+ }
34
+ throw new CliError(12, 'ORDER_NOT_FOUND', `Order ${args.orderId} not found in the most recent ${args.maxScanPages * SCAN_PAGE_SIZE} orders. Use --max-scan-pages to search deeper.`);
35
+ }
36
+ export async function run(opts) {
37
+ const maxScanPages = Math.max(1, parseInt(opts.maxScanPages ?? '5', 10));
38
+ const data = await dispatch('order-get', { orderId: opts.orderId, maxScanPages, statusHint: opts.status }, { headed: opts.headed, profile: opts.profile });
39
+ emit({
40
+ human: () => printOrder(data),
41
+ data,
42
+ });
43
+ }
44
+ function printOrder(o) {
45
+ const label = STATUS_LABELS[o.status] ?? o.statusLabel ?? o.status;
46
+ process.stdout.write(`Order ${o.orderId}\n`);
47
+ process.stdout.write(` status: ${label} (${o.status})\n`);
48
+ process.stdout.write(` created: ${o.createdAt}\n`);
49
+ if (o.paidAt)
50
+ process.stdout.write(` paid: ${fmt(o.paidAt)}\n`);
51
+ if (o.shippedAt)
52
+ process.stdout.write(` shipped: ${fmt(o.shippedAt)}\n`);
53
+ if (o.confirmGoodsTime)
54
+ process.stdout.write(` confirm: ${fmt(o.confirmGoodsTime)}\n`);
55
+ process.stdout.write(` amount: ¥${o.totalAmount.toFixed(2)} (goods ¥${o.productAmount.toFixed(2)} + shipping ¥${o.shipping.toFixed(2)})\n`);
56
+ process.stdout.write(` seller: ${o.seller.name} (${o.seller.loginId})\n`);
57
+ if (o.seller.shopUrl)
58
+ process.stdout.write(` ${o.seller.shopUrl}\n`);
59
+ if (o.items.length) {
60
+ process.stdout.write(` items:\n`);
61
+ for (const it of o.items) {
62
+ process.stdout.write(` * ${it.quantity}×¥${it.unitPrice.toFixed(2)} = ¥${it.amount.toFixed(2)} — ${it.productName}\n`);
63
+ if (it.spec)
64
+ process.stdout.write(` spec: ${it.spec}\n`);
65
+ if (it.productNumber)
66
+ process.stdout.write(` no: ${it.productNumber}\n`);
67
+ if (it.image)
68
+ process.stdout.write(` img: ${it.image}\n`);
69
+ }
70
+ }
71
+ }
72
+ function fmt(iso) {
73
+ // Trim ms and Z for readability
74
+ return iso.replace(/\.\d{3}Z$/, 'Z');
75
+ }
76
+ //# sourceMappingURL=order-get.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"order-get.js","sourceRoot":"","sources":["../../src/commands/order-get.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAClD,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC3C,OAAO,EACL,OAAO,IAAI,gBAAgB,GAG5B,MAAM,iBAAiB,CAAC;AAkBzB,MAAM,cAAc,GAAG,EAAE,CAAC;AAE1B,MAAM,aAAa,GAA2B;IAC5C,YAAY,EAAE,KAAK;IACnB,cAAc,EAAE,KAAK;IACrB,gBAAgB,EAAE,KAAK;IACvB,OAAO,EAAE,KAAK;IACd,MAAM,EAAE,KAAK;CACd,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,OAAO,CAC3B,GAAmB,EACnB,IAAkB;IAElB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAChC,MAAM,IAAI,QAAQ,CAAC,CAAC,EAAE,WAAW,EAAE,oBAAoB,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;IACzE,CAAC;IACD,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,IAAI,KAAK,CAAC;IACxC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5C,IAAI,CAAC,iBAAiB,CAAC,iBAAiB,MAAM,MAAM,CAAC,CAAC;QACtD,MAAM,QAAQ,GAAkB;YAC9B,MAAM;YACN,IAAI,EAAE,CAAC;YACP,QAAQ,EAAE,cAAc;SACzB,CAAC;QACF,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QACrD,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,IAAI,CAAC,OAAO,CAAC,CAAC;QACpE,IAAI,KAAK;YAAE,OAAO,KAAK,CAAC;QACxB,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC;YAAE,MAAM;QACtC,IAAI,CAAC,IAAI,MAAM,CAAC,UAAU;YAAE,MAAM;IACpC,CAAC;IACD,MAAM,IAAI,QAAQ,CAChB,EAAE,EACF,iBAAiB,EACjB,SAAS,IAAI,CAAC,OAAO,iCACnB,IAAI,CAAC,YAAY,GAAG,cACtB,iDAAiD,CAClD,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,GAAG,CAAC,IAAkB;IAC1C,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAC3B,CAAC,EACD,QAAQ,CAAC,IAAI,CAAC,YAAY,IAAI,GAAG,EAAE,EAAE,CAAC,CACvC,CAAC;IACF,MAAM,IAAI,GAAG,MAAM,QAAQ,CACzB,WAAW,EACX,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,IAAI,CAAC,MAAM,EAAE,EAChE,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAC/C,CAAC;IACF,IAAI,CAAC;QACH,KAAK,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC;QAC7B,IAAI;KACL,CAAC,CAAC;AACL,CAAC;AAED,SAAS,UAAU,CAAC,CAAQ;IAC1B,MAAM,KAAK,GAAG,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,WAAW,IAAI,CAAC,CAAC,MAAM,CAAC;IACnE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC;IAC7C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,eAAe,KAAK,KAAK,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC;IAC7D,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC;IACrD,IAAI,CAAC,CAAC,MAAM;QAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,eAAe,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACrE,IAAI,CAAC,CAAC,SAAS;QAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,eAAe,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IAC3E,IAAI,CAAC,CAAC,gBAAgB;QACpB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,eAAe,GAAG,CAAC,CAAC,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;IACnE,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,gBAAgB,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,aAAa,CAAC,OAAO,CACzE,CAAC,CACF,gBAAgB,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAC5C,CAAC;IACF,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,eAAe,CAAC,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,KAAK,CACvD,CAAC;IACF,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO;QAClB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,MAAM,CAAC,OAAO,IAAI,CAAC,CAAC;IAC5D,IAAI,CAAC,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;QACnB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;QACnC,KAAK,MAAM,EAAE,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC;YACzB,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,SAAS,EAAE,CAAC,QAAQ,KAAK,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,MAAM,CAAC,OAAO,CACtE,CAAC,CACF,MAAM,EAAE,CAAC,WAAW,IAAI,CAC1B,CAAC;YACF,IAAI,EAAE,CAAC,IAAI;gBAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,iBAAiB,EAAE,CAAC,IAAI,IAAI,CAAC,CAAC;YAChE,IAAI,EAAE,CAAC,aAAa;gBAClB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,iBAAiB,EAAE,CAAC,aAAa,IAAI,CAAC,CAAC;YAC9D,IAAI,EAAE,CAAC,KAAK;gBAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,iBAAiB,EAAE,CAAC,KAAK,IAAI,CAAC,CAAC;QACpE,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,GAAG,CAAC,GAAW;IACtB,gCAAgC;IAChC,OAAO,GAAG,CAAC,OAAO,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;AACvC,CAAC"}
@@ -0,0 +1,176 @@
1
+ import { dispatch } from '../session/dispatch.js';
2
+ import { emit, info } from '../io/output.js';
3
+ import { CliError } from '../io/errors.js';
4
+ const STATUS_LABELS = {
5
+ all: '全部',
6
+ waitbuyerpay: '待付款',
7
+ waitsellersend: '待发货',
8
+ waitbuyerreceive: '待收货',
9
+ success: '已完成',
10
+ cancel: '已取消',
11
+ };
12
+ const ORDER_LIST_URL = 'https://air.1688.com/app/ctf-page/trade-order-list/buyer-order-list.html';
13
+ const MTOP_API_RE = /mtop\.1688\.trading\.dataline\.service/i;
14
+ export async function execute(ctx, args) {
15
+ const page = await ctx.newPage();
16
+ let resolveCapture;
17
+ const captured = new Promise((res) => {
18
+ resolveCapture = res;
19
+ });
20
+ const onResp = async (resp) => {
21
+ if (!MTOP_API_RE.test(resp.url()))
22
+ return;
23
+ try {
24
+ const text = await resp.text();
25
+ const outer = JSON.parse(text);
26
+ const resultStr = outer?.data?.data?.result;
27
+ if (typeof resultStr !== 'string')
28
+ return;
29
+ const inner = JSON.parse(resultStr);
30
+ const list = inner?.data?.data;
31
+ if (!Array.isArray(list))
32
+ return;
33
+ const first = list[0];
34
+ if (list.length === 0 || (first && (first.id ?? null) !== null)) {
35
+ resolveCapture(inner);
36
+ }
37
+ }
38
+ catch {
39
+ /* ignore non-JSON responses */
40
+ }
41
+ };
42
+ page.on('response', onResp);
43
+ const url = `${ORDER_LIST_URL}?tradeStatus=${encodeURIComponent(args.status)}&page=${args.page}&pageSize=${args.pageSize}`;
44
+ info(`Fetching orders (${args.status}, page ${args.page})...`);
45
+ try {
46
+ await page.goto(url, { waitUntil: 'domcontentloaded', timeout: 30000 });
47
+ }
48
+ catch (e) {
49
+ throw new CliError(9, 'NETWORK_ERROR', `Failed to load order page: ${e.message}`);
50
+ }
51
+ if (/login\.1688\.com|login\.taobao\.com/.test(page.url())) {
52
+ throw new CliError(3, 'NOT_LOGGED_IN', 'Session expired. Run `1688 login`.');
53
+ }
54
+ // Wait up to 25s for the mtop response carrying the order array.
55
+ const inner = await Promise.race([
56
+ captured,
57
+ new Promise((res) => setTimeout(() => res(null), 25000)),
58
+ ]);
59
+ page.off('response', onResp);
60
+ await page.close().catch(() => { });
61
+ if (!inner) {
62
+ throw new CliError(11, 'NO_ORDER_DATA', 'Order list response was not captured (page may have changed or risk-controlled).');
63
+ }
64
+ return parseOrderList(inner, args);
65
+ }
66
+ function parseOrderList(inner, args) {
67
+ const list = inner.data?.data ?? [];
68
+ return {
69
+ status: args.status,
70
+ page: args.page,
71
+ pageSize: inner.data?.pageSize ?? args.pageSize,
72
+ totalPages: inner.data?.pages ?? 0,
73
+ totalOrders: inner.data?.total ?? 0,
74
+ orders: list.map(parseOrder),
75
+ };
76
+ }
77
+ function parseOrder(o) {
78
+ const firstStep = o.newStepOrders?.[0];
79
+ return {
80
+ orderId: o.idStr ?? String(o.id ?? ''),
81
+ status: firstStep?.stepStatus ?? String(o.status ?? ''),
82
+ statusLabel: o.statusLabel ?? '',
83
+ createdAt: o.gmtCreate ?? '',
84
+ paidAt: o.gmtPayment ? new Date(o.gmtPayment).toISOString() : null,
85
+ shippedAt: firstStep?.gmtShip
86
+ ? new Date(firstStep.gmtShip).toISOString()
87
+ : null,
88
+ confirmGoodsTime: o.confirmGoodsTime
89
+ ? new Date(o.confirmGoodsTime).toISOString()
90
+ : null,
91
+ totalAmount: cents(o.sumPayment),
92
+ productAmount: cents(o.sumProductPayment),
93
+ shipping: cents(o.carriage),
94
+ seller: {
95
+ name: o.sellerInfo?.companyName ?? '',
96
+ loginId: o.sellerInfo?.loginId ?? '',
97
+ userId: o.sellerInfo?.userId ?? '',
98
+ shopUrl: o.sellerInfo?.companyUrl ?? null,
99
+ },
100
+ steps: (o.newStepOrders ?? []).map(parseStep),
101
+ items: (o.orderEntries ?? []).map(parseEntry),
102
+ };
103
+ }
104
+ function parseStep(s) {
105
+ return {
106
+ status: s.stepStatus ?? '',
107
+ name: s.stepName ?? '',
108
+ paid: cents(s.payFee),
109
+ goods: cents(s.goodsFee),
110
+ postage: cents(s.postFee),
111
+ };
112
+ }
113
+ function parseEntry(e) {
114
+ const spec = e.specInfo?.specItems
115
+ ?.map((s) => `${s.specName ?? ''}: ${s.specValue ?? ''}`)
116
+ .join(' / ') ?? '';
117
+ return {
118
+ entryId: String(e.entryId ?? ''),
119
+ productName: e.productName ?? '',
120
+ spec,
121
+ quantity: e.quantity?.realAmount ?? Number(e.quantity?.realAmountStr ?? 0),
122
+ unitPrice: cents(e.actualUnitPrice),
123
+ amount: cents(e.amount),
124
+ image: e.mainSummImageUrl ?? null,
125
+ productNumber: e.productNumber ?? null,
126
+ };
127
+ }
128
+ function cents(v) {
129
+ if (v === undefined || v === null)
130
+ return 0;
131
+ const n = typeof v === 'string' ? parseFloat(v) : v;
132
+ return Number.isFinite(n) ? Math.round(n) / 100 : 0;
133
+ }
134
+ export async function run(opts) {
135
+ const status = opts.status ?? 'all';
136
+ if (!(status in STATUS_LABELS)) {
137
+ throw new CliError(2, 'BAD_INPUT', `Unknown status "${status}". Valid: ${Object.keys(STATUS_LABELS).join(', ')}`);
138
+ }
139
+ const pageNum = Math.max(1, parseInt(opts.page ?? '1', 10));
140
+ const pageSize = Math.min(50, Math.max(1, parseInt(opts.pageSize ?? '10', 10)));
141
+ const data = await dispatch('order-list', { status, page: pageNum, pageSize, headed: opts.headed }, { headed: opts.headed, profile: opts.profile });
142
+ emit({
143
+ human: () => printOrders(data),
144
+ data,
145
+ });
146
+ }
147
+ function printOrders(r) {
148
+ if (r.orders.length === 0) {
149
+ process.stdout.write(`No orders found (status=${r.status}, page ${r.page}/${r.totalPages || 1}).\n`);
150
+ return;
151
+ }
152
+ const w = String(r.orders.length).length;
153
+ r.orders.forEach((o, i) => {
154
+ const idx = String(i + 1).padStart(w, ' ');
155
+ const label = STATUS_LABELS[o.status] ?? o.status;
156
+ process.stdout.write(`${idx}. ¥${o.totalAmount.toFixed(2)} · ${o.createdAt} · ${label}\n`);
157
+ const pad = ' '.repeat(w + 2);
158
+ process.stdout.write(`${pad}from: ${o.seller.name} (${o.seller.loginId})\n`);
159
+ for (const it of o.items) {
160
+ process.stdout.write(`${pad}* ${it.quantity}×¥${it.unitPrice.toFixed(2)} = ¥${it.amount.toFixed(2)} — ${truncate(it.productName, 40)}`);
161
+ if (it.spec)
162
+ process.stdout.write(` [${it.spec}]`);
163
+ process.stdout.write('\n');
164
+ }
165
+ process.stdout.write(`${pad}orderId: ${o.orderId}\n`);
166
+ if (i < r.orders.length - 1)
167
+ process.stdout.write('\n');
168
+ });
169
+ process.stdout.write(`\nPage ${r.page} of ${r.totalPages} · ${r.totalOrders} total orders\n`);
170
+ }
171
+ function truncate(s, n) {
172
+ if (s.length <= n)
173
+ return s;
174
+ return s.slice(0, n - 1) + '…';
175
+ }
176
+ //# sourceMappingURL=order-list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"order-list.js","sourceRoot":"","sources":["../../src/commands/order-list.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,152 @@
1
+ import { dispatch } from '../session/dispatch.js';
2
+ import { emit, info } from '../io/output.js';
3
+ import { CliError } from '../io/errors.js';
4
+ const ORDER_LIST_URL = 'https://air.1688.com/app/ctf-page/trade-order-list/buyer-order-list.html';
5
+ const TRACE_API_RE = /mtoplgttraceservice\.querytrace/i;
6
+ const ORDER_LIST_API_RE = /mtop\.1688\.trading\.dataline\.service/i;
7
+ const SCAN_PAGE_SIZE = 50;
8
+ export async function execute(ctx, args) {
9
+ if (!/^\d+$/.test(args.orderId)) {
10
+ throw new CliError(2, 'BAD_INPUT', `Invalid orderId: ${args.orderId}`);
11
+ }
12
+ const status = args.statusHint ?? 'all';
13
+ for (let p = 1; p <= args.maxScanPages; p++) {
14
+ info(`Scanning page ${p} (tradeStatus=${status})...`);
15
+ const { traceList, totalPages, orderIdsOnPage } = await fetchPageLogistics(ctx, p, SCAN_PAGE_SIZE, status);
16
+ if (traceList) {
17
+ const match = traceList.find((t) => t.orderId === args.orderId);
18
+ if (match) {
19
+ return {
20
+ orderId: args.orderId,
21
+ found: true,
22
+ trace: (match.trace ?? []).map(parseTrace),
23
+ };
24
+ }
25
+ }
26
+ if (orderIdsOnPage.includes(args.orderId)) {
27
+ // Order is on this page but has no shipped logistics yet
28
+ return { orderId: args.orderId, found: false, trace: [] };
29
+ }
30
+ if (p >= totalPages)
31
+ break;
32
+ }
33
+ throw new CliError(12, 'ORDER_NOT_FOUND', `Order ${args.orderId} not found in the most recent ${args.maxScanPages * SCAN_PAGE_SIZE} orders. Use --max-scan-pages to search deeper.`);
34
+ }
35
+ async function fetchPageLogistics(ctx, page, pageSize, status) {
36
+ const pwPage = await ctx.newPage();
37
+ let traceList = null;
38
+ let traceResponseCount = 0;
39
+ let totalPages = Infinity;
40
+ let orderIdsOnPage = [];
41
+ const onResp = async (resp) => {
42
+ const url = resp.url();
43
+ try {
44
+ const text = await resp.text();
45
+ if (TRACE_API_RE.test(url)) {
46
+ const j = parseMtop(text);
47
+ if (Array.isArray(j?.data?.result)) {
48
+ // Accumulate: 1688 may issue multiple querytrace calls per page
49
+ // (lazy-load / batch). Overwriting drops earlier batches.
50
+ if (traceList === null)
51
+ traceList = [];
52
+ traceList.push(...j.data.result);
53
+ traceResponseCount++;
54
+ }
55
+ }
56
+ else if (ORDER_LIST_API_RE.test(url)) {
57
+ const j = parseMtop(text);
58
+ const r = j?.data?.data?.result;
59
+ if (typeof r === 'string') {
60
+ const inner = JSON.parse(r);
61
+ const list = inner?.data?.data;
62
+ if (Array.isArray(list) && list[0]?.id !== undefined) {
63
+ totalPages = inner.data?.pages ?? Infinity;
64
+ orderIdsOnPage = list
65
+ .map((o) => o.idStr ?? (o.id !== undefined ? String(o.id) : ''))
66
+ .filter(Boolean);
67
+ }
68
+ }
69
+ }
70
+ }
71
+ catch {
72
+ /* ignore parse errors */
73
+ }
74
+ };
75
+ pwPage.on('response', onResp);
76
+ try {
77
+ const url = `${ORDER_LIST_URL}?tradeStatus=${encodeURIComponent(status)}&page=${page}&pageSize=${pageSize}`;
78
+ await pwPage.goto(url, { waitUntil: 'domcontentloaded', timeout: 30000 });
79
+ // Wait for order list + trace responses. Multiple trace responses can
80
+ // arrive in waves; keep listening for a quiet period after the last one
81
+ // instead of breaking on the first.
82
+ const deadline = Date.now() + 25000;
83
+ let lastTraceCount = 0;
84
+ let stableSince = 0;
85
+ while (Date.now() < deadline) {
86
+ if (orderIdsOnPage.length === 0) {
87
+ await new Promise((r) => setTimeout(r, 250));
88
+ continue;
89
+ }
90
+ if (traceResponseCount !== lastTraceCount) {
91
+ lastTraceCount = traceResponseCount;
92
+ stableSince = Date.now();
93
+ }
94
+ // If we've received at least one trace response AND nothing new for 1.5s,
95
+ // consider trace data complete.
96
+ if (traceResponseCount > 0 &&
97
+ stableSince > 0 &&
98
+ Date.now() - stableSince > 1500) {
99
+ break;
100
+ }
101
+ await new Promise((r) => setTimeout(r, 250));
102
+ }
103
+ }
104
+ finally {
105
+ pwPage.off('response', onResp);
106
+ await pwPage.close().catch(() => { });
107
+ }
108
+ return { traceList, totalPages, orderIdsOnPage };
109
+ }
110
+ function parseMtop(text) {
111
+ const t = text.trim();
112
+ const m = t.match(/^\s*mtopjsonp\d+\(([\s\S]*)\)\s*$/);
113
+ return JSON.parse(m ? m[1] : t);
114
+ }
115
+ function parseTrace(t) {
116
+ const remark = t.remark ?? '';
117
+ // Carrier is usually in "remark" after a "|" separator: "... | 中通快递(ZTO)承运"
118
+ const carrierMatch = remark.match(/\|\s*([^|]+?)承运/);
119
+ return {
120
+ currentStatus: t.currentStatus ?? '',
121
+ mailNo: t.mailNo ?? '',
122
+ carrier: carrierMatch ? carrierMatch[1].trim() : null,
123
+ logisticsId: t.logisticsId ?? '',
124
+ remark,
125
+ };
126
+ }
127
+ export async function run(opts) {
128
+ const maxScanPages = Math.max(1, parseInt(opts.maxScanPages ?? '5', 10));
129
+ const data = await dispatch('order-logistics', { orderId: opts.orderId, maxScanPages, statusHint: opts.status }, { headed: opts.headed, profile: opts.profile });
130
+ emit({
131
+ human: () => printLogistics(data),
132
+ data,
133
+ });
134
+ }
135
+ function printLogistics(r) {
136
+ if (!r.found) {
137
+ process.stdout.write(`Order ${r.orderId}: not shipped yet (no logistics).\n`);
138
+ return;
139
+ }
140
+ process.stdout.write(`Order ${r.orderId}\n`);
141
+ r.trace.forEach((t, i) => {
142
+ if (r.trace.length > 1)
143
+ process.stdout.write(` package ${i + 1}:\n`);
144
+ const prefix = r.trace.length > 1 ? ' ' : ' ';
145
+ process.stdout.write(`${prefix}status: ${t.currentStatus}\n`);
146
+ process.stdout.write(`${prefix}mailNo: ${t.mailNo}\n`);
147
+ if (t.carrier)
148
+ process.stdout.write(`${prefix}carrier: ${t.carrier}\n`);
149
+ process.stdout.write(`${prefix}remark: ${t.remark}\n`);
150
+ });
151
+ }
152
+ //# sourceMappingURL=order-logistics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"order-logistics.js","sourceRoot":"","sources":["../../src/commands/order-logistics.ts"],"names":[],"mappings":"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"}