店小秘多平台铺货配方:7 平台建品脚本 + 静默拦截诊断法 + 项目状态

- TikTok/Shopee/速卖通/Walmart 各 46-47 条已在待发布
- Ozon 47 条已建、改价 40/47
- SHEIN 配方跑通第一条;Temu 差「预览图」一步
- 核心产出:MYJ.message.error 钩子诊断法(解开了三个平台的保存静默拦截)
- 含下一轮提示词 NEXT-ROUND-PROMPT.md
This commit is contained in:
admin9webs committed 2026-09-20 17:29:38 +08:00
commit f5720ad613
94 files changed
+21561

No files matched your search

+47
View File
@@ -0,0 +1,47 @@
6980309334003
6980309334010
6980309334027
6980309334034
6980309334041
6980309334058
6980309334065
6980309334072
6980309334089
6980309334096
6980309334102
6980309334119
6980309334126
6980309334133
6980309334140
6980309334157
6980309334164
6980309334171
6980309334188
6980309334195
6980309334201
6980309334218
6980309334225
6980309334232
6980309334249
6980309334256
6980309334263
6980309334270
6980309334287
6980309334294
6980309334300
6980309334317
6980309334324
6980309334331
6980309334348
6980309334355
6980309334362
6980309334379
6980309334386
6980309334393
6980309334409
6980309334416
6980309334423
6980309334430
6980309334447
6980309334454
6980309334461
+97
View File
@@ -0,0 +1,97 @@
{
"items": [
"* 店铺账号 [select] Snowmountain",
"* 新版产品分类 [select] 发夹、别针和夹子(Hair Barret",
" 是否为单品 [input] false",
" 店小秘分类 [-] ",
" 来源URL [input] ",
" [input] ",
"* Product Name (产品名称) [input] ",
"* SKU [input] ",
"* Product Identifiers (产品标识符) [select] UPC",
"* 产品属性 [ta] Gram",
"* Brand(品牌) [input] ",
" Small Parts Warning Code(小零件警告代码) [input] 2 - Choking hazard c",
" Net Content(净内容) [select] Gram",
" Multipack Quantity(多包装数量) [input] 1",
" Material(材料) [input] rhinestone",
" Label Image(标签图像) [ta] ",
" Label Image URL(标签图片URL) [ta] ",
" Label Image Contains(标签图像包含) [select] ",
" Is Prop 65 Warning Required(需要65号提案警告吗?) [select] No",
" Has Written Warranty(已书面保修) [select] No",
" Count Per Pack(每包计数) [input] 1",
" Condition(条件) [select] New(New)",
" Color Category(颜色类别) [input] ",
" Color(颜色) [ta] ",
" Assembled Product Width(组装产品宽度) [select] in",
" Assembled Product Depth(组装产品深度) [select] in",
" Age Group(年龄组) [input] Newborn",
" Country of Origin - Substantial Transformation(原产国-实质性转变) [input] ",
" Automate Pricing(自动定价) [ta] ",
" Minimum Seller Allowed Price(最低卖家允许价格) [input] ",
" Maximum Seller Allowed Price(卖方允许的最高价格) [input] ",
" Repricer Strategy(重新定价策略) [ta] ",
" External Product Identifier(外部产品标识符) [ta] ",
" External Product ID Type(外部产品ID类型) [select] ",
" External Product ID(外部产品ID) [ta] ",
" Product Package Dimensions and Weight(产品包装尺寸及重量) [input] ",
" Product Package Dimensions Depth (in)(产品包装尺寸深度(英寸)) [input] ",
" Product Package Weight (lbs)(产品包装重量(磅)) [input] ",
" Product Package Dimensions Height (in)(产品包装尺寸 高度(英寸)) [input] ",
" Product Package Dimensions Width (in)(产品包装尺寸 宽度(英寸)) [input] ",
" Site Start Date(网站开始日期) [input] ",
" Site End Date(网站结束日期) [input] ",
" State Restrictions(州限制) [ta] ",
" State Restrictions Reason(国家限制原因) [select] ",
" ZIP Codes(邮政编码) [ta] ",
" States(各州) [select] ",
" Academic Institution(学术机构) [ta] ",
" Character(性格) [input] ",
" Character Group(字符组) [input] ",
" Collection(收藏) [ta] ",
" Total Count(总计数) [input] ",
" Designer(设计师) [ta] ",
" Embellishment Type(装饰类型) [input] ",
" Closure Type(闭合类型) [input] Clip",
" Brand License(品牌授权) [input] ",
" Hair Barrette, Pin & Clip Type(发夹、别针和夹子类型) [input] Tiara Hairpin",
" Retail Packaging(零售包装) [input] ",
" Is Primary Variant(是主要变体) [input] ",
" Manufacturer Name(制造商名称) [ta] ",
" Manufacturer Part Number(制造商零件编号) [ta] ",
" Model Number(型号) [ta] ",
" Net Content Statement(净内容声明) [ta] ",
" Occasion(场合) [input] ",
" Pattern(图案) [input] ",
" Number of Pieces(件数) [input] ",
" Product Line(产品线) [input] ",
" California Prop 65 Warning Text(加州65号提案警告文本) [ta] ",
" Required Storage Condition(所需存储条件) [input] Ambient Storage",
" Season(季节) [input] Winter",
" Shape(形状) [ta] ",
" Size(尺寸) [ta] ",
" Size Descriptor(大小描述符) [input] ",
" Sports League(体育联盟) [input] ",
" Sports Team(运动队) [input] ",
" Style(风格) [input] ",
" Theme(主题) [ta] ",
" Third Party Accreditation Symbol on Product Package Code(产品包装代码上的第三方认可符号) [input] ",
" Warranty Text(保修文本) [ta] ",
" Warranty URL(保修网址) [input] ",
"* 价格 [input] ",
"* 库存 [input] ",
"* 运输重量 [input] ",
" MSRP [input] ",
"* 产品图片 [-] ",
"* 产品描述 [ta] ",
"* key feature [ta] ",
" Fulfillment Lag Time (Lag Time) [input] ",
" Must ship alone? (单独运输) [input] ",
" Ships in Original Packaging (原装运输) [input] ",
" Product is or Contains this Battery Type(电子元器件类型) [input] ",
" Product is or Contains a Chemical, Aerosol or Pesticide?(是否包含化学品) [input] ",
" Product is or Contains an Electronic Component?(是否包含电子元器件) [input] "
],
"tables": []
}
+154
View File
@@ -0,0 +1,154 @@
[
"眼镜盒(Eyeglass Cases)",
"缝纫别针(Sewing Pins)",
"文件文件夹(File Folders)",
"钱夹(Money Clips)",
"自行车瓶笼(Bicycle Bottle Cages)",
"肥皂盘和持有人(Soap Dishes & Holders)",
"时尚头带(Fashion Headbands)",
"鞋带(Shoelaces)",
"化妆包(Makeup Bags)",
"举重手套(Weight Lifting Gloves)",
"剪贴簿装饰(Scrapbooking Embellishments)",
"自行车后视镜(Bicycle Mirrors)",
"桌面管理器(Desktop Organizers)",
"行李标签(Luggage Tags)",
"汽车装饰内饰五金配件(Automotive Decorative Interior Hardware & Accessories)",
"零钱包(Coin Purses)",
"汽车组织者(Automotive Organizers)",
"牙刷套(Toothbrush Covers)",
"墙贴和贴纸(Wall Decals & Stickers)",
"钩环紧固件(Hook & Loop Fasteners)",
"窗膜(Window Film)",
"自行车制动器组(Bicycle Brake Sets)",
"标签(Labels)",
"黑头和白头去除工具(Blackhead & Whitehead Remover Tools)",
"无焰蜡烛(Flameless Candles)",
"礼品袋(Gift Bags)",
"跳绳(Jump Ropes)",
"冰箱储物箱、搁板和储物篮(Refrigerator Bins, Shelves & Baskets)",
"可重复使用的环保袋(Reusable Eco Bags)",
"首饰盒(Jewelry Boxes)",
"耳环(Earrings)",
"派对横幅(Party Banners)",
"应急准备工具包(Emergency Preparedness Kits)",
"手套和连指手套(Gloves & Mittens)",
"别针和胸针(Pins & Brooches)",
"急救包(First Aid Kits)",
"数学工具包(Math Tool Kits)",
"风铃(Wind Chimes)",
"护照持有人(Passport Holders)",
"铅笔盒(Pencil Boxes)",
"标尺(Rulers)",
"书签(Bookmarks)",
"浴室贴花(Bath Appliques)",
"花园雕像(Garden Statues)",
"浇水喷嘴(Watering Nozzles)",
"袜子(Socks)",
"隐形眼镜盒(Contact Lens Cases)",
"缝纫紧固件(Sewing Fasteners)",
"摩托车配件(Motorcycle Accessories)",
"汽车反光镜(Automotive Reflectors)",
"耳机盒(Headphone Cases)",
"洗漱用具包(Toiletry Kits & Bags)",
"手提包挂钩衣架(Handbag Hook Hangers)",
"铅笔(Pencils)",
"刷刷(Basting Brushes)",
"按摩器(Massagers)",
"篮子(Baskets)",
"荧光笔(Highlighters)",
"计算机机架和支架(Computer Racks & Mounts)",
"熨烫垫(Ironing Mats)",
"游泳袋(Swimming Gear Bags)",
"手袋(Handbags)",
"空白识别徽章(Blank Identification Badges)",
"新奇和堵嘴玩具(Novelty & Gag Toys)",
"葡萄酒手提袋、包和背包(Wine Totes, Bags & Backpacks)",
"隐形眼镜清洁系统(Contact Lens Cleaning Systems)",
"化妆刷和涂抹器(Makeup Brushes & Applicators)",
"发夹、别针和夹子(Hair Barrettes, Pins & Clips)",
"手机的皮肤(Skins for Cell Phones)",
"贴纸(Stickers)",
"自行车车架包(Bicycle Frame Bags)",
"标记(Markers)",
"卷发器(Hair Rollers)",
"自行车座杆夹具(Bicycle Seatpost Clamps)",
"墙纸(Wallpaper)",
"便当盒(Bento Boxes)",
"化妆组织者(Makeup Organizers)",
"硬件挂钩(Hardware Hooks)",
"储物箱和储物箱(Storage Chests & Boxes)",
"自行车铃铛和喇叭(Bicycle Bells & Horns)",
"汽车贴花和贴纸(Automotive Decals & Stickers)",
"酒塞和软木塞(Wine Stoppers & Corks)",
"腰包(Fanny Packs)",
"手提包整理包和插页(Handbag Organizers & Inserts)",
"药丸组织者(Pill Organizers)",
"运动装备包(Sports Equipment Bags)",
"浴帽(Shower Caps)",
"面部镜子(Face Mirrors)",
"钱包(Wallets)",
"钢笔(Pens)",
"鼻子和耳朵修剪器(Nose & Ear Trimmers)",
"卷发器(Hair Curling Irons)",
"钥匙扣(Keychains)",
"壁橱收纳盒(Closet Organizers)",
"项链吊坠(Necklace Pendants)",
"项链(Necklaces)",
"气球(Balloons)",
"漏斗和漏斗组(Funnels & Funnel Sets)",
"铅笔盒(Pencil Cases)",
"医用袋(Medical Bags)",
"键盘保护器(Keyboard Protectors)",
"鞋袋(Shoe Bags)",
"铅笔和钢笔橡皮擦(Pencil & Pen Erasers)",
"排水蛇(Drain Snakes)",
"学校和办公用纸(School & Office Paper)",
"牙刷架(Toothbrush Holders)",
"行李带(Luggage Straps)",
"包装组织者,立方体和文件夹(Packing Organizers, Cubes & Folders)",
"艺术画笔(Art Brushes)",
"眼影(Eye Shadow)",
"自行车灯(Bicycle Lights)",
"书挡(Bookends)",
"游戏附加组件(Game Add-On)",
"蜡笔(Crayons)",
"设备盖(Appliance Covers)",
"写作笔记本和素描本(Writing Notebooks & Sketch Books)",
"食品储存罐和容器(Food Storage Jars & Containers)",
"背包(Backpacks)",
"小雕像和小装饰品(Figurines & Knick-Knacks)",
"自行车拨链器(Bicycle Derailleurs)",
"手动卷笔刀(Manual Pencil Sharpeners)",
"花盆和花盆(Plant Pots & Planters)",
"公文包(Briefcases)",
"行李袋(Duffel Bags)",
"帽子(Hats)",
"面部清洁刷(Facial Cleansing Brushes)",
"头发刷子(Hair Brushes)",
"自行车曲柄(Bicycle Cranksets)",
"装饰品(Ornaments)",
"包包饰物(Bag Charms)",
"自行车工具(Bicycle Tools)",
"睫毛夹(Eyelash Curlers)",
"文具及文具套装(Stationery & Stationery Sets)",
"发梳(Hair Combs)",
"可重复使用的午餐袋和盒子(Reusable Lunch Bags & Boxes)",
"信使包和单肩包(Messenger & Shoulder Bags)",
"便条卡(Note Cards)",
"腕带(Wristbands)",
"铅笔握把(Pencil Grips)",
"车把胶带(Handlebar Tape)",
"绑腿(Gaiters)",
"摩托车零件(Motorcycle Parts)",
"明信片(Postcards)",
"牙签(Toothpicks)",
"自行车挡泥板(Bicycle Fenders)",
"名片夹(Business Card Holders)",
"其他化妆刷和工具(Other Makeup Brushes & Tools)",
"其他发型造型工具和产品(Other Hair Styling Tools & Products)",
"其他派对用品(Other Party Supplies)",
"其他手机配件(Other Cell Phone Accessories)",
"Other Bicycle Parts(Other Bicycle Parts)",
"其他旅行配件(Other Travel Accessories)"
]
+227
View File
@@ -0,0 +1,227 @@
{
"1027332215847": {
"cat": "picked:储物箱和储物箱(Storage",
"err": "仍报错的字段: []",
"ok": true
},
"547183997437": {
"cat": "picked:项链吊坠(Necklace",
"err": "仍报错的字段: []",
"ok": true
},
"548459586741": {
"cat": "picked:其他派对用品(Other",
"err": "仍报错的字段: []",
"ok": true
},
"591994902720": {
"cat": "picked:铅笔盒(Pencil",
"err": "仍报错的字段: []",
"ok": true
},
"610164857063": {
"cat": "picked:时尚头带(Fashion",
"err": "仍报错的字段: []",
"ok": true
},
"621300323670": {
"cat": "picked:桌面管理器(Desktop",
"err": "仍报错的字段: []",
"ok": true
},
"623011262210": {
"cat": "picked:墙贴和贴纸(Wall",
"err": "仍报错的字段: []",
"ok": true
},
"627879474686": {
"cat": "picked:袜子(Socks)",
"err": "仍报错的字段: []",
"ok": true
},
"639409307567": {
"cat": "picked:墙贴和贴纸(Wall",
"err": "仍报错的字段: []",
"ok": true
},
"641673262387": {
"cat": "picked:首饰盒(Jewelry",
"err": "仍报错的字段: []",
"ok": true
},
"657617635303": {
"cat": "picked:桌面管理器(Desktop",
"err": "仍报错的字段: []",
"ok": true
},
"661190598139": {
"cat": "picked:发夹、别针和夹子(Hair",
"err": "仍报错的字段: []",
"ok": true
},
"676236596821": {
"cat": "picked:发夹、别针和夹子(Hair",
"err": "仍报错的字段: []",
"ok": true
},
"682195499823": {
"cat": "picked:铅笔盒(Pencil",
"err": "仍报错的字段: []",
"ok": true
},
"685456757807": {
"cat": "picked:缝纫紧固件(Sewing",
"err": "仍报错的字段: []",
"ok": true
},
"694637537727": {
"cat": "picked:可重复使用的午餐袋和盒子(Reusable",
"err": "仍报错的字段: []",
"ok": true
},
"698782391248": {
"cat": "picked:贴纸(Stickers)",
"err": "仍报错的字段: []",
"ok": true
},
"703822717997": {
"cat": "picked:桌面管理器(Desktop",
"err": "仍报错的字段: []",
"ok": true
},
"707826905566": {
"cat": "picked:钱包(Wallets)",
"err": "仍报错的字段: []",
"ok": true
},
"708420302844": {
"cat": "picked:钥匙扣(Keychains)",
"err": "仍报错的字段: []",
"ok": true
},
"714492799386": {
"cat": "picked:化妆包(Makeup",
"err": "仍报错的字段: []",
"ok": true
},
"719391062058": {
"cat": "picked:化妆组织者(Makeup",
"err": "仍报错的字段: []",
"ok": true
},
"726442972676": {
"cat": "picked:发夹、别针和夹子(Hair",
"err": "仍报错的字段: []",
"ok": true
},
"735147938123": {
"cat": "picked:时尚头带(Fashion",
"err": "仍报错的字段: []",
"ok": true
},
"739147684759": {
"cat": "picked:缝纫紧固件(Sewing",
"err": "仍报错的字段: []",
"ok": true
},
"750271307455": {
"cat": "picked:钥匙扣(Keychains)",
"err": "仍报错的字段: []",
"ok": true
},
"774494945453": {
"cat": "picked:钥匙扣(Keychains)",
"err": "仍报错的字段: []",
"ok": true
},
"775057912118": {
"cat": "picked:钥匙扣(Keychains)",
"err": "仍报错的字段: []",
"ok": true
},
"787261097583": {
"cat": "picked:发夹、别针和夹子(Hair",
"err": "仍报错的字段: []",
"ok": true
},
"823560564174": {
"cat": "picked:发夹、别针和夹子(Hair",
"err": "仍报错的字段: []",
"ok": true
},
"823838532886": {
"cat": "picked:名片夹(Business",
"err": "仍报错的字段: []",
"ok": true
},
"833753630925": {
"cat": "picked:时尚头带(Fashion",
"err": "仍报错的字段: []",
"ok": true
},
"836512561982": {
"cat": "picked:化妆包(Makeup",
"err": "仍报错的字段: []",
"ok": true
},
"853414558425": {
"cat": "picked:其他手机配件(Other",
"err": "仍报错的字段: []",
"ok": true
},
"854003999648": {
"cat": "picked:发夹、别针和夹子(Hair",
"err": "仍报错的字段: []",
"ok": true
},
"857781294719": {
"cat": "picked:发夹、别针和夹子(Hair",
"err": "仍报错的字段: []",
"ok": true
},
"863384503032": {
"cat": "picked:发夹、别针和夹子(Hair",
"err": "仍报错的字段: []",
"ok": true
},
"863524134410": {
"cat": "picked:贴纸(Stickers)",
"err": "仍报错的字段: []",
"ok": true
},
"866537106657": {
"cat": "picked:缝纫紧固件(Sewing",
"err": "仍报错的字段: []",
"ok": true
},
"893592264148": {
"cat": "picked:发夹、别针和夹子(Hair",
"err": "仍报错的字段: []",
"ok": true
},
"896469995553": {
"cat": "picked:钥匙扣(Keychains)",
"err": "仍报错的字段: []",
"ok": true
},
"902440558099": {
"cat": "picked:发夹、别针和夹子(Hair",
"err": "仍报错的字段: []",
"ok": true
},
"944470567338": {
"cat": "picked:发夹、别针和夹子(Hair",
"err": "仍报错的字段: []",
"ok": true
},
"953869908708": {
"cat": "picked:墙贴和贴纸(Wall",
"err": "仍报错的字段: []",
"ok": true
},
"997450831819": {
"cat": "picked:贴纸(Stickers)",
"err": "仍报错的字段: []",
"ok": true
}
}
+48
View File
@@ -0,0 +1,48 @@
{
"997450831819": "184807701434436987",
"953869908708": "184807701434436937",
"944470567338": "184807701434436423",
"902440558099": "184807701434436399",
"896469995553": "184807701434436361",
"893592264148": "184807701434436319",
"866537106657": "184807701434436311",
"863524134410": "184807701434436289",
"863384503032": "184807701434436279",
"857781294719": "184807701434436257",
"854003999648": "184807701434436227",
"853414558425": "184807701434436183",
"836512561982": "184807701434436131",
"833753630925": "184807701434435981",
"823838532886": "184807701434435937",
"823560564174": "184807701434435823",
"787261097583": "184807701434435821",
"775057912118": "184807701434435805",
"774494945453": "184807701434435785",
"750271307455": "184807701434435757",
"739147684759": "184807701434435749",
"735147938123": "184807701434435731",
"726442972676": "184807701434435725",
"719391062058": "184807701434435723",
"714492799386": "184807701434435703",
"708420302844": "184807701434435695",
"707826905566": "184807701434435659",
"703822717997": "184807701434435649",
"698782391248": "184807701434435563",
"694637537727": "184807701434435549",
"685456757807": "184807701434435539",
"682195499823": "184807701434435519",
"676236596821": "184807701434435509",
"661190598139": "184807701434435491",
"657617635303": "184807701434435461",
"641673262387": "184807701434435433",
"639409307567": "184807701434435427",
"627879474686": "184807701434435419",
"623011262210": "184807701434435411",
"621300323670": "184807701434435409",
"610164857063": "184807701434435397",
"591994902720": "184807701434435375",
"548459586741": "184807701434435371",
"547183997437": "184807701434435369",
"1027332215847": "184807701434434765",
"607330049419": "184807701434434763"
}
File diff suppressed because it is too large. Load diff
+117
View File
@@ -0,0 +1,117 @@
{
"stores": [
"walmartAddStore",
"walmartBasicStore",
"walmartProductStore",
"walmartAttrStore",
"walmartImgStore",
"walmartDescStore",
"walmartPackStore",
"walmartSupplementStore",
"walmartAddVariationStore",
"walmartDxmInfoStore",
"walmartAddThemeStore",
"walmartPriceShippingStore"
],
"items": [
{
"lab": "店铺账号",
"req": true,
"kind": "select",
"val": "Snowmountain"
},
{
"lab": "新版产品分类",
"req": true,
"kind": "input",
"val": ""
},
{
"lab": "是否为单品",
"req": false,
"kind": "input",
"val": "false"
},
{
"lab": "店小秘分类",
"req": false,
"kind": "-",
"val": ""
},
{
"lab": "来源URL",
"req": false,
"kind": "input",
"val": ""
},
{
"lab": "产品属性",
"req": false,
"kind": "-",
"val": ""
},
{
"lab": "单位数量单价",
"req": false,
"kind": "input",
"val": ""
},
{
"lab": "库存",
"req": true,
"kind": "input",
"val": ""
},
{
"lab": "产品图片",
"req": true,
"kind": "-",
"val": ""
},
{
"lab": "产品描述",
"req": true,
"kind": "textarea",
"val": ""
},
{
"lab": "key feature",
"req": true,
"kind": "textarea",
"val": ""
}
],
"dump": {
"walmartAddStore": {
"sharedData.isTemplateQuoting": "false",
"sharedData.isVariationTemplateEditing": "false",
"sharedData.pageType": "add",
"attrsInfo.hasPpuQuantity": "false",
"defaultAttrsInfo.hasPpuQuantity": "false"
},
"walmartBasicStore": {
"formState.shopId": "7661631",
"formState.hasVariant": "false"
},
"walmartProductStore": {
"formState.productIdType": "UPC",
"dataState.skuChecked": "false",
"dataState.productIdChecked": "false"
},
"walmartAttrStore": {
"formState.isNoBrand": "false"
},
"walmartImgStore": {},
"walmartDescStore": {},
"walmartPackStore": {},
"walmartSupplementStore": {},
"walmartAddVariationStore": {
"fieldProductIdType": "UPC",
"baseState.skuChecked": "false",
"baseState.upcChecked": "false"
},
"walmartDxmInfoStore": {},
"walmartAddThemeStore": {},
"walmartPriceShippingStore": {}
}
}
+140
View File
@@ -0,0 +1,140 @@
import { newTarget, CDP, SAN } from '/tmp/cdp3.mjs';
import fs from 'fs';
/* ── Walmart (Snowmountain, shopId 7661631) 建品配方 ──
node wmbatch.mjs <oid>
选店铺 → 选类目(索引) → Product Name/SKU/UPC(EAN)/Brand → 价格+库存+运输重量
→ 图片 → 描述+key feature → 保存 → 回读 */
const OID = process.argv[2];
if (!OID) { console.log('用法: node wmbatch.mjs <oid>'); process.exit(1); }
const IN = JSON.parse(fs.readFileSync('/tmp/wm_input.json', 'utf8'))[OID];
if (!IN) { console.log('无输入数据', OID); process.exit(1); }
const CATS = JSON.parse(fs.readFileSync('/tmp/wm_cats.json', 'utf8'));
const CAT = CATS[IN.cat_index];
const SHOP = 'Snowmountain';
const SKU = 'WM-' + OID;
const BRAND = process.env.WM_BRAND || 'Generic';
const wait = ms => new Promise(z => setTimeout(z, ms));
const log = (...a) => console.log(' ', ...a);
const tl = await (await fetch('http://127.0.0.1:9223/json/list')).json();
let k = 0;
for (const t of tl.filter(x => x.type === 'page' && /walmart/i.test(x.url))) { await fetch(`http://127.0.0.1:9223/json/close/${t.id}`).catch(() => {}); k++; }
if (k) { log(`清理 walmart 页 ${k} 个`); await wait(1200); }
const t = await newTarget('about:blank');
const c = await CDP.connect(t.webSocketDebuggerUrl);
await c.send('Page.enable'); await c.send('Runtime.enable');
await c.send('Page.navigate', { url: 'https://www.dianxiaomi.com/web/walmartProduct/add' });
await wait(24000);
// 1. 店铺
const spos = JSON.parse(String(await c.evalJS(`(()=>{const it=[...document.querySelectorAll('.ant-form-item')].filter(e=>e.offsetParent!==null)
.find(x=>{const l=x.querySelector('label'); return l&&/店铺/.test(l.innerText||'');});
const s=it.querySelector('.ant-select-selector'); s.scrollIntoView({block:'center'}); const r=s.getBoundingClientRect();
return JSON.stringify([Math.round(r.x+r.width/2),Math.round(r.y+r.height/2)]);})()`)));
for (const type of ['mousePressed', 'mouseReleased']) await c.send('Input.dispatchMouseEvent', { type, x: spos[0], y: spos[1], button: 'left', clickCount: 1 });
await wait(2500);
const pk = await c.evalJS(`(()=>{const dd=[...document.querySelectorAll('.ant-select-dropdown')].filter(e=>e.offsetParent!==null).pop();
if(!dd)return'no-dd'; const hit=[...dd.querySelectorAll('.ant-select-item-option')].find(o=>new RegExp('^\\\\s*${SHOP}\\\\s*$','i').test(o.innerText||''));
if(!hit)return'no-hit'; for(const ev of ['mousedown','mouseup','click']) hit.dispatchEvent(new MouseEvent(ev,{bubbles:true,cancelable:true,view:window})); return 'ok';})()`);
log('1) 店铺:', pk);
await wait(9000);
// 2. 类目
await c.evalJS(`document.body.dispatchEvent(new MouseEvent('mousedown',{bubbles:true}));document.body.click();`);
await wait(1200);
const cpos = JSON.parse(String(await c.evalJS(`(()=>{const it=[...document.querySelectorAll('.ant-form-item')].filter(e=>e.offsetParent!==null)
.find(x=>{const l=x.querySelector('label'); return l&&/产品分类/.test(l.innerText||'');});
const s=it.querySelector('.ant-select-selector'); s.scrollIntoView({block:'center'}); const r=s.getBoundingClientRect();
return JSON.stringify([Math.round(r.x+r.width/2),Math.round(r.y+r.height/2)]);})()`)));
for (const type of ['mousePressed', 'mouseReleased']) await c.send('Input.dispatchMouseEvent', { type, x: cpos[0], y: cpos[1], button: 'left', clickCount: 1 });
await wait(3000);
let catRes = 'nf';
for (let i = 0; i < 70; i++) {
const r = await c.evalJS(`(()=>{const dd=[...document.querySelectorAll('.ant-select-dropdown')].filter(e=>e.offsetParent!==null).pop();
if(!dd)return'no-dd'; const target=${JSON.stringify(CAT)};
const hit=[...dd.querySelectorAll('.ant-select-item-option')].find(o=>(o.innerText||'').trim()===target);
if(!hit)return'scroll';
for(const ev of ['mousedown','mouseup','click']) hit.dispatchEvent(new MouseEvent(ev,{bubbles:true,cancelable:true,view:window}));
return 'picked';})()`);
if (r === 'picked') { catRes = 'picked:' + CAT; break; }
if (r === 'no-dd') { catRes = 'no-dd'; break; }
await c.evalJS(`(()=>{const dd=[...document.querySelectorAll('.ant-select-dropdown')].filter(e=>e.offsetParent!==null).pop();
if(!dd)return 0; const rc=dd.querySelector('.rc-virtual-list-holder')||dd; rc.scrollTop=rc.scrollTop+340; return rc.scrollTop;})()`);
await wait(330);
}
log('2) 类目:', catRes);
if (catRes === 'nf' || catRes === 'no-dd') { log('❌ 类目未选中,中止'); process.exit(2); }
await wait(16000);
// 3. 全部字段直填 store
const wr = await c.evalJS(`(()=>{const p=document.querySelector('#app').__vue_app__.config.globalProperties.$pinia;
const g=n=>p._s.get(n).$state;
const basic=g('walmartBasicStore').formState;
basic.hasVariant=false;
const pr=g('walmartProductStore').formState;
pr.productName=${JSON.stringify(IN.title)};
pr.productIdType='UPC';
pr.productId=${JSON.stringify(IN.ean)};
pr.sku=${JSON.stringify(SKU)};
const at=g('walmartAttrStore').formState;
at.brand=${JSON.stringify(BRAND)};
const ps=g('walmartPriceShippingStore').formState;
ps.price=${JSON.stringify(String(IN.price_usd))};
ps.inventory='999';
ps.shippingWeight=${JSON.stringify(String(IN.weight_lbs))};
const ds=g('walmartDescStore').formState;
ds.description=${JSON.stringify(IN.bullets.map(b => '• ' + b).join('<br>'))};
ds.keyFeatures=${JSON.stringify(IN.bullets.slice(0, 3).map(b => b.slice(0, 100)))};
const im=g('walmartImgStore').formState;
const urls=${JSON.stringify(IN.imgs)};
im.mainImage=urls.map((u,i)=>({url:u,imgUrl:u,name:'img'+(i+1)+'.jpg',width:800,height:800}));
return JSON.stringify({name:pr.productName.length, upc:pr.productId, price:ps.price, w:ps.shippingWeight, imgs:urls.length, kf:ds.keyFeatures.length});})()`);
log('3) 字段:', wr);
await wait(2500);
// 3b. DOM 兜底:把关键文本字段再按真实事件写一遍(Brand/价格/库存/重量等 store 不绑 DOM)
const setByLabel = (rx, val) => c.evalJS(`(()=>{
const it=[...document.querySelectorAll('.ant-form-item')].filter(e=>e.offsetParent!==null)
.find(x=>{const l=x.querySelector('label'); return l&&new RegExp(${JSON.stringify(rx)}).test(l.innerText||'');});
if(!it)return'nf';
const el=it.querySelector('textarea')||it.querySelector('input:not([type=hidden])');
if(!el)return'no-el';
const proto=el.tagName==='TEXTAREA'?window.HTMLTextAreaElement.prototype:window.HTMLInputElement.prototype;
Object.getOwnPropertyDescriptor(proto,'value').set.call(el, ${JSON.stringify(String(val))});
el.dispatchEvent(new Event('input',{bubbles:true})); el.dispatchEvent(new Event('change',{bubbles:true})); el.dispatchEvent(new Event('blur',{bubbles:true}));
return 'ok';})()`);
const fills = [
['Product Name|产品名称', IN.title],
['^\\s*SKU', SKU],
['^\\s*Brand|品牌', BRAND],
['^\\s*价格', String(IN.price_usd)],
['^\\s*库存', '999'],
['运输重量', String(IN.weight_lbs)],
['产品描述', IN.bullets.map(b => '• ' + b).join('\n')],
['key feature', IN.bullets.slice(0, 3).join('\n')],
];
const fillRes = [];
for (const [rx, v] of fills) fillRes.push(rx.split('|')[0] + '=' + (await setByLabel(rx, v)));
log('3b) DOM兜底:', fillRes.join(' '));
await wait(2000);
// 4. 保存
const sv = await c.evalJS(`(()=>{const b=[...document.querySelectorAll('button,a,span')].filter(e=>e.offsetParent!==null&&/^\\s*保存\\s*$/.test(e.innerText||''));
if(!b.length)return'nf'; for(const ev of ['mousedown','mouseup','click']) b[b.length-1].dispatchEvent(new MouseEvent(ev,{bubbles:true,cancelable:true,view:window})); return 'clicked';})()`);
log('4) 保存:', sv);
const seen = [];
for (let i = 0; i < 18; i++) {
await wait(700);
const m = await c.evalJS(`(()=>{const ms=[...document.querySelectorAll('.ant-message-notice,.ant-notification-notice,.ant-modal-confirm')].map(e=>(e.innerText||'').replace(/\\s+/g,' ').trim()).filter(Boolean); return JSON.stringify(ms.slice(0,3));})()`);
JSON.parse(String(m)).forEach(x => seen.push(x));
}
log('5) 提示:', SAN([...new Set(seen)].join(' || ')).slice(0, 420) || '(无)');
const er = await c.evalJS(`(()=>{const e=[...document.querySelectorAll('.ant-form-item-has-error')].map(x=>{const l=x.querySelector('label'); return (l?l.innerText.trim():'?');});
return JSON.stringify([...new Set(e)].slice(0,8));})()`);
log('6) 仍报错的字段:', SAN(String(er)).slice(0, 200));
await c.shot('/tmp/wm_pilot.jpeg').catch(() => {});
process.exit(0);
+278
View File
@@ -0,0 +1,278 @@
{
"1027332215847": {
"brand": "brand 现值: Generic",
"imgs": "补后图片数: 4",
"save": "保存: 成功",
"ok": true
},
"547183997437": {
"brand": "brand 现值: Generic",
"imgs": "补后图片数: 6",
"save": "保存: 成功",
"ok": true
},
"548459586741": {
"brand": "brand 现值: Generic",
"imgs": "补后图片数: 6",
"save": "保存: 成功",
"ok": true
},
"591994902720": {
"brand": "brand 现值: Generic",
"imgs": "补后图片数: 6",
"save": "保存: 成功",
"ok": true
},
"607330049419": {
"brand": "brand 现值: Unbranded",
"imgs": "补后图片数: 4",
"save": "保存: 成功",
"ok": true
},
"610164857063": {
"brand": "brand 现值: Generic",
"imgs": "补后图片数: 6",
"save": "保存: 成功",
"ok": true
},
"621300323670": {
"brand": "brand 现值: Generic",
"imgs": "补后图片数: 6",
"save": "保存: 成功",
"ok": true
},
"623011262210": {
"brand": "brand 现值: Generic",
"imgs": "补后图片数: 6",
"save": "保存: 成功",
"ok": true
},
"627879474686": {
"brand": "brand 现值: Generic",
"imgs": "补后图片数: 6",
"save": "保存: 成功",
"ok": true
},
"639409307567": {
"brand": "brand 现值: Generic",
"imgs": "补后图片数: 6",
"save": "保存: 成功",
"ok": true
},
"641673262387": {
"brand": "brand 现值: Generic",
"imgs": "补后图片数: 6",
"save": "保存: 成功",
"ok": true
},
"657617635303": {
"brand": "brand 现值: Generic",
"imgs": "补后图片数: 6",
"save": "保存: 成功",
"ok": true
},
"661190598139": {
"brand": "brand 现值: Generic",
"imgs": "补后图片数: 6",
"save": "保存: 成功",
"ok": true
},
"676236596821": {
"brand": "brand 现值: Generic",
"imgs": "补后图片数: 6",
"save": "保存: 成功",
"ok": true
},
"682195499823": {
"brand": "brand 现值: Generic",
"imgs": "补后图片数: 6",
"save": "保存: 成功",
"ok": true
},
"685456757807": {
"brand": "brand 现值: Generic",
"imgs": "补后图片数: 6",
"save": "保存: 成功",
"ok": true
},
"694637537727": {
"brand": "brand 现值: Generic",
"imgs": "补后图片数: 6",
"save": "保存: 成功",
"ok": true
},
"698782391248": {
"brand": "brand 现值: Generic",
"imgs": "补后图片数: 6",
"save": "保存: 成功",
"ok": true
},
"703822717997": {
"brand": "brand 现值: Generic",
"imgs": "补后图片数: 6",
"save": "保存: 成功",
"ok": true
},
"707826905566": {
"brand": "brand 现值: Generic",
"imgs": "补后图片数: 6",
"save": "保存: 成功",
"ok": true
},
"708420302844": {
"brand": "brand 现值: Generic",
"imgs": "补后图片数: 6",
"save": "保存: 成功",
"ok": true
},
"714492799386": {
"brand": "brand 现值: Generic",
"imgs": "补后图片数: 6",
"save": "保存: 成功",
"ok": true
},
"719391062058": {
"brand": "brand 现值: Generic",
"imgs": "补后图片数: 6",
"save": "保存: 成功",
"ok": true
},
"726442972676": {
"brand": "brand 现值: Generic",
"imgs": "补后图片数: 6",
"save": "保存: 成功",
"ok": true
},
"735147938123": {
"brand": "brand 现值: Generic",
"imgs": "补后图片数: 6",
"save": "保存: 成功",
"ok": true
},
"739147684759": {
"brand": "brand 现值: Generic",
"imgs": "补后图片数: 6",
"save": "保存: 成功",
"ok": true
},
"750271307455": {
"brand": "brand 现值: Generic",
"imgs": "补后图片数: 5",
"save": "保存: 成功",
"ok": true
},
"774494945453": {
"brand": "brand 现值: Generic",
"imgs": "补后图片数: 6",
"save": "保存: 成功",
"ok": true
},
"775057912118": {
"brand": "brand 现值: Generic",
"imgs": "补后图片数: 6",
"save": "保存: 成功",
"ok": true
},
"787261097583": {
"brand": "brand 现值: Generic",
"imgs": "补后图片数: 6",
"save": "保存: 成功",
"ok": true
},
"823560564174": {
"brand": "brand 现值: Generic",
"imgs": "补后图片数: 6",
"save": "保存: 成功",
"ok": true
},
"823838532886": {
"brand": "brand 现值: Generic",
"imgs": "补后图片数: 6",
"save": "保存: 成功",
"ok": true
},
"833753630925": {
"brand": "brand 现值: Generic",
"imgs": "补后图片数: 6",
"save": "保存: 成功",
"ok": true
},
"836512561982": {
"brand": "brand 现值: Generic",
"imgs": "补后图片数: 6",
"save": "保存: 成功",
"ok": true
},
"853414558425": {
"brand": "brand 现值: Generic",
"imgs": "补后图片数: 6",
"save": "保存: 成功",
"ok": true
},
"854003999648": {
"brand": "brand 现值: Generic",
"imgs": "补后图片数: 6",
"save": "保存: 成功",
"ok": true
},
"857781294719": {
"brand": "brand 现值: Generic",
"imgs": "补后图片数: 6",
"save": "保存: 成功",
"ok": true
},
"863384503032": {
"brand": "brand 现值: Generic",
"imgs": "补后图片数: 6",
"save": "保存: 成功",
"ok": true
},
"863524134410": {
"brand": "brand 现值: Generic",
"imgs": "补后图片数: 6",
"save": "保存: 成功",
"ok": true
},
"866537106657": {
"brand": "brand 现值: Generic",
"imgs": "补后图片数: 6",
"save": "保存: 成功",
"ok": true
},
"893592264148": {
"brand": "brand 现值: Generic",
"imgs": "补后图片数: 6",
"save": "保存: 成功",
"ok": true
},
"896469995553": {
"brand": "brand 现值: Generic",
"imgs": "补后图片数: 6",
"save": "保存: 成功",
"ok": true
},
"902440558099": {
"brand": "brand 现值: Generic",
"imgs": "补后图片数: 6",
"save": "保存: 成功",
"ok": true
},
"944470567338": {
"brand": "brand 现值: Generic",
"imgs": "补后图片数: 6",
"save": "保存: 成功",
"ok": true
},
"953869908708": {
"brand": "brand 现值: Generic",
"imgs": "补后图片数: 6",
"save": "保存: 成功",
"ok": true
},
"997450831819": {
"brand": "brand 现值: Generic",
"imgs": "补后图片数: 6",
"save": "保存: 成功",
"ok": true
}
}
+80
View File
@@ -0,0 +1,80 @@
import { attach } from '/tmp/cdp3.mjs';
import fs from 'fs';
/* 给已存在的 Walmart 产品补:无品牌 + 网络图片 */
const PID = process.argv[2];
const OID = process.argv[3];
const IN = JSON.parse(fs.readFileSync('/tmp/wm_input.json','utf8'))[OID];
if(!PID||!IN){ console.log('用法: node wmfixone.mjs <pid> <oid>'); process.exit(1); }
const wait = ms => new Promise(z => setTimeout(z, ms));
const log=(...a)=>console.log(' ',...a);
const tl=await (await fetch('http://127.0.0.1:9223/json/list')).json();
for(const t of tl.filter(x=>x.type==='page'&&/walmart/i.test(x.url))) await fetch(`http://127.0.0.1:9223/json/close/${t.id}`).catch(()=>{});
await wait(1000);
const t=await (await import('/tmp/cdp3.mjs')).newTarget('about:blank');
const {CDP}=await import('/tmp/cdp3.mjs');
const c=await CDP.connect(t.webSocketDebuggerUrl);
await c.send('Page.enable'); await c.send('Runtime.enable');
await c.send('Page.navigate',{url:`https://www.dianxiaomi.com/web/walmartProduct/edit?id=${PID}`});
await wait(24000);
// 1. 无品牌
const br=await c.evalJS(`(()=>{const lab=[...document.querySelectorAll('.ant-form-item')].filter(e=>e.offsetParent!==null)
.find(x=>{const l=x.querySelector('label'); return l&&/Brand/.test(l.innerText||'');});
if(!lab)return'nf';
const inp=lab.querySelector('input[name=brand]');
if(inp&&inp.value&&inp.value!=='')return 'already:'+inp.value;
const cb=[...lab.querySelectorAll('.ant-checkbox-wrapper')].find(e=>/无品牌/.test(e.innerText||''));
if(!cb)return'no-cb';
for(const ev of ['mousedown','mouseup','click']) cb.dispatchEvent(new MouseEvent(ev,{bubbles:true,cancelable:true,view:window}));
const i2=cb.querySelector('input[type=checkbox]'); if(i2) i2.click();
return 'clicked';})()`);
log('无品牌:',br);
await wait(2000);
const bv=await c.evalJS(`(()=>{const lab=[...document.querySelectorAll('.ant-form-item')].filter(e=>e.offsetParent!==null)
.find(x=>{const l=x.querySelector('label'); return l&&/Brand/.test(l.innerText||'');});
const inp=lab?lab.querySelector('input[name=brand]'):null; return inp?inp.value:'?';})()`);
log('brand 现值:', String(bv));
// 2. 图片(若已有则跳过)
const cur=await c.evalJS(`(()=>{const it=[...document.querySelectorAll('.ant-form-item')].filter(e=>e.offsetParent!==null)
.find(x=>{const l=x.querySelector('label'); return l&&/产品图片/.test(l.innerText||'');});
const m=(it?it.innerText:'').match(/已经选用了\\s*(\\d+)\\s*张/); return m?Number(m[1]):-1;})()`);
log('已有图片数:', String(cur));
if (Number(cur) < 4) {
const pos=JSON.parse(String(await c.evalJS(`(()=>{const it=[...document.querySelectorAll('.ant-form-item')].filter(e=>e.offsetParent!==null)
.find(x=>{const l=x.querySelector('label'); return l&&/产品图片/.test(l.innerText||'');});
const b=[...it.querySelectorAll('button')].find(e=>/选择图片/.test(e.innerText||''));
b.scrollIntoView({block:'center'}); const r=b.getBoundingClientRect();
return JSON.stringify([Math.round(r.x+r.width/2),Math.round(r.y+r.height/2)]);})()`)));
await c.send('Input.dispatchMouseEvent',{type:'mouseMoved',x:pos[0],y:pos[1]}); await wait(1500);
await c.send('Input.dispatchMouseEvent',{type:'mouseMoved',x:pos[0]+2,y:pos[1]+2}); await wait(2200);
const hit=JSON.parse(String(await c.evalJS(`(()=>{const d=[...document.querySelectorAll('.ant-dropdown')].filter(e=>e.offsetParent!==null).pop();
if(!d)return'[]'; const it=[...d.querySelectorAll('li,.ant-dropdown-menu-item')].find(e=>/网络图片/.test(e.innerText||''));
if(!it)return'[]'; const r=it.getBoundingClientRect(); return JSON.stringify([Math.round(r.x+r.width/2),Math.round(r.y+r.height/2)]);})()`)));
if(hit.length){ await c.send('Input.dispatchMouseEvent',{type:'mouseMoved',x:hit[0],y:hit[1]}); await wait(300);
for(const type of ['mousePressed','mouseReleased']) await c.send('Input.dispatchMouseEvent',{type,x:hit[0],y:hit[1],button:'left',clickCount:1}); }
await wait(4000);
const f=await c.evalJS(`(()=>{const m=[...document.querySelectorAll('.ant-modal')].filter(e=>e.offsetParent!==null).pop();
if(!m)return'no-modal'; const ta=m.querySelector('textarea'); if(!ta)return'no-ta';
ta.focus(); Object.getOwnPropertyDescriptor(window.HTMLTextAreaElement.prototype,'value').set.call(ta, ${JSON.stringify((IN.imgs||[]).join('\n'))});
ta.dispatchEvent(new Event('input',{bubbles:true})); ta.dispatchEvent(new Event('change',{bubbles:true}));
return 'n='+ta.value.split('\\n').filter(Boolean).length;})()`);
log('填URL:', f);
await wait(1200);
await c.evalJS(`(()=>{const m=[...document.querySelectorAll('.ant-modal')].filter(e=>e.offsetParent!==null).pop();
if(!m)return 0; const b=[...m.querySelectorAll('button')].find(x=>/^\\s*添加\\s*$/.test(x.innerText||''));
if(b) for(const ev of ['mousedown','mouseup','click']) b.dispatchEvent(new MouseEvent(ev,{bubbles:true,cancelable:true,view:window})); return 1;})()`);
await wait(15000);
}
const after=await c.evalJS(`(()=>{const it=[...document.querySelectorAll('.ant-form-item')].filter(e=>e.offsetParent!==null)
.find(x=>{const l=x.querySelector('label'); return l&&/产品图片/.test(l.innerText||'');});
const m=(it?it.innerText:'').match(/已经选用了\\s*(\\d+)\\s*张/); return m?Number(m[1]):-1;})()`);
log('补后图片数:', String(after));
// 3. 保存
await c.evalJS(`(()=>{const b=[...document.querySelectorAll('button')].filter(e=>e.offsetParent!==null&&/^\\s*保存\\s*$/.test((e.innerText||'').trim()));
const el=b[b.length-1]; el.scrollIntoView({block:'center'});
for(const ev of ['mousedown','mouseup','click']) el.dispatchEvent(new MouseEvent(ev,{bubbles:true,cancelable:true,view:window})); return 1;})()`);
let ok=false;
for(let i=0;i<16;i++){ await wait(800);
const m=await c.evalJS(`(()=>[...document.querySelectorAll('.ant-modal,.ant-message-notice')].some(e=>e.offsetParent!==null&&/成功/.test(e.innerText||'')))()`);
if(m){ ok=true; break; } }
log('保存:', ok?'成功':'未见成功提示');
process.exit(ok?0:3);