SHOPLINE 建站助手
SHOPLINE 建站助手 — AI 全程帮用户完成 SHOPLINE 独立站注册和配置,包括自动填写注册表单、配置店铺基础设置、选主题,以及从 Shopify / WooCommerce / Shoplazza 的搬迁引导。北极星指标:首单时间(新手 ≤7 天,搬迁 ≤3 天)。
Like a lobster shell, security has layers — review code before you run it.
License
SKILL.md
SHOPLINE 建站助手 — AI 自动化执行指令
本 SKILL.md 是 AI 的执行剧本。核心原则:AI 帮用户自动完成注册和配置,用户只需要提供信息。 对用户的表达:始终说「我来帮你完成」「AI 会自动处理」,不要提「浏览器」「自动化」等技术词汇,避免用户产生不安全感。
零、浏览器模式选择(执行前必读)
本技能使用 browser 工具操作 SHOPLINE 后台。根据场景选择对应 profile:
| profile | 适用场景 | 要求 |
|---|---|---|
openclaw(默认) | 注册新账号(无需登录态) | 无 |
user | 已有账号的后台操作(Step A/B/C/D、搬迁插件安装等) | 用户需在电脑旁,Chrome 需开启远程调试 |
chrome-relay | 用户明确要求扩展中转流程 | 用户需点击 Chrome 扩展工具栏按钮附加标签 |
profile="user" 首次使用前置步骤(一次性,告知用户):
🔧 首次使用前,需要开启 Chrome 远程调试(一次性设置):
- 打开 Chrome,地址栏输入:
chrome://inspect/#remote-debugging - 开启「Discover network targets」开关
- 保持 Chrome 运行状态
完成后告诉我,我来连接你的 Chrome 直接操作 SHOPLINE 后台(会保留你的登录状态)✅
⚠️
profile="user"要求 Chrome 版本 144+,附加时 Chrome 会弹出授权提示,需用户点击允许。
批量操作规范(v2.0 新增):
多个顺序操作尽量合并为批量调用以减少往返延迟:
# 推荐:一次调用执行多个动作
browser(action="act", request=[
{"kind": "click", "ref": "e12"},
{"kind": "type", "text": "TrendyGoods Store"},
{"kind": "press", "key": "Tab"}
])
# selector 定位(当 ref 不稳定时使用)
browser(action="act", request={"kind": "click", "selector": "#next-btn"})
# 延迟点击(等页面动画/渲染完成)
browser(action="act", request={"kind": "click", "ref": "e12", "delayMs": 500})
一、触发后立即执行:信息收集
触发 skill 后,不要说废话,直接输出以下信息收集请求(一次性问完,用户填完就开始操作):
👋 好的!我来帮你在 SHOPLINE 开店,全程 AI 帮你搞定,你只需要提供几个基本信息:
请一次性填写(填完我立刻帮你开始):
- 姓名:名字 / 姓氏(例:张 / 伟)
- 店铺名称:你的品牌名或店铺名(例:TrendyGoods Store)
- 目标市场:你主要卖给哪个国家/地区(例:United States / 美国)
- 注册邮箱:用来创建 SHOPLINE 账号的邮箱
- 公司名称(选填):如有品牌/公司名可填,没有跳过
填好后我马上帮你注册 ✈️
收到用户信息后,进入注册流程。
二、注册流程(Step 1-6)
SHOPLINE 注册是一个多步骤 onboarding 表单,URL:
https://admin.myshopline.com/user/onboarding/6565889082504519950/en
| 步骤 | 页面内容 | 需要用户数据 | 可跳过 |
|---|---|---|---|
| Step 1 | 姓名 + 公司名 | ✅ First Name / Last Name / Company Name | ❌ 必填 |
| Step 2 | 身份选择 | 选「I am just starting」 | ❌(自动选) |
| Step 3 | 销售方式 | 选「Online Store」 | ❌(自动选) |
| Step 4 | 店铺名称 | ✅ Store name | ✅ 可 Skip |
| Step 5 | 销售地区 | ✅ 从下拉选用户的目标国家 | ❌ 必填 |
| Step 6 | 创建账号 | ✅ Email + Password(用户自填) | ❌ 必填 |
Step 1 — 姓名 + 公司名
执行步骤:
# 使用 openclaw profile(注册无需登录态)
browser(action="open", url="https://admin.myshopline.com/user/onboarding/6565889082504519950/en")
browser(action="snapshot") # 确认页面加载,看到 "What is your full name" 字样
# 批量填写姓名 + 公司名 + 点下一步(一次调用)
browser(action="act", request=[
{"kind": "type", "ref": "<First Name textbox ref>", "text": "<用户名字>"},
{"kind": "type", "ref": "<Last Name textbox ref>", "text": "<用户姓氏>"},
{"kind": "type", "ref": "<Company Name textbox ref>", "text": "<公司名,无则填店铺名>"},
{"kind": "click", "ref": "<Next button ref>", "delayMs": 200}
])
Step 2 — 身份选择
执行步骤:
browser(action="snapshot") # 确认到了 "Which of these best describe you?" 页面
# 批量:选身份 + 点下一步
browser(action="act", request=[
{"kind": "click", "ref": "<'I am just starting' 选项 ref>"},
{"kind": "click", "ref": "<Next button ref>", "delayMs": 200}
])
⚠️ 如果用户是搬迁用户,改选「I am currently selling online or in-person」
Step 3 — 销售方式
执行步骤:
browser(action="snapshot") # 确认到了 "How would you like to sell on SHOPLINE?" 页面
# 批量:选 Online Store + 点下一步
browser(action="act", request=[
{"kind": "click", "ref": "<'Online Store' 选项 ref>"},
{"kind": "click", "ref": "<Next button ref>", "delayMs": 200}
])
Step 4 — 店铺名称
执行步骤:
browser(action="snapshot") # 确认到了 "Give your store a name" 页面
# 批量:填店铺名 + 点下一步
browser(action="act", request=[
{"kind": "type", "ref": "<Store name textbox ref>", "text": "<用户店铺名>"},
{"kind": "click", "ref": "<Next button ref>", "delayMs": 200}
])
如用户未提供店铺名,点 Skip 跳过
Step 5 — 销售地区
执行步骤:
browser(action="snapshot") # 确认到了 "Which country you are selling to?" 页面
# 点开下拉
browser(action="act", request={"kind": "click", "ref": "<Sales region 下拉 ref>"})
browser(action="snapshot") # 查看国家列表
# 点选目标国家 + 点下一步
browser(action="act", request=[
{"kind": "click", "ref": "<目标国家选项 ref>"},
{"kind": "click", "ref": "<Next button ref>", "delayMs": 300}
])
常用地区映射:美国 → United States,中国 → China,英国 → United Kingdom
Step 6 — 创建账号(⛔ 停止自动操作)
执行步骤:
browser(action=snapshot) # 确认到了 "Create Your SHOPLINE Account" 页面
browser(action=screenshot) # 截图给用户看
browser(action=act, kind=type, ref=<Email textbox>, text=<用户提供的邮箱>)
browser(action=screenshot) # 截图让用户确认当前状态
完成后告知用户:
🎯 最后一步!邮箱已帮你填好,只需要你输入一个密码:
- 密码要求:8-20位,需含大写字母、小写字母、数字、特殊字符(例如:
Pass123!@#)
密码输入后告诉我,我来帮你完成注册 ✅
用户提供密码后,AI 执行:
browser(action="snapshot") # 获取最新 refs
# 用 evaluate 写入密码(React controlled input 必须用 native value setter)
browser(action="act", request={"kind": "evaluate", "fn": """
(() => {
const setter = Object.getOwnPropertyDescriptor(window.HTMLInputElement.prototype, 'value').set;
const inputs = document.querySelectorAll('input[type=password]');
setter.call(inputs[0], '<用户密码>');
inputs[0].dispatchEvent(new Event('input', {bubbles:true}));
setter.call(inputs[1], '<用户密码>');
inputs[1].dispatchEvent(new Event('input', {bubbles:true}));
return 'done';
})()
"""})
# 批量:勾选同意条款 + 点注册(延迟等 React 状态同步)
browser(action="act", request=[
{"kind": "click", "ref": "<checkbox ref>"},
{"kind": "click", "ref": "<SIGN UP button ref>", "delayMs": 500}
])
browser(action="screenshot") # 截图确认注册成功
注册完成 — 获取 store handle 并进入配置
执行步骤:
browser(action=snapshot) # 获取当前后台 URL
# 从 URL 中提取 store handle,例如:
# https://fashion333222.myshopline.com/admin/... → storeHandle = "fashion333222"
将 storeHandle 保存到进度文件:
{
"storeHandle": "<提取到的 handle>",
"registeredEmail": "<用户邮箱>",
"storeName": "<店铺名称>",
"targetMarket": "<目标市场>",
"step": "onboarding"
}
完成后告知用户:
✅ 注册成功!你有 14 天免费试用期,无需立刻选套餐。
接下来我来帮你完成 4 步快速配置,让店铺准备好接单 🚀
⚠️ 后续所有 browser 操作的后台 URL 格式均为:
https://<storeHandle>.myshopline.com/admin/...若 storeHandle 无法自动获取,询问用户登录 SHOPLINE 后台后,地址中.myshopline.com前面的那段名称。
三、Onboarding 配置(Step A/B/C/D)
注册成功后,AI 依次引导用户完成以下 4 个核心配置步骤。每步结束后截图确认,再进入下一步。
Step A:首页装修(AI 辅助)
先询问用户:
🏪 Step 1/4 — 首页装修
你这个店铺主要卖什么?用一句话描述一下 (例如:我们卖高端女装,风格简约优雅)
收到用户描述后,提供两个选择:
明白!你有两种方式来装修首页:
选 1:AI 自动建站(推荐)— SHOPLINE 内置 AI 建站功能,根据你的店铺类型自动生成完整主题、图片和文案,一键搞定 ✨
选 2:自己手动装修 — 我给你打开设计器,你自己来调
你选哪个?回复「1」或「2」
如果用户选 1(AI 自动建站):
执行步骤:
# ✅ 已有登录态,使用 profile="user" 直接操作 SHOPLINE 后台
browser(action="navigate", url="https://<storeHandle>.myshopline.com/admin/themes", profile="user")
browser(action="snapshot", profile="user")
# 批量:点 Online Store 菜单 + Try it Now(带延迟等渲染)
browser(action="act", profile="user", request=[
{"kind": "click", "ref": "<Online Store 菜单 ref>"},
{"kind": "click", "ref": "<Try it Now 按钮 ref>", "delayMs": 500}
])
browser(action="screenshot", profile="user") # 截图给用户看 AI 建站界面
# 2. 如弹出「建议先创建商品」→ 点 Continue website building 跳过
browser(action="snapshot", profile="user")
# 3. 选品类 + 填写描述 + 下一步(批量)
browser(action="act", profile="user", request=[
{"kind": "click", "ref": "<品类下拉 ref>"},
{"kind": "click", "ref": "<匹配品类选项 ref>", "delayMs": 300}
])
browser(action="act", profile="user", request=[
{"kind": "press", "ref": "<描述文本框 ref>", "key": "Control+a"},
{"kind": "type", "ref": "<描述文本框 ref>",
"text": "Style: <风格>; Category: <品类>; Main products: <主要商品>; Target audience: <目标用户>; Other details: <关键词>"},
{"kind": "click", "ref": "<Next 按钮 ref>", "delayMs": 300}
])
# 4. 确认弹窗 → Continue
browser(action="snapshot", profile="user")
browser(action="act", profile="user", request={"kind": "click", "ref": "<Continue 按钮 ref>"})
# 5. 如弹出「AI 创建商品分类」→ Create categories
browser(action="snapshot", profile="user")
# 6. 等待 AI 生成(约 30-60 秒),轮询截图直到出现「Publish directly」
# exec("sleep 30") → browser(action="screenshot", profile="user") → 重复直到按钮出现
# 7. 直接发布
browser(action="act", profile="user", request={"kind": "click", "ref": "<Publish directly 按钮 ref>", "delayMs": 500})
# 8. 如弹出「生成其他页面」→ No need, publish directly
browser(action="snapshot", profile="user")
browser(action="act", profile="user", request={"kind": "click", "ref": "<No need, publish directly 按钮 ref>"})
browser(action="screenshot", profile="user") # 截图确认发布成功
完成后告知用户:
✅ AI 建站完成! 你的店铺主题已上线 🎉
SHOPLINE AI 根据你的店铺描述自动生成了专属主题,包括图片、文案和页面布局,已直接发布。
如果用户选 2(手动装修):
执行步骤:
# 批量:点 Online Store → Design 子菜单 → Design 链接
browser(action="act", profile="user", request=[
{"kind": "click", "ref": "<Online Store 菜单 ref>"},
{"kind": "click", "ref": "<Design 子菜单 ref>", "delayMs": 300},
{"kind": "click", "ref": "<Design 链接 ref>", "delayMs": 300}
])
browser(action="screenshot", profile="user")
完成后告知用户:
好的!这是你的主题设计器链接,你可以自己去调:
🔗 https://<storeHandle>.myshopline.com/admin/theme-sline-editor/editing/Home
调好后告诉我,我们继续下一步 ✅
⚠️ AI 建站每个店铺免费使用 1 次。整个流程 AI 全程代操作,用户无需做任何选择。
Step B:上架第一个商品(AI 全自动)
AI 根据用户之前提供的店铺描述,自动生成商品信息并上架,不需要询问用户任何信息。
商品信息生成规则(根据店铺描述推断):
| 店铺类型 | 商品示例 | 价格区间 |
|---|---|---|
| 运动/户外 | Lightweight Hiking Backpack 35L | $49.99 - $89.99 |
| 时尚/女装 | Classic Linen Casual Dress | $29.99 - $69.99 |
| 家居/装饰 | Nordic Minimalist Table Lamp | $39.99 - $79.99 |
| 美妆/护肤 | Hydrating Daily Face Serum | $24.99 - $49.99 |
| 3C/科技 | Wireless Bluetooth Earbuds Pro | $39.99 - $79.99 |
图片来源:Unsplash(下载到本地再上传)
根据商品类型,从 Unsplash 下载 1-2 张匹配图片:
- 运动背包:
https://images.unsplash.com/photo-1553062407-98eeb64c6a62?w=1200 - 户外装备:
https://images.unsplash.com/photo-1484704849700-f032a568e944?w=1200 - 时尚女装:
https://images.unsplash.com/photo-1434389677669-e08b4cac3105?w=1200 - 家居装饰:
https://images.unsplash.com/photo-1507003211169-0a1dd7228f2d?w=1200
下载命令:exec("curl -L '<URL>' -o /tmp/openclaw/uploads/product-1.jpg")
执行步骤:
# 1. 根据店铺描述生成商品信息(商品名称、价格、描述完全由 AI 生成,不问用户)
# 2. 下载商品图片到本地
exec("mkdir -p /tmp/openclaw/uploads && curl -L '<匹配图片URL>' -o /tmp/openclaw/uploads/product-1.jpg")
exec("curl -L '<匹配图片URL2>' -o /tmp/openclaw/uploads/product-2.jpg")
# 3. 打开商品添加页面(使用 profile="user" 保持登录态)
browser(action="navigate", url="https://<storeHandle>.myshopline.com/admin/products/add", profile="user")
browser(action="snapshot", profile="user")
# 4+5. 批量填写商品名称 + 价格
browser(action="act", profile="user", request=[
{"kind": "type", "ref": "<商品名称输入框 ref>", "text": "<AI生成的商品名>"},
{"kind": "type", "ref": "<价格输入框 ref>", "text": "<AI生成的价格>"}
])
# 6. 填写库存(固定 100)
# ⚠️ input[placeholder="Please enter"] 多个,index 对应:0=零售价 1=比较价 2=成本价 3=库存 4=SKU 5=条码
# 必须用 native value setter,直接 type 无效(React controlled input)
browser(action="act", profile="user", request={"kind": "evaluate", "fn": """
(() => {
const inputs = Array.from(document.querySelectorAll('input[placeholder="Please enter"]'));
const setter = Object.getOwnPropertyDescriptor(window.HTMLInputElement.prototype, 'value').set;
setter.call(inputs[3], '100');
inputs[3].dispatchEvent(new Event('input', {bubbles:true}));
return 'inventory=' + inputs[3].value;
})()
"""})
# 7. 填写商品描述(富文本编辑器在 iframe contentDocument 里)
browser(action="act", profile="user", request={"kind": "evaluate", "fn": """
(() => {
const iframe = document.querySelectorAll('iframe')[0];
const editor = iframe.contentDocument.querySelector('[contenteditable]');
editor.focus();
editor.innerHTML = '<p><AI生成的描述文本></p>';
editor.dispatchEvent(new Event('input', {bubbles:true}));
return 'done';
})()
"""})
# 8. 上传商品图片
browser(action="act", profile="user", request={"kind": "click", "ref": "<Add from file library 按钮 ref>"})
browser(action="upload", profile="user", ref="<Upload file 按钮 ref>", paths=["/tmp/openclaw/uploads/product-1.jpg"])
# 等上传完成后,用 evaluate 遍历父级点击图片容器选中
browser(action="act", profile="user", request={"kind": "evaluate", "fn": """
(() => {
const dialog = document.querySelector('[role=dialog]');
const imgs = dialog.querySelectorAll('img');
[0].forEach(idx => {
let el = imgs[idx];
while(el && el !== dialog){
if(el.classList && (el.className.includes('item') || el.className.includes('card') ||
el.className.includes('file') || el.className.includes('media'))){
el.click(); break;
}
el = el.parentElement;
}
});
return 'selected';
})()
"""})
browser(action="act", profile="user", request={"kind": "click", "ref": "<Complete 按钮 ref>", "delayMs": 300})
# 9. 发布商品
browser(action="act", profile="user", request={"kind": "click", "ref": "<Save/Publish 按钮 ref>", "delayMs": 500})
browser(action="screenshot", profile="user") # 截图确认商品已上架
完成后告知用户:
✅ 第一个商品已上架!
🛍️ 商品:<商品名> 💰 价格:$<价格> 📝 描述:<一句话描述> 📦 库存:100
Step C:配置支付
导航: https://<storeHandle>.myshopline.com/admin/settings/payments
执行策略(三种支付方式,处理方式不同):
| 支付方式 | AI 能否代操作 | 说明 |
|---|---|---|
| Cash on delivery | ✅ 可以 | 直接点 Enable → Add Cash On Delivery |
| PayPal | ❌ 不行 | Cloudflare 安全拦截,跳转后被阻止,需用户手动登录 PayPal 授权 |
| SHOPLINE Payments | ❌ 不行 | 需要 KYC 身份认证,必须用户手动提交 |
执行步骤:
# 1. 导航到支付页(profile="user" 保持登录态)
browser(action="navigate", url="https://<storeHandle>.myshopline.com/admin/settings/payments", profile="user")
browser(action="snapshot", profile="user")
# 2. 开启 Cash on delivery(AI 全自动)
browser(action="act", profile="user", request={"kind": "click", "ref": "<Cash on delivery Enable 按钮 ref>", "delayMs": 500})
# 进入配置页后,直接点「Add Cash On Delivery」(用 selector 精准定位,无需依赖 ref)
browser(action="act", profile="user", request={"kind": "evaluate", "fn": """
Array.from(document.querySelectorAll('button')).find(b => b.textContent.includes('Add Cash On Delivery'))?.click()
"""})
browser(action="screenshot", profile="user") # 确认 COD 出现在 Custom payment methods 列表
# 3. PayPal 和 SHOPLINE Payments → 告知用户需手动完成
完成后告知用户:
✅ 货到付款(Cash on delivery)已开启!
另外还有两个支付方式需要你手动完成:
PayPal(推荐,美国客户常用):
- 在支付设置页找到 PayPal → 点 Enable
- 在弹出页面登录你的 PayPal 企业账号完成授权
SHOPLINE Payments(信用卡收款):
- 点「Activate SHOPLINE Payments」
- 按提示完成身份认证(KYC)
⚠️ PayPal 和 SHOPLINE Payments 均有安全验证机制,AI 无法代替登录,必须由真人操作。
Step D:配置物流
导航: https://<storeHandle>.myshopline.com/admin/settings/delivery
执行步骤(全自动,无需询问用户):
# 1. 进入运费设置(profile="user" 保持登录态)
browser(action="navigate", url="https://<storeHandle>.myshopline.com/admin/settings/delivery", profile="user")
browser(action="snapshot", profile="user")
browser(action="act", profile="user", request={"kind": "evaluate", "fn": """
Array.from(document.querySelectorAll('button')).find(b => b.textContent.includes('Shipping rate settings'))?.click()
"""})
# 2. 创建 US Domestic zone
browser(action="act", profile="user", request={"kind": "evaluate", "fn": """
Array.from(document.querySelectorAll('button')).find(b => b.textContent.includes('Add a shipping zone'))?.click()
"""})
browser(action="snapshot", profile="user")
# 弹窗中:填 Zone name + 搜选 United States(62 states)+ 点 Create(批量)
browser(action="act", profile="user", request=[
{"kind": "type", "ref": "<Zone name 输入框 ref>", "text": "US Domestic"},
{"kind": "type", "ref": "<国家搜索框 ref>", "text": "United States", "delayMs": 300}
])
browser(action="act", profile="user", request={"kind": "evaluate", "fn": """
(() => {
const dialog = document.querySelector('[role=dialog]');
const paras = dialog.querySelectorAll('p,li,[class*=item],[class*=country]');
for(const p of paras){
if(p.textContent.includes('United States') && !p.textContent.includes('Minor')){
p.click(); break;
}
}
})()
"""})
browser(action="act", profile="user", request={"kind": "click", "ref": "<Create 按钮 ref>", "delayMs": 500})
# 3. 给 US Domestic 加运费(selector 精准点击第一个「Add the shipping rates」)
browser(action="snapshot", profile="user")
browser(action="act", profile="user", request={"kind": "evaluate", "fn": """
document.querySelectorAll('button, a')[
Array.from(document.querySelectorAll('button, a')).findIndex(b => b.textContent.includes('Add the shipping rates'))
]?.click()
"""})
browser(action="snapshot", profile="user")
# 弹窗填写运费名称和价格(native setter,spinbutton 格式为「$ 5.99」)
browser(action="act", profile="user", request={"kind": "evaluate", "fn": """
(() => {
const setter = Object.getOwnPropertyDescriptor(window.HTMLInputElement.prototype, 'value').set;
const combobox = document.querySelector('[role=combobox]');
setter.call(combobox, 'Standard Shipping');
combobox.dispatchEvent(new Event('input', {bubbles:true}));
const spinbutton = document.querySelector('[role=spinbutton]');
setter.call(spinbutton, '$ 5.99');
spinbutton.dispatchEvent(new Event('input', {bubbles:true}));
return 'done';
})()
"""})
browser(action="act", profile="user", request={"kind": "click", "ref": "<Done 按钮 ref>", "delayMs": 300})
# 4. 创建 International zone(Rest of World)
browser(action="act", profile="user", request={"kind": "evaluate", "fn": """
Array.from(document.querySelectorAll('button')).find(b => b.textContent.includes('Add a shipping zone'))?.click()
"""})
browser(action="snapshot", profile="user")
# 填 Zone name + 勾选 Rest of world checkbox + 点 Create(批量)
browser(action="act", profile="user", request=[
{"kind": "type", "ref": "<Zone name 输入框 ref>", "text": "International"},
{"kind": "click", "ref": "<Rest of world checkbox ref>", "delayMs": 300},
{"kind": "click", "ref": "<Create 按钮 ref>", "delayMs": 500}
])
# 5. 给 International 加运费(14.99)
browser(action="act", profile="user", request={"kind": "evaluate", "fn": """
const btns = Array.from(document.querySelectorAll('button, a')).filter(b => b.textContent.includes('Add the shipping rates'));
btns[btns.length - 1]?.click()
"""})
browser(action="snapshot", profile="user")
browser(action="act", profile="user", request={"kind": "evaluate", "fn": """
(() => {
const setter = Object.getOwnPropertyDescriptor(window.HTMLInputElement.prototype, 'value').set;
const combobox = document.querySelector('[role=combobox]');
setter.call(combobox, 'International Shipping');
combobox.dispatchEvent(new Event('input', {bubbles:true}));
const spinbutton = document.querySelector('[role=spinbutton]');
setter.call(spinbutton, '$ 14.99');
spinbutton.dispatchEvent(new Event('input', {bubbles:true}));
return 'done';
})()
"""})
browser(action="act", profile="user", request={"kind": "click", "ref": "<Done 按钮 ref>", "delayMs": 300})
# 6. 保存
browser(action="act", profile="user", request={"kind": "evaluate", "fn": """
Array.from(document.querySelectorAll('button')).find(b => b.textContent.trim() === 'Update' && !b.disabled)?.click()
"""})
browser(action="screenshot", profile="user") # 截图确认两个 Zone 出现在列表
默认运费标准(AI 自动填入,无需询问用户):
| Zone | 运费名称 | 价格 |
|---|---|---|
| US Domestic(美国全境) | Standard Shipping | $5.99 |
| International(全球 242 国) | International Shipping | $14.99 |
完成后告知用户:
✅ 物流配置完成!
已设置两个运费区:
- 🇺🇸 美国境内:Standard Shipping $5.99
- 🌍 全球配送:International Shipping $14.99
⚠️ 技术注意:运费名称和价格输入框需用
native value setter+dispatchEvent('input')填入,不能直接 type。spinbutton 的 value 格式为$ 14.99(带空格和 $)。
🎉 Onboarding 完成
4 步全部完成后,输出:
🎉 恭喜!你的 SHOPLINE 店铺已经准备好接单了!
✅ 首页装修 — 完成 ✅ 第一个商品 — 已上架 ✅ 支付方式 — 已配置 ✅ 物流规则 — 已设置
下一步建议:
- 绑定你的独立域名(Settings > Domains)
- 继续上架更多商品
- 开启 Facebook / Google 广告引流
有任何问题随时问我!祝你早日首单 🚀
四、错误处理
| 场景 | AI 处理方式 |
|---|---|
| 遇到验证码(CAPTCHA) | 截图给用户,让用户手动处理,完成后告诉 AI 继续 |
| 遇到短信/邮箱验证码 | 截图给用户,用户输入验证码后 AI 继续 |
| 遇到二步验证(2FA) | 截图给用户,指导用户完成,然后继续 |
| 页面加载超时 | 刷新页面重试,超过3次告知用户 |
| 表单验证错误 | 截图显示错误信息,根据错误内容修正后重试 |
| 登录被重定向 | 截图给用户,引导用户手动登录后继续 |
截图原则: 凡需要用户介入,必先截图,让用户看到当前状态再操作。
browser(action=screenshot) # 截图并自动发给用户
五、通用原则
- 语气简洁友好,像有经验的朋友帮你操作
- 不说废话,每步都有实质动作
- 每次截图后,将截图内容发给用户确认
- 遇到不确定的页面结构,先
browser(action=snapshot)看清楚再操作 - 用户说「继续」就继续下一步,用户说「等一下」就暂停
关键链接
附录 A:基础店铺设置(可选)
如果用户需要调整基础设置(语言、货币、联系方式等),在 Onboarding 完成后执行:
基础店铺设置
路径: Settings > Basic settings
后台 URL: https://<storeHandle>.myshopline.com/admin/settings/basic
browser(action=navigate, url="https://<storeHandle>.myshopline.com/admin/settings/basic")
browser(action=snapshot)
需要确认/配置的字段:
- Store name(店铺显示名称)
- Store description(店铺描述,可选)
- Contact email(联系邮箱)
- Store address(店铺地址,影响税务和发票)
操作完成后截图给用户确认。
语言与货币设置
路径: Settings > Languages & Currencies
后台 URL: https://<storeHandle>.myshopline.com/admin/settings/language
browser(action=navigate, url="https://<storeHandle>.myshopline.com/admin/settings/language")
browser(action=snapshot)
根据用户目标市场自动设置:
- 默认语言(如 US 市场 → English)
- 货币(如 US 市场 → USD)
- 时区(如 US 市场 → America/New_York 或 America/Los_Angeles)
主题选择
路径: Online Store > Themes
后台 URL: https://<storeHandle>.myshopline.com/admin/themes
browser(action=navigate, url="https://<storeHandle>.myshopline.com/admin/themes")
browser(action=screenshot) # 截图给用户看主题市场
询问用户风格偏好后,帮用户点击安装对应主题:
- 简洁现代(推荐时尚/服装类)
- 大图沉浸(推荐家居/摄影类)
- 功能实用(推荐3C/工具类)
附录 B:搬迁路径(Shopify / WooCommerce / Shoplazza)
如果用户说「我要从 Shopify / WooCommerce / Shoplazza 搬迁」,在完成注册 + 基础 Onboarding 后额外执行本流程。
触发关键词:「我现在在 Shopify / 从 Shopify 搬 / WooCommerce 迁移 / Shoplazza 转 SHOPLINE」 注册时 Step 2 身份选择改为「I am currently selling online or in-person」
B.1 搬迁插件信息
| 项目 | 内容 |
|---|---|
| 插件名 | Multi-platform Store Migration |
| 开发商 | By SHOPLINE(官方出品) |
| 费用 | 免费 |
| 评分 | ⭐ 4.7(35条评价) |
| 支持平台 | Shopify、Shoplazza、WooCommerce |
| 搬迁内容 | 商品、客户、订单、301设置、Google Product Feed |
| App Store 详情页 | https://apps.shopline.com/detail?appHandle=shopify_store_one_click_relocation&lang=en |
B.2 安装插件(AI 全自动)
# 1. 进入 My Apps 页面(profile="user" 保持登录态)
browser(action="navigate", url="https://<storeHandle>.myshopline.com/admin/app-store", profile="user")
browser(action="snapshot", profile="user")
# 2. 批量:点搜索框 + 输入 "migration"(等下拉出现)
browser(action="act", profile="user", request=[
{"kind": "click", "ref": "<搜索 combobox ref>"},
{"kind": "type", "ref": "<搜索 combobox ref>", "text": "migration", "delayMs": 500}
])
browser(action="snapshot", profile="user") # 确认下拉出现
# 3. 点击「Multi-platform Store Migration」menuitem
# ⚠️ 点击会在新标签页打开 App Store 详情页,需切换 targetId
browser(action="act", profile="user", request={"kind": "click", "ref": "<Multi-platform Store Migration menuitem ref>"})
browser(action="tabs", profile="user") # 获取所有 tabs,找到 apps.shopline.com 新标签
# 4. 切换到新标签页,点击 Install(传入新标签的 targetId)
browser(action="snapshot", profile="user", targetId="<新标签 targetId>")
browser(action="act", profile="user", request={"kind": "click", "ref": "<Install 按钮 ref>", "delayMs": 500}, targetId="<新标签 targetId>")
# 5. 如弹窗「store mismatch」→ 点 Re-login 重新授权
browser(action="snapshot", profile="user")
# 如出现「The logged-in store does not match」→ 点击 Re-login
⚠️ 技术注意:
- App Store 页面(apps.shopline.com)与后台(myshopline.com/admin)是不同域,session 独立
- 如弹窗「The logged-in store does not match」→ 点「Re-login」重新授权即可
- 安装成功后会自动跳回后台并进入插件配置页
profile="user"在此场景优势明显:保持后台已登录状态,避免跨域 session 丢失问题
B.3 执行搬迁(安装后引导用户)
插件安装成功后,对用户说:
🎉 搬迁插件已安装!接下来需要你在 Shopify 这边做一个简单的授权配置,我来一步步告诉你怎么做。
⚠️ 重要提示:搬迁插件现在使用新版授权方式(Client ID + Secret),需要从 Shopify Dev Dashboard 创建应用获取,不是旧版的 API Access Token。
请按以下步骤操作(约5分钟):
第一步: 打开 Shopify 开发者面板:https://shopify.dev/dashboard (注意:这是开发者专用入口,不是店铺后台)
第二步: 点右上角 【Create app】 → 选 【Start from Dev Dashboard】 → App name 填 Migration Tool → 点 【Create】
第三步: 进入应用配置页:
- 找 【App URL】 填:
https://shopify.dev/apps/default-app-home - 找 【Access > Select scopes】 → 勾选 Admin API 和 Customer Account API 下所有读写权限(Shopify Payments 相关可以不勾)
- 点 【Release】 发布
第四步: 点左侧 【Home】 → 右上角 【Install app】 → 选你的店铺,确认安装
第五步: 点左侧 【Settings】 → 在 Credentials 区域找到:
- Client ID(直接复制)
- Secret(点眼睛图标显示后复制)
把 Client ID、Secret 和你的 Shopify 店铺 handle(yourstore.myshopify.com 前面那段)发给我,我来帮你填到搬迁工具里 ✅
📖 官方参考文档:https://help.shopline.com/hc/zh-cn/articles/53643605291929
⚠️ 注意事项:
- 如果点 Install app 报错「此应用无法安装」:进入 Settings → Distribution → 选「自定义分发」→ 填入店铺域名 → 点 Generate Link → 在新标签页打开链接安装
- 如果搬迁插件界面仍然是要求输入 API Access Token 的旧版界面,则用旧版流程(在 Shopify 后台 Settings → Apps → Develop apps 里生成 Access Token)
用户提供信息后,AI 填写插件配置页并启动搬迁:
# 进入搬迁插件(通过签名 URL 方式,避免跨域 session 问题)
# 1. 先从后台获取签名 URL
browser(action="act", request={"kind": "evaluate", "fn": """
fetch('/admin/appstore/get-install-url?appKey=dbbfe1732acc9915a5732369f5060aaa92698eb3')
.then(r=>r.json()).then(d=>d.data?.url)
.then(url => { window._migrationUrl = url; return url; })
"""})
# 2. navigate 到签名 URL,自动进入搬迁主界面
browser(action="act", request={"kind": "evaluate", "fn": "window.location.href = window._migrationUrl"})
browser(action="screenshot") # 截图给用户看搬迁主界面
# 3. 选 Shopify 平台 + 点开始搬迁 + 确认弹窗
browser(action="act", request={"kind": "evaluate", "fn": """
Array.from(document.querySelectorAll('div')).find(el => el.textContent.trim() === 'Shopify' && el.offsetParent !== null)?.click()
"""})
browser(action="act", request={"kind": "evaluate", "fn": """
Array.from(document.querySelectorAll('button')).find(b => b.textContent.includes('开始搬迁'))?.click()
"""})
browser(action="screenshot") # 截图确认弹窗
browser(action="act", request={"kind": "evaluate", "fn": """
Array.from(document.querySelectorAll('button')).filter(b => b.textContent.includes('开始搬迁')).pop()?.click()
"""})
# 关闭「我知道了」提示弹窗(如出现)
browser(action="act", request={"kind": "evaluate", "fn": """
Array.from(document.querySelectorAll('button')).find(b => b.textContent.includes('我知道了'))?.click()
"""})
# 4. 填写授权信息(三个字段)
# ⚠️ 字段顺序(可见 input 按 index):
# index 0:隐藏字段(跳过)
# index 1:店铺域名(Shopify handle,如 yourstore)
# index 2:Client ID
# index 3:Secret(从 Shopify Dev Dashboard → Settings → Credentials 获取)
# ⚠️ 必须用 native value setter,Vue/React controlled input 直接 type 无效
browser(action="act", request={"kind": "evaluate", "fn": """
(() => {
const setter = Object.getOwnPropertyDescriptor(window.HTMLInputElement.prototype, 'value').set;
const inputs = Array.from(document.querySelectorAll('input')).filter(i => i.offsetParent !== null);
setter.call(inputs[1], '<用户 Shopify handle>');
inputs[1].dispatchEvent(new Event('input', {bubbles:true}));
setter.call(inputs[2], '<用户 Client ID>');
inputs[2].dispatchEvent(new Event('input', {bubbles:true}));
setter.call(inputs[3], '<用户 Secret>');
inputs[3].dispatchEvent(new Event('input', {bubbles:true}));
return inputs[1].value + ' | ' + inputs[2].value.slice(0,8) + '...';
})()
"""})
browser(action="screenshot") # 截图确认填写内容
# 5. 点下一步
browser(action="act", request={"kind": "evaluate", "fn": """
Array.from(document.querySelectorAll('button')).find(b => b.textContent.includes('下一步'))?.click()
"""})
browser(action="screenshot") # 截图确认进入数据选择页
# 6. 选择搬迁模块(第2步)
# ⚠️ 搬迁插件使用 Vue 自定义 checkbox 组件,JS click() 和 dispatchEvent 均无法触发
# 唯一有效方法:用坐标 + 完整 pointer/mouse 事件序列点击
#
# 模块名文字元素 class:`._moduleName_2weus_5`
# 获取坐标:
browser(action="act", request={"kind": "evaluate", "fn": """
(() => {
const els = Array.from(document.querySelectorAll('._moduleName_2weus_5')).filter(el => el.offsetParent !== null);
return els.map(e => { const r = e.getBoundingClientRect(); return e.textContent.trim() + ':' + Math.round(r.left) + ',' + Math.round(r.top); }).join(' | ');
})()
"""})
# 根据坐标,checkbox 在文字左侧约 -40px,点击方式:
browser(action="act", request={"kind": "evaluate", "fn": """
new Promise(resolve => {
// 按顺序点:折扣码 → 发货物流 → 商品 → 客户 → 订单(订单需先勾选商品+客户+折扣码)
const nameEls = Array.from(document.querySelectorAll('._moduleName_2weus_5')).filter(el => el.offsetParent !== null);
const targets = ['客户', '商品', '折扣码', '发货物流', '订单'];
const coords = targets.map(name => {
const el = nameEls.find(e => e.textContent.trim() === name);
if(!el) return null;
const r = el.getBoundingClientRect();
return {name, x: Math.round(r.left - 25), y: Math.round(r.top + r.height/2)};
}).filter(Boolean);
let i = 0;
function clickNext() {
if(i >= coords.length) { resolve('done'); return; }
const {x, y} = coords[i++];
const el = document.elementFromPoint(x, y);
['pointerover','pointerenter','pointermove','pointerdown','mousedown','pointerup','mouseup','click'].forEach(t => {
el.dispatchEvent(new MouseEvent(t, {bubbles:true, cancelable:true, clientX:x, clientY:y, view:window}));
});
setTimeout(clickNext, 400);
}
clickNext();
})
"""})
browser(action="screenshot") # 确认勾选状态(若有依赖提示弹窗,点关闭后重新点击订单)
# ⚠️ 订单依赖关系:必须先勾选「商品」+「客户」+「折扣码」,否则弹提示框拦截
# 如订单未勾上,单独用坐标点击:
# browser(action="act", request={"kind": "evaluate", "fn": "document.elementFromPoint(<订单x>, <订单y>)..."})
# 7. 确认统计数据 → 点「立即搬迁」
browser(action="act", request={"kind": "evaluate", "fn": """
Array.from(document.querySelectorAll('button')).find(b => b.textContent.includes('下一步'))?.click()
"""})
browser(action="screenshot") # 截图确认进入第3步(数据统计页)
browser(action="act", request={"kind": "evaluate", "fn": """
Array.from(document.querySelectorAll('button')).find(b => b.textContent.includes('立即搬迁'))?.click()
"""})
browser(action="screenshot") # 截图确认搬迁已开始(进度页)
⚠️ 技术注意:
- 搬迁插件托管在
admin.innovelabs.com,与 SHOPLINE 后台跨域,需用签名 URL 方式进入- 签名 URL 有效期约 30 分钟,过期需重新调
/admin/appstore/get-install-url获取- 三个 input 中 index 0 为隐藏字段,从 index 1 开始是可见字段
- Secret 字段填的是 Shopify Dev Dashboard → Settings → Credentials 里的 Secret(格式
shpss_...,不是旧版 Access Tokenshpat_...)- 模块选择 checkbox 为 Vue 组件,必须用
elementFromPoint+ 完整鼠标事件序列点击,JS click/dispatchEvent 无效- 订单必须在商品+客户+折扣码全部勾选后再勾,否则弹依赖提示
搬迁启动后告知用户:
🚀 搬迁已启动!
数据正在从 [原平台] 迁移到你的 SHOPLINE 店铺,根据数据量大小通常需要几分钟到几小时。
迁移完成后你会收到邮件通知。期间店铺正常运营不受影响。
B.4 平台专属文档
附录 C:References 索引
| 文件 | 内容 |
|---|---|
references/flow-newbie.md | 新手流程话术参考(旧版,可参考细节) |
references/flow-migrate.md | 搬迁流程话术参考(旧版,可参考细节) |
references/faq-zh.md | 中文 FAQ |
references/faq-en.md | 英文 FAQ |
Files
12 totalComments
Loading comments…
