Skill flagged — suspicious patterns detected

ClawHub Security flagged this skill as suspicious. Review the scan results before using.

SHOPLINE 建站助手

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

MIT-0 · Free to use, modify, and redistribute. No attribution required.
3 · 28 · 0 current installs · 0 all-time installs
MIT-0
Security Scan
VirusTotalVirusTotal
Suspicious
View report →
OpenClawOpenClaw
Suspicious
medium confidence
Purpose & Capability
The skill's files and SKILL.md align with the stated goal (automating SHOPLINE registration, setup, and migration). The included reference materials and migration flow are coherent. However, there is a mismatch between being 'instruction-only' and shipping Node scripts + a package.json that depends on Playwright: either the platform is expected to run those scripts (no install spec provided) or they are maintenance artifacts. This omission is unexpected and reduces clarity about what will actually run.
!
Instruction Scope
The runtime instructions tell the agent to: ask the user to enable Chrome remote debugging so the agent can attach to the user's browser (preserving logged-in sessions); accept passwords and API keys from the user and then programmatically inject them into admin pages (using evaluate/native value setter); take snapshots/screenshots; and explicitly instructs agents to avoid telling users about 'browser' or 'automation'—which is deceptive. These behaviors go beyond simple guidance and grant the agent (or the agent operator) high-fidelity access to a user's browser session and secrets.
!
Install Mechanism
There is no install spec, but package.json/package-lock.json declare a Playwright dependency and scripts that launch Playwright. The fetch-faq.js scraper explicitly states it 'Uses Playwright to bypass Cloudflare protection' and sets flags to evade automation detection. Shipping automation/scraping code with explicit evasion intent but no install/run instructions is inconsistent and raises risk about covert scraping or attempts to bypass protections. If the platform does not run these scripts, they may be harmless artifacts—but that ambiguity is notable.
!
Credentials
The skill declares no environment variables, yet runtime instructions require the user to provide sensitive data interactively: registration email/password, and (for migrations) platform API keys/secrets. It also asks the user to enable Chrome remote debugging (granting the agent access to an authenticated browser). Collecting credentials and enabling remote browser access is higher privilege than the skill's marketplace metadata implies and is disproportionate without explicit, transparent justification and safeguards.
Persistence & Privilege
The skill does not request always:true and does not declare changes to other skills. However, the skill's workflow relies on remote browser attachment and possibly a Chrome extension relay; combined with autonomous invocation (platform default), this increases blast radius if the skill is allowed to run without tight user consent on each operation. This combination raises concern even though 'always' is false.
What to consider before installing
Key things to consider before installing/using this skill: - Do not paste real account passwords or long-lived API secrets into chat. Instead use manual entry into the site under your supervision, or create temporary credentials that can be revoked. - The skill asks you to enable Chrome remote debugging so the agent can control your browser and use your logged-in sessions — that grants broad access to cookies, open sites, and anything in the browser. Only enable this if you fully trust the skill and are willing to risk that level of access; prefer manual guidance if unsure. - The package includes a Playwright scraper that explicitly attempts to bypass Cloudflare protections. Confirm whether scraping/automation like this is acceptable for your environment and legal jurisdiction. - The SKILL.md instructs the agent to hide technical details from users (e.g., not mentioning 'browser' or 'automation'); that is deceptive. Prefer skills that are transparent about actions they will take and ask explicit consent for each privileged operation. - Safer options: ask the agent for step-by-step instructions instead of automation; if you must allow automation, perform it in a disposable environment (new browser profile or temporary account) and avoid giving long-lived credentials. If you want, I can list the exact steps/phrases in SKILL.md that are concerning or draft safer prompts/instructions you can give to the skill author to reduce risk.
scripts/fetch-faq.js:57
Dynamic code execution detected.
Patterns worth reviewing
These patterns may indicate risky behavior. Check the VirusTotal and OpenClaw results above for context-aware analysis before installing.

Like a lobster shell, security has layers — review code before you run it.

Current versionv2.0.0
Download zip
latestvk97aa0kh0zvcss2nc774enqcjh831kk8

License

MIT-0
Free to use, modify, and redistribute. No attribution required.

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 远程调试(一次性设置):

  1. 打开 Chrome,地址栏输入:chrome://inspect/#remote-debugging
  2. 开启「Discover network targets」开关
  3. 保持 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 帮你搞定,你只需要提供几个基本信息:

请一次性填写(填完我立刻帮你开始):

  1. 姓名:名字 / 姓氏(例:张 / 伟)
  2. 店铺名称:你的品牌名或店铺名(例:TrendyGoods Store)
  3. 目标市场:你主要卖给哪个国家/地区(例:United States / 美国)
  4. 注册邮箱:用来创建 SHOPLINE 账号的邮箱
  5. 公司名称(选填):如有品牌/公司名可填,没有跳过

填好后我马上帮你注册 ✈️


收到用户信息后,进入注册流程。


二、注册流程(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(推荐,美国客户常用):

  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 > 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 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

Files

12 total
Select a file
Select a file to preview.

Comments

Loading comments…