Shopline Builder
by @zhangsicong-debug
SHOPLINE 建站助手 — AI 全程帮用户完成 SHOPLINE 独立站注册和配置,包括自动填写注册表单、配置店铺基础设置、选主题,以及从 Shopify / WooCommerce / Shoplazza 的搬迁引导。北极星指标:首单时间(新手 ≤7 天,搬迁 ≤3 天)。
clawhub install shopline-builder📖 About This Skill
name: shopline-builder description: SHOPLINE 建站助手 — AI 全程帮用户完成 SHOPLINE 独立站注册和配置,包括自动填写注册表单、配置店铺基础设置、选主题,以及从 Shopify / WooCommerce / Shoplazza 的搬迁引导。北极星指标:首单时间(新手 ≤7 天,搬迁 ≤3 天)。 version: 2.2.1 updated: 2026-03-18 homepage: https://www.npmjs.com/package/shopline-builder permissions: browser: true profile: openclaw reason: > 本技能使用 openclaw 隔离浏览器(沙盒实例)操作 SHOPLINE 后台页面。 不使用 profile="user" 或 chrome-relay,不连接用户个人浏览器,不访问用户 cookie 或其他标签页。 credentials: - name: SHOPLINE 账号密码 purpose: > 注册流程中 AI 仅填写邮箱字段,密码由用户直接在浏览器窗口中输入,不经过聊天传递。 required: none - name: SHOPLINE API Client Secret(搬迁链路) purpose: 用户在 SHOPLINE Dev Dashboard 自行生成后粘贴,用于授权搬迁插件读取源平台数据,可随时撤销 required: optional dev_artifacts: note: > 开发期间使用 Playwright 脚本采集 SHOPLINE Help Center 内容生成 references/ 离线文档。 该脚本不包含在发布包内,不在生产环境运行。脚本注释中的"bypass Cloudflare" 描述的是降低请求频率、模拟标准浏览器头等采集策略,非 skill 运行时功能。 attribution: utm: true disclosure: > 注册链接携带 UTM 参数(utm_source=openclaw)用于归因统计。 在信息收集环节向用户明确披露,并提供无参数原始链接作为替代。 triggers: - SHOPLINE 怎么开店 - 我想开一个独立站 - 帮我注册 SHOPLINE - 帮我在 SHOPLINE 建店 - 怎么从 Shopify 搬到 SHOPLINE - 从 WooCommerce 迁移到 SHOPLINE - Shoplazza 搬迁到 SHOPLINE - SHOPLINE 注册 - 独立站建站教程 - SHOPLINE 套餐怎么选 - SHOPLINE 支付怎么配置 - SHOPLINE 域名绑定 - how to set up SHOPLINE store - migrate to SHOPLINE - SHOPLINE store setup - start selling on SHOPLINE - SHOPLINE payment setup - bind domain to SHOPLINE
SHOPLINE 建站助手 — AI 自动化执行指令
> 本 SKILL.md 是 AI 的执行剧本。核心原则:AI 帮用户自动完成注册和配置,用户只需要提供信息。 > > 透明度原则: 本技能通过浏览器自动化操作 SHOPLINE 后台页面。执行前应向用户说明 AI 将代为操作浏览器完成建站配置;对于密码、API 密钥等敏感信息,每次使用前需明确告知用途并获得用户确认。
零、浏览器模式
本技能始终使用 openclaw 隔离浏览器(OpenClaw 管理的沙盒浏览器实例,与用户个人 Chrome 完全隔离)。
不使用 profile="user"(CDP 连接用户个人浏览器)或 chrome-relay。原因:CDP 连接在技术上可访问用户所有标签页和 cookie,无法在 skill 层面强制约束范围,不符合最低权限原则。
对用户的说明: AI 会打开一个独立的浏览器窗口来操作 SHOPLINE,这个窗口与你的个人 Chrome 完全隔离。如果需要登录已有账号,AI 会引导你在这个独立窗口里手动登录(只需一次)。
批量操作规范(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 帮你搞定,你只需要提供几个基本信息:
请一次性填写(填完我立刻帮你开始):
1. 姓名:名字 / 姓氏(例:张 / 伟) 2. 店铺名称:你的品牌名或店铺名(例:TrendyGoods Store) 3. 目标市场:你主要卖给哪个国家/地区(例:United States / 美国) 4. 注册邮箱:用来创建 SHOPLINE 账号的邮箱 5. 公司名称(选填):如有品牌/公司名可填,没有跳过
> 📌 说明:注册链接包含 UTM 归因参数(utm_source=openclaw),用于统计通过本 skill 完成注册的用户数量。这不影响你的注册流程和账号权益,SHOPLINE 不会因此向你收取额外费用。如不希望携带追踪参数,可直接访问 https://www.shopline.com/register 自行注册。
填好后我马上帮你注册 ✈️
收到用户信息后,进入注册流程。
二、注册流程(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": "", "text": "<用户名字>"},
{"kind": "type", "ref": "", "text": "<用户姓氏>"},
{"kind": "type", "ref": "", "text": "<公司名,无则填店铺名>"},
{"kind": "click", "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": "", "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": "", "delayMs": 200}
])
Step 4 — 店铺名称
执行步骤:
browser(action="snapshot") # 确认到了 "Give your store a name" 页面批量:填店铺名 + 点下一步
browser(action="act", request=[
{"kind": "type", "ref": "", "text": "<用户店铺名>"},
{"kind": "click", "ref": "", "delayMs": 200}
])
> 如用户未提供店铺名,点 Skip 跳过
Step 5 — 销售地区
执行步骤:
browser(action="snapshot") # 确认到了 "Which country you are selling to?" 页面点开下拉
browser(action="act", request={"kind": "click", "ref": ""})
browser(action="snapshot") # 查看国家列表点选目标国家 + 点下一步
browser(action="act", request=[
{"kind": "click", "ref": "<目标国家选项 ref>"},
{"kind": "click", "ref": "", "delayMs": 300}
])
> 常用地区映射:美国 → United States,中国 → China,英国 → United Kingdom
Step 6 — 创建账号(🛑 AI 停止操作,用户在浏览器中自行完成)
执行步骤:
browser(action="snapshot") # 确认到了 "Create Your SHOPLINE Account" 页面
browser(action="act", request={"kind": "type", "ref": "", "text": "<用户提供的邮箱>"})
browser(action="screenshot") # 截图展示当前状态
截图后告知用户:
🎯 最后一步到了!邮箱已经帮你填好了。
请你直接在刚才弹出的浏览器窗口里完成: 1. 在「Password」框里输入你的密码(8-20位,含大写/小写/数字/特殊字符) 2. 在「Confirm Password」框里再次输入密码 3. 勾选同意条款 4. 点「SIGN UP」按钮
> 🔒 为什么要你自己输入? 密码这种高敏感信息不应该通过聊天传递。请直接在浏览器里输入,这样密码不经过任何中间环节。
完成后告诉我「注册好了」,我继续帮你配置店铺 ✅
用户确认注册成功后,AI 继续:
browser(action="screenshot") # 截图确认已进入 SHOPLINE 后台
browser(action="snapshot") # 获取当前后台 URL 提取 store handle
注册完成 — 获取 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 无法自动获取,询问用户登录 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 自动建站):
执行步骤:
# 1. 导航到 AI Builder 入口(已验证路由)
browser(action="navigate", url="https://.myshopline.com/admin/website/shopSetting")
browser(action="screenshot") # 确认页面加载2. 点「Try it Now」进入 AI Builder
browser(action="act", request={"kind": "click", "selector": "button:has-text('Try it Now')", "delayMs": 300})
browser(action="screenshot") # 确认进入 /admin/website/shopSetting/aiBuild3. 如弹出「建议先创建商品」→ 点 Continue website building 跳过
browser(action="act", request={"kind": "click", "selector": "button:has-text('Continue website building')"})4. 选品类(下拉树形选单)
browser(action="snapshot")
browser(action="act", request={"kind": "click", "ref": "<品类下拉 ref>"}) # 展开下拉
browser(action="snapshot") # 看品类列表
browser(action="act", request={"kind": "click", "ref": "<匹配品类 ref>"}) # 点选对应品类5. 填写描述(描述框有示例内容,不用清空,直接用示例也可)
如需自定义描述:
browser(action="act", request={"kind": "type", "ref": "<描述文本框 ref>",
"text": "Style: <风格>; Category: <品类>; Main products: <主要商品>; Other details: <关键词>"})
browser(action="act", request={"kind": "click", "ref": "", "delayMs": 300})6. 如弹出「AI 创建商品分类」→ Create categories
browser(action="snapshot")
browser(action="act", request={"kind": "click", "selector": "button:has-text('Create categories')"})7. 等待 AI 生成(约 60-120 秒),轮询截图直到进度完成出现「Publish directly」
browser(action="screenshot") # 查看进度,重复几次直到完成8. 发布主题
browser(action="act", request={"kind": "click", "selector": "button:has-text('Publish directly')", "delayMs": 300})9. 弹出「生成其他页面」对话框 → 全选辅助页面一并生成
推荐全选:About us / Order tracking + Privacy/Return/Shipping policy / Terms of service
browser(action="snapshot") # 找各 checkbox ref
依次点选所有 checkbox(跳过已默认勾选的 Contact us)
最后点:
browser(action="act", request={"kind": "click", "selector": "button:has-text('Publish after generating the page')", "delayMs": 300})browser(action="screenshot") # 截图确认发布成功(顶部 toast: "Theme published successfully")
> ⚠️ 路由说明(已实测验证):
> - 主题管理入口:/admin/website/shopSetting
> - AI Builder 页面:/admin/website/shopSetting/aiBuild
> - ~~/admin/themes~~ 和 ~~/admin/online-store/themes~~ 均为 404,不可用
完成后告知用户:
✅ AI 建站完成! 你的店铺主题已上线 🎉
SHOPLINE AI 根据你的店铺描述自动生成了专属主题,包括图片、文案和页面布局,已直接发布。辅助页面(Contact us、Privacy Policy 等)也一并生成完毕。
如果用户选 2(手动装修):
执行步骤:
# 侧边栏 Online Store → Design 子菜单
browser(action="navigate", url="https://.myshopline.com/admin/website/shopSetting")
browser(action="screenshot")
完成后告知用户:
好的!这是你的主题设计器链接,你可以自己去调:
🔗 https://
调好后告诉我,我们继续下一步 ✅
> ⚠️ 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=1200https://images.unsplash.com/photo-1484704849700-f032a568e944?w=1200https://images.unsplash.com/photo-1434389677669-e08b4cac3105?w=1200https://images.unsplash.com/photo-1507003211169-0a1dd7228f2d?w=1200下载命令:exec("curl -L '
执行步骤:
# 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://.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": ""},
{"kind": "type", "ref": "<价格输入框 ref>", "text": ""}
])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 = '
';
editor.dispatchEvent(new Event('input', {bubbles:true}));
return 'done';
})()
"""})8. 上传商品图片
browser(action="act", profile="user", request={"kind": "click", "ref": ""})
browser(action="upload", profile="user", 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": "", "delayMs": 300})9. 发布商品
browser(action="act", profile="user", request={"kind": "click", "ref": "", "delayMs": 500})
browser(action="screenshot", profile="user") # 截图确认商品已上架
完成后告知用户:
✅ 第一个商品已上架!
🛍️ 商品:<商品名> 💰 价格:$<价格> 📝 描述:<一句话描述> 📦 库存:100
Step C:配置支付
导航: https://
执行策略(三种支付方式,处理方式不同):
| 支付方式 | AI 能否代操作 | 说明 | |---------|------------|------| | Cash on delivery | ✅ 可以 | 直接点 Enable → Add Cash On Delivery | | PayPal | ❌ 不行 | Cloudflare 安全拦截,跳转后被阻止,需用户手动登录 PayPal 授权 | | SHOPLINE Payments | ❌ 不行 | 需要 KYC 身份认证,必须用户手动提交 |
执行步骤:
# 1. 导航到支付页(profile="user" 保持登录态)
browser(action="navigate", url="https://.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": "", "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(推荐,美国客户常用): 1. 在支付设置页找到 PayPal → 点 Enable 2. 在弹出页面登录你的 PayPal 企业账号完成授权
SHOPLINE Payments(信用卡收款): 1. 点「Activate SHOPLINE Payments」 2. 按提示完成身份认证(KYC)
> ⚠️ PayPal 和 SHOPLINE Payments 均有安全验证机制,AI 无法代替登录,必须由真人操作。
Step D:配置物流
导航: https://
执行步骤(全自动,无需询问用户):
# 1. 进入运费设置(profile="user" 保持登录态)
browser(action="navigate", url="https://.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": "", "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": "", "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": " 默认运费标准(AI 自动填入,无需询问用户):
| Zone | 运费名称 | 价格 | |------|---------|------| | US Domestic(美国全境) | Standard Shipping | $5.99 | | International(全球 242 国) | International Shipping | $14.99 |
完成后告知用户:
✅ 物流配置完成!
已设置两个运费区:
> ⚠️ 技术注意:运费名称和价格输入框需用 native value setter + dispatchEvent('input') 填入,不能直接 type。spinbutton 的 value 格式为 $ 14.99(带空格和 $)。
🎉 Onboarding 完成
4 步全部完成后,输出:
🎉 恭喜!你的 SHOPLINE 店铺已经准备好接单了!
✅ 首页装修 — 完成 ✅ 第一个商品 — 已上架 ✅ 支付方式 — 已配置 ✅ 物流规则 — 已设置
下一步建议:
有任何问题随时问我!祝你早日首单 🚀
四、错误处理
| 场景 | AI 处理方式 | |------|------------| | 遇到验证码(CAPTCHA)| 截图给用户,让用户手动处理,完成后告诉 AI 继续 | | 遇到短信/邮箱验证码 | 截图给用户,用户输入验证码后 AI 继续 | | 遇到二步验证(2FA)| 截图给用户,指导用户完成,然后继续 | | 页面加载超时 | 刷新页面重试,超过3次告知用户 | | 表单验证错误 | 截图显示错误信息,根据错误内容修正后重试 | | 登录被重定向 | 截图给用户,引导用户手动登录后继续 |
截图原则: 凡需要用户介入,必先截图,让用户看到当前状态再操作。
browser(action=screenshot) # 截图并自动发给用户
五、通用原则
browser(action=snapshot) 看清楚再操作关键链接
| 用途 | 链接 | |------|------| | 注册入口 | https://admin.myshopline.com/user/onboarding/6565889082504519950/en | | 后台登录 | https://admin.myshopline.com/user/signIn | | 帮助中心(中文)| https://help.shopline.com/hc/zh-cn | | 帮助中心(英文)| https://help.shopline.com/hc/en-001 | | App Store | https://apps.shopline.com/?lang=en |
附录 A:基础店铺设置(可选)
如果用户需要调整基础设置(语言、货币、联系方式等),在 Onboarding 完成后执行:
基础店铺设置
路径: Settings > Basic settings
后台 URL: https://
browser(action=navigate, url="https://.myshopline.com/admin/settings/basic")
browser(action=snapshot)
需要确认/配置的字段:
操作完成后截图给用户确认。
语言与货币设置
路径: Settings > Languages & Currencies
后台 URL: https://
browser(action=navigate, url="https://.myshopline.com/admin/settings/language")
browser(action=snapshot)
根据用户目标市场自动设置:
主题选择
路径: Online Store > Design(侧边栏),或首页「Design Your Store」按钮
后台 URL(已实测): https://
> ⚠️ /admin/themes 和 /admin/online-store/themes 均为 404,不可用,请用上方正确路由。
browser(action="navigate", url="https://.myshopline.com/admin/website/shopSetting")
browser(action="screenshot") # 截图给用户看主题管理页面
推荐走 AI Website Builder 流程(/admin/website/shopSetting/aiBuild),完整步骤见 Step A 章节。
附录 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://.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": ""})
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": "", "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】
第三步: 进入应用配置页:
https://shopify.dev/apps/default-app-home第四步: 点左侧 【Home】 → 右上角 【Install app】 → 选你的店铺,确认安装
第五步: 点左侧 【Settings】 → 在 Credentials 区域找到:
把 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 Token shpat_...)
> - 模块选择 checkbox 为 Vue 组件,必须用 elementFromPoint + 完整鼠标事件序列点击,JS click/dispatchEvent 无效
> - 订单必须在商品+客户+折扣码全部勾选后再勾,否则弹依赖提示
搬迁启动后告知用户:
🚀 搬迁已启动!
数据正在从 [原平台] 迁移到你的 SHOPLINE 店铺,根据数据量大小通常需要几分钟到几小时。
迁移完成后你会收到邮件通知。期间店铺正常运营不受影响。
B.4 平台专属文档
| 来源平台 | 官方搬迁文档 | |---------|------------| | Shopify | https://help.shopline.com/hc/en-001/articles/4669702695193 | | WooCommerce | https://help.shopline.com/hc/en-001/articles/16784282483353 | | Shoplazza | https://help.shopline.com/hc/en-001/articles/5943463861145 |
附录 C:References 索引
| 文件 | 内容 |
|------|------|
| references/flow-newbie.md | 新手流程话术参考(旧版,可参考细节) |
| references/flow-migrate.md | 搬迁流程话术参考(旧版,可参考细节) |
| references/faq-zh.md | 中文 FAQ |
| references/faq-en.md | 英文 FAQ |