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.
- package/AGENTS.md +118 -0
- package/README.md +48 -0
- package/dist/auth/cookies.js +31 -0
- package/dist/auth/cookies.js.map +1 -0
- package/dist/auth/verify.js +25 -0
- package/dist/auth/verify.js.map +1 -0
- package/dist/cli.js +373 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/cart-add.js +199 -0
- package/dist/commands/cart-add.js.map +1 -0
- package/dist/commands/cart-list.js +168 -0
- package/dist/commands/cart-list.js.map +1 -0
- package/dist/commands/cart-remove.js +119 -0
- package/dist/commands/cart-remove.js.map +1 -0
- package/dist/commands/checkout-confirm.js +407 -0
- package/dist/commands/checkout-confirm.js.map +1 -0
- package/dist/commands/checkout-prepare.js +244 -0
- package/dist/commands/checkout-prepare.js.map +1 -0
- package/dist/commands/doctor.js +246 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/image-search.js +210 -0
- package/dist/commands/image-search.js.map +1 -0
- package/dist/commands/login.js +209 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/logout.js +59 -0
- package/dist/commands/logout.js.map +1 -0
- package/dist/commands/offer.js +185 -0
- package/dist/commands/offer.js.map +1 -0
- package/dist/commands/order-get.js +76 -0
- package/dist/commands/order-get.js.map +1 -0
- package/dist/commands/order-list.js +176 -0
- package/dist/commands/order-list.js.map +1 -0
- package/dist/commands/order-logistics.js +152 -0
- package/dist/commands/order-logistics.js.map +1 -0
- package/dist/commands/search.js +250 -0
- package/dist/commands/search.js.map +1 -0
- package/dist/commands/seller-chat.js +213 -0
- package/dist/commands/seller-chat.js.map +1 -0
- package/dist/commands/seller-inquire.js +110 -0
- package/dist/commands/seller-inquire.js.map +1 -0
- package/dist/commands/seller-lookup-ww.js +6 -0
- package/dist/commands/seller-lookup-ww.js.map +1 -0
- package/dist/commands/seller-messages.js +181 -0
- package/dist/commands/seller-messages.js.map +1 -0
- package/dist/commands/whoami.js +53 -0
- package/dist/commands/whoami.js.map +1 -0
- package/dist/commands/workflows.js +264 -0
- package/dist/commands/workflows.js.map +1 -0
- package/dist/daemon/client.js +75 -0
- package/dist/daemon/client.js.map +1 -0
- package/dist/daemon/manager.js +128 -0
- package/dist/daemon/manager.js.map +1 -0
- package/dist/daemon/protocol.js +5 -0
- package/dist/daemon/protocol.js.map +1 -0
- package/dist/daemon/server.js +197 -0
- package/dist/daemon/server.js.map +1 -0
- package/dist/daemon/throttle.js +17 -0
- package/dist/daemon/throttle.js.map +1 -0
- package/dist/io/errors.js +10 -0
- package/dist/io/errors.js.map +1 -0
- package/dist/io/output.js +17 -0
- package/dist/io/output.js.map +1 -0
- package/dist/io/prompt.js +17 -0
- package/dist/io/prompt.js.map +1 -0
- package/dist/session/context.js +91 -0
- package/dist/session/context.js.map +1 -0
- package/dist/session/dispatch.js +50 -0
- package/dist/session/dispatch.js.map +1 -0
- package/dist/session/lock.js +23 -0
- package/dist/session/lock.js.map +1 -0
- package/dist/session/paths.js +31 -0
- package/dist/session/paths.js.map +1 -0
- package/dist/session/shared.js +104 -0
- package/dist/session/shared.js.map +1 -0
- package/dist/session/state.js +27 -0
- package/dist/session/state.js.map +1 -0
- package/dist/util/time.js +17 -0
- package/dist/util/time.js.map +1 -0
- package/package.json +44 -0
- 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":"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"}
|
|
@@ -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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"}
|