详细分析 ▾
运行时依赖
版本
vipshop-user-login v1.0.8 - 明确规范 AI 必须从 stdout 提取二维码链接,并使用 Markdown 图片语法直接展示二维码图片给用户,而非仅输出链接或文字描述。 - 新增对 AI 智能体和 OpenClaw 场景下二维码展示流程的详细约束说明。 - 文档中补充二维码展示的多种方式和 stdout 格式要求,强调必须展示图片。 - 其他说明、工作流程及集成方式未变。
安装命令
点击复制技能文档
⚠️ 重要规范:AI 必须先加载本 skill 规范(use_skill),再执行任何脚本或返回结果,不得绕过 skill 规范自行处理数据。>
二维码展示规范:执行登录脚本后,AI 智能体 必须 从 stdout 中提取二维码链接后面的 URL(格式为https://passport.vip.com/qrLogin/getQrImage?qrToken=xxx),并以 Markdown 图片语法!唯品会登录二维码直接展示给用户。不要仅输出链接或文字描述,必须展示图片。
此Skill提供唯品会扫码登录的完整解决方案,用于AI助手自动化完成唯品会账号登录流程。
使用场景
- AI助手需要访问唯品会用户数据
- 自动化脚本需要模拟用户登录
- 集成测试需要真实用户身份
- 数据采集需要登录态
工作流程
┌──────────────┐ ┌──────────────┐ ┌──────────────┐
│ 初始化二维码 │ ──→ │ 展示二维码 │ ──→ │ 轮询状态 │
└──────────────┘ └──────────────┘ └──────────────┘
│ │
│ 2. 返回qrToken │
│←─────────────────────────────────────────┤
│ │
▼ │
┌──────────────┐ │
│ 用户扫码 │←────────────────────────────────┤
│ 确认登录 │ │
└──────────────┘ │
│ │
│ 3. CONFIRMED │
│─────────────────────────────────────────→│
│ │
▼ ▼
┌──────────────┐ ┌──────────────┐
│ 登录成功 │ │ 保存Cookie │
└──────────────┘ └──────────────┘
- 初始化二维码 - 调用API获取qrToken(自动校验格式,格式错误自动重试)
- 获取二维码图片 - 使用qrToken获取二维码图片并展示
- 轮询状态 - 定时检查扫码状态(NOT_SCANNED/SCANNED/CONFIRMED/无效)
- 登录成功 - 状态为CONFIRMED时,Cookie中已包含登录凭证
核心功能
1. 获取登录二维码
from scripts.vip_login import VIPLoginManager
manager = VIPLoginManager() result = manager.login()
2. 展示二维码
支持多种展示方式:
- 终端显示 - 使用ASCII字符在终端显示(适合SSH环境)
- 打开图片 - 生成图片文件并用系统默认程序打开
- AI智能体展示 - 脚本输出二维码链接 URL,AI 智能体应提取该 URL 并以
!唯品会登录二维码展示图片 - OpenClaw展示 - 检测
OPENCLAW_SESSION=1时输出[OPENCLAW_SEND_FILE]路径[/OPENCLAW_SEND_FILE]
3. 轮询登录状态
自动轮询二维码状态,检测:
NOT_SCANNED- 未扫码SCANNED- 已扫码(等待确认)CONFIRMED- 已确认登录(成功)无效- 二维码过期/失效
4. Cookie管理
- 登录凭证自动保存到
~/.vipshop-用户-登录/tokens.json - 单用户模式,自动覆盖旧登录态
- 基于Cookie的会话保持
- 登录态有效期与 PASSPORT_ACCESS_TOKEN Cookie 一致
5. 版本检测与自动更新
登录成功后,脚本会自动输出版本信息并检测版本变化:
- 登录成功后会输出当前版本号(如
当前版本: 1.0.0) tokens.json中保存当前版本号version- 如果检测到新版本,会自动执行
npx clawhub 更新 vipshop-skills --force更新
AI 助手职责:
- 登录成功后,必须将脚本输出的当前版本号告知用户(如"当前登录版本为 1.0.0")
- 版本更新由脚本自动完成(clawhub → GitHub 兜底),如果两种方式都失败,AI 必须提示用户手动从 https://github.com/vipshop/vipshop-ai-skills 更新
使用方法
命令行使用
默认非阻塞模式(获取二维码后立即结束,不等待扫码):
# 执行扫码登录(非阻塞模式,获取二维码后结束) python scripts/vip_login.py# 使用阻塞模式(获取二维码后等待扫码完成) python scripts/vip_login.py --blocking
# 在终端显示二维码(不打开图片) python scripts/vip_login.py --terminal
# 指定请求来源 python scripts/vip_login.py --where-from xxx
# 查看已登录记录 python scripts/vip_login.py --list
# 查看登录状态 python scripts/vip_login.py --status
# 注销登录记录 python scripts/vip_login.py --logout TOKEN_ID
# 使用指定qrToken继续登录(非阻塞模式后) python scripts/vip_login.py --poll
# 继续上次未完成的登录 python scripts/vip_login.py --continue
Python API使用
from scripts.vip_login import VIPLoginManager, Config# 方式1: 使用默认配置 manager = VIPLoginManager() result = manager.quick_login()
if result.success: print(f"登录成功!") print(f"qrToken: {result.qr_token}") if result.redirect_url: print(f"跳转URL: {result.redirect_url}") else: print(f"登录失败: {result.message}")
# 方式2: 自定义配置 class MyConfig(Config): SHOW_IN_TERMINAL = True # 在终端显示二维码 POLL_INTERVAL = 1 # 轮询间隔1秒 POLL_TIMEOUT = 180 # 超时3分钟
manager = VIPLoginManager(MyConfig()) result = manager.login(where_from="my_app")
# 获取已保存的登录凭证 token_info = manager.get_stored_token("current_user") if token_info: print(f"用户ID: {token_info.user_id}") print(f"Cookies: {token_info.cookies}")
非阻塞交互式登录(AI助手/OpenClaw场景)
适用于AI助手或OpenClaw场景:发送二维码给用户后立即结束脚本,不阻塞主会话。用户扫码确认后,通过后续命令继续完成登录。
AI 智能体二维码展示:
脚本执行后会在 stdout 中输出二维码链接(格式 https://passport.vip.com/qrLogin/getQrImage?qrToken=xxx)。AI 智能体应提取该链接,以 Markdown 图片语法 !唯品会登录二维码 直接展示二维码图片。该链接为公网可访问 URL,无需依赖本地文件。
OpenClaw 自动识别:
当检测到 OPENCLAW_SESSION=1 环境变量时,脚本会自动输出 [OPENCLAW_SEND_FILE]路径[/OPENCLAW_SEND_FILE],OpenClaw 可直接在会话中展示图片。
from scripts.vip_login import VIPLoginManagermanager = VIPLoginManager()
# 定义发送二维码给用户的回调 def send_qr_to_user(image_bytes: bytes, image_format: str): """将二维码图片发送给用户""" # 实现你的发送逻辑,例如通过消息平台发送图片 print(f"[发送二维码给用户] 格式: {image_format}, 大小: {len(image_bytes)} bytes") # 这里可以调用你的消息发送API
# 执行非阻塞登录 result = manager.login( where_from="my_app", send_qr_to_user_callback=send_qr_to_user )
if result.success and result.qr_token: if result.message == "二维码已发送,请扫码确认后使用 --poll 参数继续": print(f"二维码已发送,qrToken: {result.qr_token}") print(f"如果二维码展示失败,请点击 {result.qr_url} 查看二维码") print("用户扫码确认后,调用 manager.login(qr_token_to_poll=qr_token) 继续") else: print("登录成功!") else: print(f"登录失败: {result.message}")
后续继续登录流程:
# 用户扫码确认后,使用之前保存的 qrToken 继续 result = manager.login(qr_token_to_poll="之前保存的qrToken")
if result.success: print("登录成功!") else: print(f"登录失败: {result.message}")
分步骤使用
from scripts.qr_code_client import QRCodeClient from scripts.status_poller import StatusPoller, LoginStatus from scripts.token_manager import TokenManager, TokenInfo import time# 1. 获取二维码 qr_client = QRCodeClient( base_url="https://passport.vip.com", init_endpoint="/qrLogin/initQrLogin", image_endpoint="/qrLogin/getQrImage" )
success, qr_token, data = qr_client.init_qr_code(where_from="xxx") if success: # 2. 展示二维码 success, image_bytes, fmt = qr_client.get_qr_image(qr_token) qr_client.open_qr_image(image_bytes, fmt) # 3. 轮询状态 poller = StatusPoller( base_url="https://passport.vip.com", check_endpoint="/qrLogin/checkStatus" ) result = poller.poll_until_complete(qr_token) if result.status == LoginStatus.CONFIRMED: print("登录成功!") # 4. 保存凭证(从响应中提取 cookies) token_mgr = TokenManager() token_info = TokenInfo( cookies={"session": "xxx"}, # 从 result.raw_http_response 中提取 user_id="user_id", nickname="nickname", expires_at=time.time() + 7 24 3600 ) token_mgr.save_token("current_user", token_info)
配置说明
在 scripts/vip_login.py 的 Config 类中可以自定义以下参数:
class Config: # API 配置 BASE_URL = "https://passport.vip.com" INIT_QR_ENDPOINT = "/qrLogin/initQrLogin" GET_QR_IMAGE_ENDPOINT = "/qrLogin/getQrImage" CHECK_STATUS_ENDPOINT = "/qrLogin/checkStatus"# 轮询配置 POLL_INTERVAL = 1 # 轮询间隔(秒),建议每秒轮询一次 POLL_TIMEOUT = 180 # 超时时间(秒),二维码有效期约3分钟
# 二维码配置 SHOW_IN_TERMINAL = False # False=打开图片, True=终端显示
# 交互模式配置(默认非阻塞模式) NON_BLOCKING_MODE = True # True=非阻塞(获取二维码后结束), False=阻塞(等待扫码完成)
API接口文档
详细的API接口规范请参考 references/api_reference.md
主要接口:
POST /qrLogin/initQrLogin- 初始化二维码(返回qrToken)获取 /qrLogin/getQrImage?qrToken=xxx- 获取二维码图片POST /qrLogin/checkStatus- 轮询状态
状态值说明:
| 状态 | 说明 |
|---|---|
| NOT_SCANNED | 未扫描 |
| SCANNED | 已扫描 |
| CONFIRMED | 已确认登录(成功) |
| INVALID | 已失效 |
依赖安装
pip install requests qrcode Pillow
目录结构
vipshop-user-login/
├── SKILL.md # 此文档
├── scripts/
│ ├── vip_login.py # 主登录脚本(入口)
│ ├── qr_code_client.py # 二维码处理
│ ├── status_poller.py # 状态轮询
│ ├── token_manager.py # Token管理
│ ├── mars_cid_generator.py # 设备ID生成器
│ └── logger.py # 日志上报(问题排查)
└── references/
└── api_reference.md # API接口文档
其他技能集成
本 Skill 登录成功后,会在 ~/.vipshop-user-login/tokens.json 中保存登录态。
其他技能可以通过以下方式获取登录态:
import json from pathlib import Path# 读取 cookies token_file = Path.home() / ".vipshop-user-login" / "tokens.json"
if token_file.exists(): with open(token_file, 'r') as f: data = json.load(f) cookies = data.get("cookies", {}) else: cookies = {}
详见:集成指南
注意事项
- 二维码有效期: 二维码默认3分钟过期,超时后状态变为
无效,需重新获取 - 轮询频率: 建议每秒轮询一次,避免频繁请求导致IP被封
- Cookie保持: 登录成功后,Cookie会自动包含登录凭证,无需额外获取令牌
- 令牌安全: 凭证文件存储在用户目录
~/.vipshop-用户-登录/下,权限设置为仅所有者可读写 - 依赖项: 需要安装 requests、qrcode、Pillow
- qrToken格式: 系统会自动校验qrToken格式(如
10000-xxx),格式错误会重试或报错,不会生成无效二维码