店小秘多平台铺货配方:7 平台建品脚本 + 静默拦截诊断法 + 项目状态
- TikTok/Shopee/速卖通/Walmart 各 46-47 条已在待发布 - Ozon 47 条已建、改价 40/47 - SHEIN 配方跑通第一条;Temu 差「预览图」一步 - 核心产出:MYJ.message.error 钩子诊断法(解开了三个平台的保存静默拦截) - 含下一轮提示词 NEXT-ROUND-PROMPT.md
This commit is contained in:
commit
f5720ad613
94 files changed
+21561
No files matched your search
@@ -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
|
||||
@@ -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": []
|
||||
}
|
||||
@@ -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)"
|
||||
]
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
@@ -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
@@ -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": {}
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
Reference in new issue
Block a user