Skill flagged — review recommended

ClawHub Security found sensitive or high-impact capabilities. Review the scan results before using.

Shopline Builder

v2.2.1

SHOPLINE 建站助手 — AI 全程帮用户完成 SHOPLINE 独立站注册和配置,包括自动填写注册表单、配置店铺基础设置、选主题,以及从 Shopify / WooCommerce / Shoplazza 的搬迁引导。北极星指标:首单时间(新手 ≤7 天,搬迁 ≤3 天)。

3· 322· 6 versions· 1 current· 1 all-time· Updated 18h ago· MIT-0

Install

openclaw skills install shopline-builder

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": "<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 — 创建账号(🛑 AI 停止操作,用户在浏览器中自行完成)

执行步骤:

browser(action="snapshot")  # 确认到了 "Create Your SHOPLINE Account" 页面
browser(action="act", request={"kind": "type", "ref": "<Email textbox 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>.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 自动建站):

执行步骤:

# 1. 导航到 AI Builder 入口(已验证路由)
browser(action="navigate", url="https://<storeHandle>.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/aiBuild

# 3. 如弹出「建议先创建商品」→ 点 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": "<Next 按钮 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://<storeHandle>.myshopline.com/admin/website/shopSetting")
browser(action="screenshot")

完成后告知用户:


好的!这是你的主题设计器链接,你可以自己去调:

🔗 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(推荐,美国客户常用):

  1. 在支付设置页找到 PayPal → 点 Enable
  2. 在弹出页面登录你的 PayPal 企业账号完成授权

SHOPLINE Payments(信用卡收款):

  1. 点「Activate SHOPLINE Payments」
  2. 按提示完成身份认证(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) 看清楚再操作
  • 用户说「继续」就继续下一步,用户说「等一下」就暂停

关键链接

用途链接
注册入口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 Storehttps://apps.shopline.com/?lang=en

附录 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 > Design(侧边栏),或首页「Design Your Store」按钮 后台 URL(已实测): https://<storeHandle>.myshopline.com/admin/website/shopSetting

⚠️ /admin/themes/admin/online-store/themes 均为 404,不可用,请用上方正确路由。

browser(action="navigate", url="https://<storeHandle>.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://<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 APICustomer 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 Token shpat_...
  • 模块选择 checkbox 为 Vue 组件,必须用 elementFromPoint + 完整鼠标事件序列点击,JS click/dispatchEvent 无效
  • 订单必须在商品+客户+折扣码全部勾选后再勾,否则弹依赖提示

搬迁启动后告知用户:


🚀 搬迁已启动!

数据正在从 [原平台] 迁移到你的 SHOPLINE 店铺,根据数据量大小通常需要几分钟到几小时。

迁移完成后你会收到邮件通知。期间店铺正常运营不受影响。


B.4 平台专属文档

来源平台官方搬迁文档
Shopifyhttps://help.shopline.com/hc/en-001/articles/4669702695193
WooCommercehttps://help.shopline.com/hc/en-001/articles/16784282483353
Shoplazzahttps://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

Version tags

latestvk9701s4g1tvrvcp65na0a6xfmn8357aq