在跨境电商的日常运营中,选品和铺货是最耗费精力的环节。作为一个热衷于 Self-Hosted(自托管)的 HomeLab 玩家,我最近彻底跑通了一套全自动跨境选品与上架流水线。
该系统实现了:浏览器一键触发 – Webhook 接收 – 大模型 AI 洗稿翻译 – 多图拆分与商城草稿批量上传 – 自动化落库存档。
在这条“通车”之路上,我踩过了诸如跨节点数据“失忆”、JSON 被格式撑破、跨国电商平台前端汇率渲染欺骗等诸多硬核深坑。本文将毫无保留地把全套方案和核心避坑代码分享出来,帮你少走弯路。
🚀 系统核心架构与业务流
整套自动化方案完全基于开源工作流引擎 n8n 搭建,核心流程如下:
[浏览器一键书签 (JavaScript)]
│ (抓取前端展示价格与URL)
▼
[n8n Webhook 接收端]
│
├─► [AI 大模型/JavaScript 节点] (自动翻译洗稿、提取商品核心卖点)
├─► [Split Out & Aggregate 节点] (多图循环下载、上传至商城后端)
│
▼
[一键生成商城草稿] ──► [Google Sheets 选品审核表落库]

🛠️ 核心节点配置与防弹级代码实现
1. 浏览器前端书签(Bookmarklet)的“所见即所得”强化
痛点重现:很多跨境电商平台(如亚马逊)在切换货币(如将日元/美元切换为人民币 CNY)时,玩的是“前端视觉魔术”。底层 HTML 源码里的 Meta 数据依然是原始货币价格。如果书签脚本只传 URL 让后端重新爬取,AI 提取到的永远是原始货币,汇率天天在变,极难管理。
终极解决方案:直接把书签升级为“带摄像头的搬运工”,点击时直接扒下浏览器前端已经渲染好的、你肉眼看到的那个 CNY 价格,连同 URL 拼接发给 Webhook。
强化版一键抓取书签代码(新建浏览器书签,在网址栏填入以下单行代码):
JavaScript
javascript:(function(){var currentUrl=window.location.href;var priceEl=document.querySelector('.a-price .a-offscreen')||document.querySelector('#priceblock_ourprice')||document.querySelector('.a-color-price');var priceVal=priceEl?priceEl.innerText.replace(/[^0-9.]/g,''):'0';var webhookUrl='https://你的n8n域名.com/webhook/amazon-draft?url='+encodeURIComponent(currentUrl)+'&price='+priceVal;fetch(webhookUrl,{mode:'no-cors'}).then(()=>alert('🚀 链接及前端显示价格 (¥'+priceVal+') 已发送至 n8n!')).catch(err=>alert('⚠️ 发送失败,请检查 n8n 状态。'));})();
2. 跨节点数据“失忆”与可选链防崩技术
痛点重现:在 n8n 中,当商品数据经过 Split Out(拆分多图进行下载/上传)和 Aggregate(将多图重新打包成数组)后,工作流的“数据血统”会发生丢失。此时如果直接使用 $('节点名').item.json.xxx 去读取最初的标题、价格,n8n 极易返回 undefined。由于去掉了花括号外面的双引号,undefined 会直接撑破整个系统的 JSON 结构,导致全线崩溃。
终极解决方案:在接口的 JSON Body 里直接采用 “JavaScript 原生对象” + “.first() 强行置顶” + “?. 可选链防崩” 的防弹级写法。
💡 商城草稿节点 核心 Body 配置
无需再去头疼哪里该加双引号、哪里该去掉了!全盘交给 n8n 的表达式引擎,它会自动把格式转为标准后端所需的 JSON:
{{
{
"cate_id": [1],
"store_name": $('Code in JavaScript').first()?.json?.title || "未知商品",
"image": $('Aggregate').first()?.json?.crmeb_images?.[0] || "",
"slider_image": $('Aggregate').first()?.json?.crmeb_images || [],
"price": Number($('Webhook').first()?.json?.query?.price || 0),
"stock": 999,
"cost": 0,
"ot_price": Number($('Webhook').first()?.json?.query?.price || 0),
"is_show": 0,
"is_hot": 0,
"is_benefit": 0,
"is_best": 0,
"is_new": 0,
"is_postage": 0,
"is_good": 0,
"spec_type": 0,
"mer_use": 0,
"coupon_ids": [],
"label_id": [],
"command_word": "",
"items": [{ "value": "规格", "detail": ["默认"] }],
"attrs": [
{
"pic": $('Aggregate').first()?.json?.crmeb_images?.[0] || "",
"price": Number($('Webhook').first()?.json?.query?.price || 0),
"cost": 0,
"ot_price": Number($('Webhook').first()?.json?.query?.price || 0),
"stock": 999,
"weight": 0,
"volume": 0,
"bar_code": "",
"detail": { "规格": "默认" }
}
],
"description": Array.isArray($('Code in JavaScript').first()?.json?.description) ? $('Code in JavaScript').first()?.json?.description.join('<br><br>') : ($('Code in JavaScript').first()?.json?.description || "暂无详情")
}
}}
3. Google Sheets 团队协作选品表配置与时间轴加入
将数据落库到本地私有云(如私有表格 API)时容易遭遇封闭生态的阻碍,回归到原生的 Google Sheets 节点是极佳的选择。使用 OAuth2 凭据 绑定你自己的 Google 账号,能完美绕过服务账号复杂的权限分享步骤。
在表格中追加数据时,开启 fx 表达式模式,填入以下映射代码,并加入自动时区格式化:
| 表格列名 | n8n 表达式代码(防弹版本) |
| 商品标题 | `{{ $(‘Code in JavaScript’).first()?.json?.title |
| 人民币价格 | `{{ Number($(‘Webhook’).first()?.json?.query?.price |
| 核心卖点 | `{{ Array.isArray($(‘Code in JavaScript’).first()?.json?.description) ? $(‘Code in JavaScript’).first()?.json?.description.join(‘\n’) : ($(‘Code in JavaScript’).first()?.json?.description |
| 原始链接 | `{{ $(‘Webhook’).first()?.json?.query?.url |
| 商城主图 | `{{ $(‘Aggregate’).first()?.json?.crmeb_images?.[0] |
| 采集时间 | {{ $now.setZone('Asia/Shanghai').toFormat('yyyy-MM-dd HH:mm:ss') }} |
🔥 协作小贴士:配置完成后,直接在谷歌表格右上角点击“共享”,将你同事的 Gmail 邮箱添加为“编辑者 (Editor)”。这样她就可以在微信或手机端随时协同审核、修改价格,而不会对后端的自动采集产生任何干扰。
🏆 填坑心得与 HomeLab 总结
- 别跟不开放的本地应用底层 API 死磕:本地私有表格接口文档如果模糊不清、缺乏独立鉴权,果断转向生态完善的中间件(如 Google Sheets 节点或原生的 MySQL/MariaDB 节点),能省下大量调试网关和 Cookie 的宝贵时间。
- 防弹代码(Optional Chaining)是硬道理:大模型每次吐出的 JSON 字段可能并不稳定(有时是数组,有时是纯文本)。如果不加
?.、Array.isArray()的类型判断以及||的默认保底,只要有一条商品数据缺失了字段,整条自动化流水线就会全线崩溃。 - 数据记得定时备份:流水线跑通后,千万记得点击 n8n 界面右上角的
...->Download导出 JSON。对于 Docker 用户,定期对挂载的.n8n/database.sqlite文件进行冷备份,就是给全套自动化成果买的“终身保险”。
这套选品系统运行两周以来,数据抓取准确率稳定在 100%。如果你也在用 n8n 优化自己的电商供应链或自媒体工作流,欢迎在评论区一起交流更多极客玩法!