{
  "schemaVersion": "1.0",
  "item": {
    "slug": "xianyu-auto-saler",
    "name": "咸鱼自动发货",
    "source": "tencent",
    "type": "skill",
    "category": "开发工具",
    "sourceUrl": "https://clawhub.ai/sliverp/xianyu-auto-saler",
    "canonicalUrl": "https://clawhub.ai/sliverp/xianyu-auto-saler",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/xianyu-auto-saler",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=xianyu-auto-saler",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "installMethod": "Manual import",
    "extraction": "Extract archive",
    "prerequisites": [
      "OpenClaw"
    ],
    "packageFormat": "ZIP package",
    "includedAssets": [
      "_meta.json",
      "xianyu-monitor-final.sh",
      "quick-start.sh",
      "start-monitor.sh",
      "QUICKSTART.md",
      "keys.txt"
    ],
    "primaryDoc": "SKILL.md",
    "quickSetup": [
      "Download the package from Yavira.",
      "Extract the archive and review SKILL.md first.",
      "Import or place the package into your OpenClaw setup."
    ],
    "agentAssist": {
      "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
      "steps": [
        "Download the package from Yavira.",
        "Extract it into a folder your agent can access.",
        "Paste one of the prompts below and point your agent at the extracted folder."
      ],
      "prompts": [
        {
          "label": "New install",
          "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
        },
        {
          "label": "Upgrade existing",
          "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
        }
      ]
    },
    "sourceHealth": {
      "source": "tencent",
      "status": "healthy",
      "reason": "direct_download_ok",
      "recommendedAction": "download",
      "checkedAt": "2026-05-07T17:22:31.273Z",
      "expiresAt": "2026-05-14T17:22:31.273Z",
      "httpStatus": 200,
      "finalUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=afrexai-annual-report",
      "contentType": "application/zip",
      "probeMethod": "head",
      "details": {
        "probeUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=afrexai-annual-report",
        "contentDisposition": "attachment; filename=\"afrexai-annual-report-1.0.0.zip\"",
        "redirectLocation": null,
        "bodySnippet": null
      },
      "scope": "source",
      "summary": "Source download looks usable.",
      "detail": "Yavira can redirect you to the upstream package for this source.",
      "primaryActionLabel": "Download for OpenClaw",
      "primaryActionHref": "/downloads/xianyu-auto-saler"
    },
    "validation": {
      "installChecklist": [
        "Use the Yavira download entry.",
        "Review SKILL.md after the package is downloaded.",
        "Confirm the extracted package contains the expected setup assets."
      ],
      "postInstallChecks": [
        "Confirm the extracted package includes the expected docs or setup files.",
        "Validate the skill or prompts are available in your target agent workspace.",
        "Capture any manual follow-up steps the agent could not complete."
      ]
    },
    "downloadPageUrl": "https://openagent3.xyz/downloads/xianyu-auto-saler",
    "agentPageUrl": "https://openagent3.xyz/skills/xianyu-auto-saler/agent",
    "manifestUrl": "https://openagent3.xyz/skills/xianyu-auto-saler/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/xianyu-auto-saler/agent.md"
  },
  "agentAssist": {
    "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
    "steps": [
      "Download the package from Yavira.",
      "Extract it into a folder your agent can access.",
      "Paste one of the prompts below and point your agent at the extracted folder."
    ],
    "prompts": [
      {
        "label": "New install",
        "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
      },
      {
        "label": "Upgrade existing",
        "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
      }
    ]
  },
  "documentation": {
    "source": "clawhub",
    "primaryDoc": "SKILL.md",
    "sections": [
      {
        "title": "🐟 闲鱼自动发货框架",
        "body": "一个可扩展的闲鱼虚拟商品自动化发货系统。核心提供付款检测，发货流程完全可自定义。"
      },
      {
        "title": "🎯 设计理念",
        "body": "┌─────────────────────────────────────────────────────────────┐\n│                    核心检测层（框架提供）                     │\n│  ┌──────────────┐    ┌──────────────┐    ┌──────────────┐  │\n│  │  监控聊天    │ -> │  检测付款    │ -> │  触发发货    │  │\n│  │  - 新消息    │    │  - 系统卡片  │    │  - 调用钩子  │  │\n│  │  - 未读标记  │    │  - 状态判断  │    │              │  │\n│  └──────────────┘    └──────────────┘    └──────────────┘  │\n└─────────────────────────────────────────────────────────────┘\n                              │\n                              ▼\n┌─────────────────────────────────────────────────────────────┐\n│                  自定义发货层（用户实现）                      │\n│  ┌──────────────┐  ┌──────────────┐  ┌──────────────┐      │\n│  │  秘钥发货    │  │  链接发货    │  │  图片发货    │  ...  │\n│  │  - 固定秘钥  │  │  - 网盘链接  │  │  - 二维码    │       │\n│  │  - 秘钥池    │  │  - 下载地址  │  │  - 截图      │       │\n│  └──────────────┘  └──────────────┘  └──────────────┘      │\n│  ┌──────────────┐  ┌──────────────┐  ┌──────────────┐      │\n│  │  文件发货    │  │  API发货     │  │  自定义逻辑  │  ...  │\n│  │  - 发送文件  │  │  - 调用接口  │  │  - 按需定制  │       │\n│  │  - 上传网盘  │  │  - 返回数据  │  │              │       │\n│  └──────────────┘  └──────────────┘  └──────────────┘      │\n└─────────────────────────────────────────────────────────────┘\n\n核心原则：\n\n关注点分离：检测逻辑由框架提供，发货逻辑由用户自定义\n可扩展性：支持任意类型的发货方式\n零侵入：框架不强制特定的发货方式\n开箱即用：提供常用场景的完整模板"
      },
      {
        "title": "1. 付款检测（框架核心）",
        "body": "自动检测闲鱼聊天中的系统付款卡片：\n\n✅ 检测条件（AND 关系）：\n  - 消息类型：系统卡片（不是用户文本）\n  - 卡片内容：\"我已付款，等待你发货\"\n  - 按钮标识：有\"去发货\"按钮\n\n❌ 排除情况：\n  - 用户手打的：\"我已付款了\"、\"老板发货\"等\n  - 没有\"去发货\"按钮的消息\n  - \"待付款\"状态的卡片"
      },
      {
        "title": "2. 发货钩子（用户实现）",
        "body": "当检测到付款后，框架调用用户定义的发货钩子：\n\n# 钩子函数签名\nfulfill_order() {\n    # 输入：无（通过环境变量或全局变量获取上下文）\n    # 输出：0（成功）或非0（失败）\n    # 作用：自定义发货逻辑\n}"
      },
      {
        "title": "3. 订单上下文",
        "body": "发货时可用的上下文信息：\n\n变量说明示例$BUYER_NICKNAME买家昵称\"atting丶\"$ORDER_AMOUNT订单金额\"9.90\"$ORDER_TIME下单时间\"2026-02-28 15:30:00\"$PRODUCT_TITLE商品标题\"VIP会员兑换码\"$BUYER_AVATAR买家头像URL\"https://...\""
      },
      {
        "title": "📦 内置发货模板",
        "body": "框架提供了多种常见发货场景的完整模板，可直接使用或作为参考。"
      },
      {
        "title": "模板 1：秘钥发货（固定秘钥）",
        "body": "适用场景：\n\n测试商品（所有人用同一个秘钥）\n免费资源分享\n公开教程\n\n使用方法：\n\n#!/bin/bash\n# fulfillment-templates/01-fixed-key.sh\n\n# 配置\nSECRET_KEY=\"YOUR_SECRET_KEY_HERE\"\n\n# 发货钩子\nfulfill_order() {\n    echo \"📦 发送固定秘钥...\"\n\n    # 发送秘钥到聊天\n    agent-browser type \"您的秘钥：$SECRET_KEY，祝您使用愉快！\"\n    sleep 1\n    agent-browser click \"发 送\"\n\n    return 0\n}\n\n# 导出钩子（由框架调用）\nexport -f fulfill_order"
      },
      {
        "title": "模板 2：秘钥发货（秘钥池）",
        "body": "适用场景：\n\n每个订单使用不同秘钥\n批量售卖虚拟商品\n需要追踪每个秘钥使用情况\n\n使用方法：\n\n#!/bin/bash\n# fulfillment-templates/02-key-pool.sh\n\n# 配置\nKEY_POOL_FILE=\"keys.txt\"\nUSED_KEYS_FILE=\"used-keys.txt\"\n\n# 初始化秘钥池\ninit_key_pool() {\n    if [ ! -f \"$KEY_POOL_FILE\" ]; then\n        echo \"# 秘钥池文件 - 每行一个秘钥\" > \"$KEY_POOL_FILE\"\n        echo \"# 示例：\" >> \"$KEY_POOL_FILE\"\n        echo \"KEY-ABC123\" >> \"$KEY_POOL_FILE\"\n        echo \"KEY-DEF456\" >> \"$KEY_POOL_FILE\"\n        echo \"KEY-GHI789\" >> \"$KEY_POOL_FILE\"\n    fi\n}\n\n# 从秘钥池获取一个秘钥\nget_key_from_pool() {\n    if [ ! -f \"$KEY_POOL_FILE\" ]; then\n        echo \"❌ 秘钥池文件不存在：$KEY_POOL_FILE\"\n        return 1\n    fi\n\n    # 读取第一个非注释行\n    key=$(grep -v \"^#\" \"$KEY_POOL_FILE\" | grep -v \"^$\" | head -1)\n\n    if [ -z \"$key\" ]; then\n        echo \"❌ 秘钥池已空！\"\n        return 1\n    fi\n\n    # 从秘钥池中移除已使用的\n    sed -i '' \"/^$key$/d\" \"$KEY_POOL_FILE\" 2>/dev/null || \\\n    sed -i \"/^$key$/d\" \"$KEY_POOL_FILE\" 2>/dev/null\n\n    # 记录到已使用秘钥\n    echo \"[$(date '+%Y-%m-%d %H:%M:%S')] $key\" >> \"$USED_KEYS_FILE\"\n\n    echo \"$key\"\n}\n\n# 发货钩子\nfulfill_order() {\n    echo \"📦 从秘钥池获取秘钥...\"\n\n    # 初始化秘钥池\n    init_key_pool\n\n    # 获取秘钥\n    key=$(get_key_from_pool)\n    if [ $? -ne 0 ]; then\n        echo \"❌ 获取秘钥失败\"\n        return 1\n    fi\n\n    echo \"✅ 获取到秘钥：$key\"\n\n    # 发送秘钥\n    agent-browser type \"您的秘钥：$key，祝您使用愉快！\"\n    sleep 1\n    agent-browser click \"发 送\"\n\n    return 0\n}\n\nexport -f fulfill_order"
      },
      {
        "title": "模板 3：链接发货（网盘/下载链接）",
        "body": "适用场景：\n\n数字资源下载（软件、电子书、课程）\n大文件分享（视频、音频）\n云盘分享\n\n使用方法：\n\n#!/bin/bash\n# fulfillment-templates/03-link-delivery.sh\n\n# 配置\nDOWNLOAD_LINK=\"https://pan.baidu.com/s/XXXXXXXXXXXX\"\nEXTRACTION_CODE=\"abcd\"\n\n# 发货钩子\nfulfill_order() {\n    echo \"📦 发送下载链接...\"\n\n    # 发送链接和提取码\n    agent-browser type \"您的下载链接已准备好！\\n\\n📁 网盘链接：$DOWNLOAD_LINK\\n🔑 提取码：$EXTRACTION_CODE\\n\\n如有问题，随时联系我！\"\n    sleep 1\n    agent-browser click \"发 送\"\n\n    return 0\n}\n\nexport -f fulfill_order"
      },
      {
        "title": "模板 4：图片发货（二维码/截图）",
        "body": "适用场景：\n\n发送二维码（公众号、加好友、领取页面）\n发送教程截图\n发送凭证/卡密图片\n\n使用方法：\n\n#!/bin/bash\n# fulfillment-templates/04-image-delivery.sh\n\n# 配置\nQR_CODE_IMAGE=\"$HOME/Desktop/qr-code.png\"\n\n# 发货钩子\nfulfill_order() {\n    echo \"📦 发送二维码图片...\"\n\n    # 先发送文字说明\n    agent-browser type \"请扫描下方二维码添加好友/领取商品：\"\n    sleep 1\n    agent-browser click \"发 送\"\n\n    # 等待一下再发送图片\n    sleep 2\n\n    # 上传并发送图片（需要根据闲鱼界面调整）\n    agent-browser snapshot\n    # 找到图片上传按钮并点击\n    agent-browser find role button click --name \"图片\" || \\\n    agent-browser click \"＋\" || \\\n    agent-browser find aria-label \"图片\" click\n\n    # 等待文件选择器\n    sleep 1\n\n    # 上传文件（方法1：使用 file 输入）\n    # 注意：需要根据实际界面调整\n    agent-browser find role textbox click --name \"选择文件\"\n    # 使用系统对话框上传（需要用户手动选择或使用工具如 yd）\n\n    # 或使用快捷键（如果支持）\n    # osascript -e 'tell application \"System Events\" to keystroke \"g\" using {command down, shift down}'\n\n    return 0\n}\n\nexport -f fulfill_order"
      },
      {
        "title": "模板 5：API发货（调用外部服务）",
        "body": "适用场景：\n\n调用自动生成秘钥的API\n集成第三方发货服务\n调用自己的服务器\n\n使用方法：\n\n#!/bin/bash\n# fulfillment-templates/05-api-delivery.sh\n\n# 配置\nAPI_ENDPOINT=\"https://your-api.com/generate-key\"\nAPI_KEY=\"YOUR_API_KEY\"\n\n# 调用API生成秘钥\ncall_api_generate_key() {\n    local buyer_nickname=\"$1\"\n    local product_title=\"$2\"\n\n    echo \"📡 调用API生成秘钥...\"\n\n    response=$(curl -s -X POST \"$API_ENDPOINT\" \\\n        -H \"Authorization: Bearer $API_KEY\" \\\n        -H \"Content-Type: application/json\" \\\n        -d \"{\n            \\\"buyer\\\": \\\"$buyer_nickname\\\",\n            \\\"product\\\": \\\"$product_title\\\",\n            \\\"timestamp\\\": \\\"$(date -u +%Y-%m-%dT%H:%M:%SZ)\\\"\n        }\")\n\n    # 解析响应（假设返回 {\"key\": \"xxx\", \"success\": true}）\n    if command -v jq &> /dev/null; then\n        key=$(echo \"$response\" | jq -r '.key')\n        success=$(echo \"$response\" | jq -r '.success')\n    else\n        # 如果没有jq，使用grep\n        key=$(echo \"$response\" | grep -o '\"key\":\"[^\"]*\"' | cut -d'\"' -f4)\n        success=$(echo \"$response\" | grep -o '\"success\":[^,]*' | cut -d':' -f2)\n    fi\n\n    if [ \"$success\" = \"true\" ] && [ -n \"$key\" ]; then\n        echo \"$key\"\n        return 0\n    else\n        echo \"❌ API调用失败：$response\"\n        return 1\n    fi\n}\n\n# 发货钩子\nfulfill_order() {\n    echo \"📦 通过API发货...\"\n\n    # 获取订单上下文\n    local buyer=\"$BUYER_NICKNAME\"\n    local product=\"$PRODUCT_TITLE\"\n\n    # 调用API\n    key=$(call_api_generate_key \"$buyer\" \"$product\")\n    if [ $? -ne 0 ]; then\n        echo \"❌ 生成秘钥失败\"\n        return 1\n    fi\n\n    echo \"✅ 生成秘钥：$key\"\n\n    # 发送秘钥\n    agent-browser type \"您的秘钥：$key，祝您使用愉快！\"\n    sleep 1\n    agent-browser click \"发 送\"\n\n    return 0\n}\n\nexport -f fulfill_order"
      },
      {
        "title": "模板 6：文件发货（发送本地文件）",
        "body": "适用场景：\n\n发送PDF/电子书\n发送压缩包（资源包）\n发送软件安装包\n\n使用方法：\n\n#!/bin/bash\n# fulfillment-templates/06-file-delivery.sh\n\n# 配置\nPRODUCT_FILE=\"$HOME/Downloads/product.pdf\"\n\n# 发货钩子\nfulfill_order() {\n    echo \"📦 发送文件...\"\n\n    if [ ! -f \"$PRODUCT_FILE\" ]; then\n        echo \"❌ 文件不存在：$PRODUCT_FILE\"\n        return 1\n    fi\n\n    # 先发送文字说明\n    agent-browser type \"文件已准备好，请查收：\"\n    sleep 1\n    agent-browser click \"发 送\"\n\n    # 等待一下再发送文件\n    sleep 2\n\n    # 上传文件（需要根据闲鱼界面调整）\n    agent-browser snapshot\n    # 找到文件上传按钮\n    agent-browser find role button click --name \"文件\" || \\\n    agent-browser click \"＋\" || \\\n    agent-browser find aria-label \"文件\" click\n\n    # 等待文件选择器\n    sleep 1\n\n    # 这里需要根据实际界面实现文件上传\n    # 可能需要使用自动化工具如 yd 或 osascript\n\n    return 0\n}\n\nexport -f fulfill_order"
      },
      {
        "title": "模板 7：混合发货（组合多种方式）",
        "body": "适用场景：\n\n同时发送秘钥和链接\n发送多个步骤的指引\n复杂的发货流程\n\n使用方法：\n\n#!/bin/bash\n# fulfillment-templates/07-hybrid-delivery.sh\n\n# 配置\nSECRET_KEY=\"YOUR_KEY\"\nDOWNLOAD_LINK=\"https://example.com/download\"\nTUTORIAL_LINK=\"https://example.com/tutorial\"\n\n# 发货钩子\nfulfill_order() {\n    echo \"📦 混合发货...\"\n\n    # 发送第1条消息：秘钥\n    agent-browser type \"🔑 秘钥：$SECRET_KEY\"\n    sleep 1\n    agent-browser click \"发 送\"\n\n    sleep 1\n\n    # 发送第2条消息：下载链接\n    agent-browser type \"📥 下载链接：$DOWNLOAD_LINK\"\n    sleep 1\n    agent-browser click \"发 送\"\n\n    sleep 1\n\n    # 发送第3条消息：教程链接\n    agent-browser type \"📖 使用教程：$TUTORIAL_LINK\\n\\n如有问题随时联系我！\"\n    sleep 1\n    agent-browser click \"发 送\"\n\n    return 0\n}\n\nexport -f fulfill_order"
      },
      {
        "title": "方法 1：使用内置模板（推荐）",
        "body": "选择最接近你需求的模板，复制并修改配置：\n\n# 复制模板\ncp fulfillment-templates/02-key-pool.sh my-fulfillment.sh\n\n# 编辑配置\nnano my-fulfillment.sh"
      },
      {
        "title": "方法 2：从头创建",
        "body": "创建自己的发货脚本：\n\n#!/bin/bash\n# my-fulfillment.sh\n\n# 添加你的配置\nMY_CONFIG=\"value\"\n\n# 实现发货钩子\nfulfill_order() {\n    # 你的发货逻辑\n\n    return 0\n}\n\n# 导出钩子\nexport -f fulfill_order"
      },
      {
        "title": "方法 3：高级自定义（Python/Node.js等）",
        "body": "如果你更熟悉其他语言，也可以用其他语言实现发货逻辑：\n\n#!/usr/bin/env python3\n# my-fulfillment.py\n\nimport os\nimport json\n\ndef fulfill_order():\n    \"\"\"发货钩子\"\"\"\n    buyer = os.getenv('BUYER_NICKNAME', 'Unknown')\n    product = os.getenv('PRODUCT_TITLE', 'Unknown')\n\n    print(f\"📦 发货给 {buyer}\")\n\n    # 你的Python发货逻辑\n    key = generate_key()  # 你的秘钥生成逻辑\n\n    print(f\"✅ 生成秘钥：{key}\")\n\n    # 返回0表示成功，非0表示失败\n    return 0\n\nif __name__ == '__main__':\n    exit(fulfill_order())\n\n然后在Bash脚本中调用：\n\nfulfill_order() {\n    python3 my-fulfillment.py\n    return $?\n}"
      },
      {
        "title": "主监控脚本",
        "body": "#!/bin/bash\n# monitor.sh - 主监控脚本\n\nset -e\n\n# 配置\nFULFILLMENT_SCRIPT=\"./my-fulfillment.sh\"\nCHAT_URL=\"https://www.goofish.com/im\"\nPROFILE=\"$HOME/Library/Application Support/Google/Chrome/Default\"\nLOG_FILE=\"fulfillment-$(date +%Y%m%d).log\"\nCHECK_INTERVAL=30  # 检查间隔（秒）\n\n# 日志函数\nlog() {\n    echo \"[$(date '+%Y-%m-%d %H:%M:%S')] $1\" | tee -a \"$LOG_FILE\"\n}\n\n# 加载发货钩子\nload_fulfillment_hook() {\n    if [ -f \"$FULFILLMENT_SCRIPT\" ]; then\n        log \"📦 加载发货脚本：$FULFILLMENT_SCRIPT\"\n        source \"$FULFILLMENT_SCRIPT\"\n    else\n        log \"❌ 发货脚本不存在：$FULFILLMENT_SCRIPT\"\n        exit 1\n    fi\n}\n\n# 检测付款\ncheck_payment() {\n    log \"🔍 检测付款状态...\"\n\n    # 获取聊天快照\n    local snapshot=$(agent-browser snapshot)\n\n    # 检测付款卡片\n    if echo \"$snapshot\" | grep -q \"我已付款，等待你发货\" && \\\n       echo \"$snapshot\" | grep -q \"button.*去发货\"; then\n        log \"✅ 检测到付款\"\n        return 0\n    else\n        log \"⏸️  暂无新付款\"\n        return 1\n    fi\n}\n\n# 提取订单上下文\nextract_order_context() {\n    # 从聊天快照中提取订单信息\n    local snapshot=$(agent-browser snapshot)\n\n    # 提取买家昵称（根据实际页面结构调整）\n    BUYER_NICKNAME=$(echo \"$snapshot\" | grep -oP '(?<=nickname\":\")[^\"]*')\n\n    # 提取商品标题\n    PRODUCT_TITLE=$(echo \"$snapshot\" | grep -oP '(?<=title\":\")[^\"]*')\n\n    # 导出为环境变量\n    export BUYER_NICKNAME\n    export PRODUCT_TITLE\n    export ORDER_TIME=$(date '+%Y-%m-%d %H:%M:%S')\n\n    log \"📋 订单信息：买家=$BUYER_NICKNAME, 商品=$PRODUCT_TITLE\"\n}\n\n# 执行发货\nexecute_fulfillment() {\n    log \"🚀 执行发货...\"\n\n    # 提取订单上下文\n    extract_order_context\n\n    # 调用发货钩子\n    if declare -f fulfill_order > /dev/null; then\n        fulfill_order\n        local result=$?\n        if [ $result -eq 0 ]; then\n            log \"✅ 发货成功\"\n        else\n            log \"❌ 发货失败（返回码：$result）\"\n        fi\n        return $result\n    else\n        log \"❌ 发货钩子函数未定义\"\n        return 1\n    fi\n}\n\n# 主循环\nmain() {\n    log \"🚀 启动闲鱼自动发货系统\"\n\n    # 加载发货钩子\n    load_fulfillment_hook\n\n    # 打开闲鱼\n    agent-browser --headed --profile \"$PROFILE\" open \"$CHAT_URL\"\n    sleep 5\n\n    # 监控循环\n    while true; do\n        if check_payment; then\n            execute_fulfillment\n\n            # 发货后等待一段时间再检查下一个\n            sleep 60\n        else\n            sleep $CHECK_INTERVAL\n        fi\n    done\n}\n\n# 运行\nmain"
      },
      {
        "title": "首次设置",
        "body": "# 1. 创建工作目录\nmkdir -p ~/xianyu-auto-fulfillment\ncd ~/xianyu-auto-fulfillment\n\n# 2. 安装依赖\nnpm install -g agent-browser\nagent-browser install\n\n# 3. 复制模板\ncp /path/to/xianyu-auto-fulfillment/fulfillment-templates/02-key-pool.sh my-fulfillment.sh\n\n# 4. 编辑配置\nnano my-fulfillment.sh\n\n# 5. 创建秘钥池\necho \"KEY-ABC123\" > keys.txt\necho \"KEY-DEF456\" >> keys.txt\n\n# 6. 首次运行（手动登录）\nagent-browser --headed --profile \"$PROFILE\" open \"https://www.goofish.com/im\"\n# 在浏览器中登录闲鱼\n\n# 7. 启动监控\nchmod +x monitor.sh\n./monitor.sh"
      },
      {
        "title": "环境变量",
        "body": "变量说明默认值FULFILLMENT_SCRIPT发货脚本路径./my-fulfillment.shCHAT_URL闲鱼聊天URLhttps://www.goofish.com/imPROFILEChrome配置文件路径~/Library/Application Support/Google/Chrome/DefaultCHECK_INTERVAL检查间隔（秒）30LOG_FILE日志文件路径fulfillment-YYYYMMDD.log"
      },
      {
        "title": "agent-browser 配置",
        "body": "export AGENT_BROWSER_PROFILE=\"$HOME/Library/Application Support/Google/Chrome/Default\"\nexport AGENT_BROWSER_HEADED=true\nexport AGENT_BROWSER_TIMEOUT=25000"
      },
      {
        "title": "日志格式",
        "body": "[2026-02-28 15:30:00] 🚀 启动闲鱼自动发货系统\n[2026-02-28 15:30:05] 📦 加载发货脚本：my-fulfillment.sh\n[2026-02-28 15:30:10] 🔍 检测付款状态...\n[2026-02-28 15:30:15] ✅ 检测到付款\n[2026-02-28 15:30:15] 📋 订单信息：买家=atting丶, 商品=VIP会员\n[2026-02-28 15:30:16] 🚀 执行发货...\n[2026-02-28 15:30:16] 📦 从秘钥池获取秘钥...\n[2026-02-28 15:30:16] ✅ 获取到秘钥：KEY-ABC123\n[2026-02-28 15:30:18] ✅ 发货成功"
      },
      {
        "title": "查看日志",
        "body": "# 查看今天的日志\ncat fulfillment-$(date +%Y%m%d).log\n\n# 实时监控日志\ntail -f fulfillment-$(date +%Y%m%d).log\n\n# 搜索发货记录\ngrep \"发货成功\" fulfillment-$(date +%Y%m%d).log"
      },
      {
        "title": "macOS 通知",
        "body": "# 在发货钩子中添加\nosascript -e 'display notification \"闲鱼订单已完成\" with title \"发货成功\"'"
      },
      {
        "title": "Telegram 通知",
        "body": "# 在发货钩子中添加\nsend_telegram_notification() {\n    local message=\"闲鱼订单已完成\\n\\n买家：$BUYER_NICKNAME\\n秘钥：$key\"\n    curl -s -X POST \"https://api.telegram.org/botYOUR_BOT_TOKEN/sendMessage\" \\\n        -d \"chat_id=YOUR_CHAT_ID\" \\\n        -d \"text=$message\"\n}"
      },
      {
        "title": "企业微信通知",
        "body": "# 企业微信机器人\nsend_wework_notification() {\n    local webhook_url=\"YOUR_WEBHOOK_URL\"\n    local data=$(cat <<EOF\n{\n    \"msgtype\": \"text\",\n    \"text\": {\n        \"content\": \"闲鱼订单已完成\\n买家：$BUYER_NICKNAME\\n秘钥：$key\"\n    }\n}\nEOF\n)\n    curl -s -X POST \"$webhook_url\" -H \"Content-Type: application/json\" -d \"$data\"\n}"
      },
      {
        "title": "问题 1：无法检测付款",
        "body": "症状： check_payment 始终返回\"暂无新付款\"\n\n排查步骤：\n\n确认买家已付款（在闲鱼APP中查看）\n确认是系统卡片，不是用户文本\n检查快照内容：agent-browser snapshot | grep \"我已付款\"\n确认是否有\"去发货\"按钮\n\n解决方案：\n\n# 手动检查页面\nagent-browser snapshot\n\n# 检查是否有付款卡片\nagent-browser snapshot | grep \"我已付款\"\nagent-browser snapshot | grep \"去发货\""
      },
      {
        "title": "问题 2：发货脚本未加载",
        "body": "症状： ❌ 发货钩子函数未定义\n\n排查步骤：\n\n检查脚本是否存在：ls -l my-fulfillment.sh\n检查是否有执行权限：chmod +x my-fulfillment.sh\n检查是否正确导出函数：export -f fulfill_order\n检查脚本语法：bash -n my-fulfillment.sh\n\n解决方案：\n\n# 确保脚本中有这一行\nexport -f fulfill_order\n\n# 检查函数是否定义\ndeclare -f fulfill_order"
      },
      {
        "title": "问题 3：Chrome 登录失效",
        "body": "症状： 闲鱼要求重新登录\n\n解决方案：\n\n# 手动登录一次\nagent-browser --headed --profile \"$PROFILE\" open \"https://www.goofish.com/im\"\n# 在浏览器中完成登录"
      },
      {
        "title": "问题 4：按钮点击失败",
        "body": "症状： agent-browser click \"发 送\" 无效\n\n解决方案：\n\n# 方法1：使用 ref 点击\nagent-browser snapshot -i  # 获取可交互元素的 ref\nagent-browser click @e8\n\n# 方法2：使用角色查找\nagent-browser find role button click --name \"发送\"\n\n# 方法3：使用 ARIA 标签\nagent-browser find aria-label \"发送\" click"
      },
      {
        "title": "1. 错误处理",
        "body": "fulfill_order() {\n    # 启用严格模式\n    set -e\n\n    # 检查必要条件\n    if [ -z \"$SECRET_KEY\" ]; then\n        echo \"❌ SECRET_KEY 未配置\"\n        return 1\n    fi\n\n    # 执行发货\n    agent-browser type \"您的秘钥：$SECRET_KEY\"\n    sleep 1\n\n    # 验证发送成功\n    if agent-browser find text \"您的秘钥\" > /dev/null; then\n        echo \"✅ 发送成功\"\n        return 0\n    else\n        echo \"❌ 发送失败\"\n        return 1\n    fi\n}"
      },
      {
        "title": "2. 重试机制",
        "body": "fulfill_order() {\n    local max_retries=3\n    local retry_count=0\n\n    while [ $retry_count -lt $max_retries ]; do\n        if send_key \"$SECRET_KEY\"; then\n            echo \"✅ 发货成功\"\n            return 0\n        else\n            retry_count=$((retry_count + 1))\n            echo \"⚠️  发送失败，重试 $retry_count/$max_retries...\"\n            sleep 2\n        fi\n    done\n\n    echo \"❌ 发货失败，已达最大重试次数\"\n    return 1\n}"
      },
      {
        "title": "3. 订单限流",
        "body": "# 防止同一买家短时间内重复下单\ncheck_rate_limit() {\n    local buyer=\"$BUYER_NICKNAME\"\n    local last_fulfillment_file=\".last_fulfillment_$buyer\"\n    local min_interval=300  # 5分钟\n\n    if [ -f \"$last_fulfillment_file\" ]; then\n        local last_time=$(cat \"$last_fulfillment_file\")\n        local current_time=$(date +%s)\n        local elapsed=$((current_time - last_time))\n\n        if [ $elapsed -lt $min_interval ]; then\n            echo \"⚠️  买家 $buyer 距上次发货仅 ${elapsed}秒，跳过\"\n            return 1\n        fi\n    fi\n\n    date +%s > \"$last_fulfillment_file\"\n    return 0\n}\n\nfulfill_order() {\n    if ! check_rate_limit; then\n        return 1\n    fi\n\n    # 正常发货逻辑\n    ...\n}"
      },
      {
        "title": "4. 日志增强",
        "body": "log_order() {\n    local status=\"$1\"\n    local key=\"$2\"\n\n    echo \"[$(date '+%Y-%m-%d %H:%M:%S')] $status | 买家：$BUYER_NICKNAME | 商品：$PRODUCT_TITLE | 秘钥：$key\" >> \"$LOG_FILE\"\n}\n\nfulfill_order() {\n    log_order \"开始发货\" \"$key\"\n\n    if send_key \"$key\"; then\n        log_order \"发货成功\" \"$key\"\n        return 0\n    else\n        log_order \"发货失败\" \"$key\"\n        return 1\n    fi\n}"
      },
      {
        "title": "🤝 贡献指南",
        "body": "欢迎贡献新的发货模板！"
      },
      {
        "title": "提交模板",
        "body": "在 fulfillment-templates/ 目录下创建新文件\n遵循命名规范：XX-description.sh\n添加详细注释\n提供配置示例\n更新本文档"
      },
      {
        "title": "模板结构",
        "body": "#!/bin/bash\n# fulfillment-templates/XX-description.sh\n\n# === 配置区 ===\n# 在这里添加你的配置\n\n# === 函数区 ===\n# 在这里实现你的发货逻辑\n\n# 发货钩子（必须实现）\nfulfill_order() {\n    # 你的发货逻辑\n    return 0\n}\n\nexport -f fulfill_order"
      },
      {
        "title": "📄 许可证",
        "body": "MIT License"
      },
      {
        "title": "🆘 获取帮助",
        "body": "查看模板目录：fulfillment-templates/\n查看日志：fulfillment-YYYYMMDD.log\nGitHub Issues：提交问题\nDiscord 社区：加入讨论\n\n免责声明： 本框架仅供学习和个人使用，请遵守闲鱼的使用条款。作者不对使用本框架造成的任何后果负责。"
      }
    ],
    "body": "🐟 闲鱼自动发货框架\n\n一个可扩展的闲鱼虚拟商品自动化发货系统。核心提供付款检测，发货流程完全可自定义。\n\n🎯 设计理念\n┌─────────────────────────────────────────────────────────────┐\n│                    核心检测层（框架提供）                     │\n│  ┌──────────────┐    ┌──────────────┐    ┌──────────────┐  │\n│  │  监控聊天    │ -> │  检测付款    │ -> │  触发发货    │  │\n│  │  - 新消息    │    │  - 系统卡片  │    │  - 调用钩子  │  │\n│  │  - 未读标记  │    │  - 状态判断  │    │              │  │\n│  └──────────────┘    └──────────────┘    └──────────────┘  │\n└─────────────────────────────────────────────────────────────┘\n                              │\n                              ▼\n┌─────────────────────────────────────────────────────────────┐\n│                  自定义发货层（用户实现）                      │\n│  ┌──────────────┐  ┌──────────────┐  ┌──────────────┐      │\n│  │  秘钥发货    │  │  链接发货    │  │  图片发货    │  ...  │\n│  │  - 固定秘钥  │  │  - 网盘链接  │  │  - 二维码    │       │\n│  │  - 秘钥池    │  │  - 下载地址  │  │  - 截图      │       │\n│  └──────────────┘  └──────────────┘  └──────────────┘      │\n│  ┌──────────────┐  ┌──────────────┐  ┌──────────────┐      │\n│  │  文件发货    │  │  API发货     │  │  自定义逻辑  │  ...  │\n│  │  - 发送文件  │  │  - 调用接口  │  │  - 按需定制  │       │\n│  │  - 上传网盘  │  │  - 返回数据  │  │              │       │\n│  └──────────────┘  └──────────────┘  └──────────────┘      │\n└─────────────────────────────────────────────────────────────┘\n\n\n核心原则：\n\n关注点分离：检测逻辑由框架提供，发货逻辑由用户自定义\n可扩展性：支持任意类型的发货方式\n零侵入：框架不强制特定的发货方式\n开箱即用：提供常用场景的完整模板\n🏗️ 核心概念\n1. 付款检测（框架核心）\n\n自动检测闲鱼聊天中的系统付款卡片：\n\n✅ 检测条件（AND 关系）：\n  - 消息类型：系统卡片（不是用户文本）\n  - 卡片内容：\"我已付款，等待你发货\"\n  - 按钮标识：有\"去发货\"按钮\n\n❌ 排除情况：\n  - 用户手打的：\"我已付款了\"、\"老板发货\"等\n  - 没有\"去发货\"按钮的消息\n  - \"待付款\"状态的卡片\n\n2. 发货钩子（用户实现）\n\n当检测到付款后，框架调用用户定义的发货钩子：\n\n# 钩子函数签名\nfulfill_order() {\n    # 输入：无（通过环境变量或全局变量获取上下文）\n    # 输出：0（成功）或非0（失败）\n    # 作用：自定义发货逻辑\n}\n\n3. 订单上下文\n\n发货时可用的上下文信息：\n\n变量\t说明\t示例\n$BUYER_NICKNAME\t买家昵称\t\"atting丶\"\n$ORDER_AMOUNT\t订单金额\t\"9.90\"\n$ORDER_TIME\t下单时间\t\"2026-02-28 15:30:00\"\n$PRODUCT_TITLE\t商品标题\t\"VIP会员兑换码\"\n$BUYER_AVATAR\t买家头像URL\t\"https://...\"\n📦 内置发货模板\n\n框架提供了多种常见发货场景的完整模板，可直接使用或作为参考。\n\n模板 1：秘钥发货（固定秘钥）\n\n适用场景：\n\n测试商品（所有人用同一个秘钥）\n免费资源分享\n公开教程\n\n使用方法：\n\n#!/bin/bash\n# fulfillment-templates/01-fixed-key.sh\n\n# 配置\nSECRET_KEY=\"YOUR_SECRET_KEY_HERE\"\n\n# 发货钩子\nfulfill_order() {\n    echo \"📦 发送固定秘钥...\"\n\n    # 发送秘钥到聊天\n    agent-browser type \"您的秘钥：$SECRET_KEY，祝您使用愉快！\"\n    sleep 1\n    agent-browser click \"发 送\"\n\n    return 0\n}\n\n# 导出钩子（由框架调用）\nexport -f fulfill_order\n\n模板 2：秘钥发货（秘钥池）\n\n适用场景：\n\n每个订单使用不同秘钥\n批量售卖虚拟商品\n需要追踪每个秘钥使用情况\n\n使用方法：\n\n#!/bin/bash\n# fulfillment-templates/02-key-pool.sh\n\n# 配置\nKEY_POOL_FILE=\"keys.txt\"\nUSED_KEYS_FILE=\"used-keys.txt\"\n\n# 初始化秘钥池\ninit_key_pool() {\n    if [ ! -f \"$KEY_POOL_FILE\" ]; then\n        echo \"# 秘钥池文件 - 每行一个秘钥\" > \"$KEY_POOL_FILE\"\n        echo \"# 示例：\" >> \"$KEY_POOL_FILE\"\n        echo \"KEY-ABC123\" >> \"$KEY_POOL_FILE\"\n        echo \"KEY-DEF456\" >> \"$KEY_POOL_FILE\"\n        echo \"KEY-GHI789\" >> \"$KEY_POOL_FILE\"\n    fi\n}\n\n# 从秘钥池获取一个秘钥\nget_key_from_pool() {\n    if [ ! -f \"$KEY_POOL_FILE\" ]; then\n        echo \"❌ 秘钥池文件不存在：$KEY_POOL_FILE\"\n        return 1\n    fi\n\n    # 读取第一个非注释行\n    key=$(grep -v \"^#\" \"$KEY_POOL_FILE\" | grep -v \"^$\" | head -1)\n\n    if [ -z \"$key\" ]; then\n        echo \"❌ 秘钥池已空！\"\n        return 1\n    fi\n\n    # 从秘钥池中移除已使用的\n    sed -i '' \"/^$key$/d\" \"$KEY_POOL_FILE\" 2>/dev/null || \\\n    sed -i \"/^$key$/d\" \"$KEY_POOL_FILE\" 2>/dev/null\n\n    # 记录到已使用秘钥\n    echo \"[$(date '+%Y-%m-%d %H:%M:%S')] $key\" >> \"$USED_KEYS_FILE\"\n\n    echo \"$key\"\n}\n\n# 发货钩子\nfulfill_order() {\n    echo \"📦 从秘钥池获取秘钥...\"\n\n    # 初始化秘钥池\n    init_key_pool\n\n    # 获取秘钥\n    key=$(get_key_from_pool)\n    if [ $? -ne 0 ]; then\n        echo \"❌ 获取秘钥失败\"\n        return 1\n    fi\n\n    echo \"✅ 获取到秘钥：$key\"\n\n    # 发送秘钥\n    agent-browser type \"您的秘钥：$key，祝您使用愉快！\"\n    sleep 1\n    agent-browser click \"发 送\"\n\n    return 0\n}\n\nexport -f fulfill_order\n\n模板 3：链接发货（网盘/下载链接）\n\n适用场景：\n\n数字资源下载（软件、电子书、课程）\n大文件分享（视频、音频）\n云盘分享\n\n使用方法：\n\n#!/bin/bash\n# fulfillment-templates/03-link-delivery.sh\n\n# 配置\nDOWNLOAD_LINK=\"https://pan.baidu.com/s/XXXXXXXXXXXX\"\nEXTRACTION_CODE=\"abcd\"\n\n# 发货钩子\nfulfill_order() {\n    echo \"📦 发送下载链接...\"\n\n    # 发送链接和提取码\n    agent-browser type \"您的下载链接已准备好！\\n\\n📁 网盘链接：$DOWNLOAD_LINK\\n🔑 提取码：$EXTRACTION_CODE\\n\\n如有问题，随时联系我！\"\n    sleep 1\n    agent-browser click \"发 送\"\n\n    return 0\n}\n\nexport -f fulfill_order\n\n模板 4：图片发货（二维码/截图）\n\n适用场景：\n\n发送二维码（公众号、加好友、领取页面）\n发送教程截图\n发送凭证/卡密图片\n\n使用方法：\n\n#!/bin/bash\n# fulfillment-templates/04-image-delivery.sh\n\n# 配置\nQR_CODE_IMAGE=\"$HOME/Desktop/qr-code.png\"\n\n# 发货钩子\nfulfill_order() {\n    echo \"📦 发送二维码图片...\"\n\n    # 先发送文字说明\n    agent-browser type \"请扫描下方二维码添加好友/领取商品：\"\n    sleep 1\n    agent-browser click \"发 送\"\n\n    # 等待一下再发送图片\n    sleep 2\n\n    # 上传并发送图片（需要根据闲鱼界面调整）\n    agent-browser snapshot\n    # 找到图片上传按钮并点击\n    agent-browser find role button click --name \"图片\" || \\\n    agent-browser click \"＋\" || \\\n    agent-browser find aria-label \"图片\" click\n\n    # 等待文件选择器\n    sleep 1\n\n    # 上传文件（方法1：使用 file 输入）\n    # 注意：需要根据实际界面调整\n    agent-browser find role textbox click --name \"选择文件\"\n    # 使用系统对话框上传（需要用户手动选择或使用工具如 yd）\n\n    # 或使用快捷键（如果支持）\n    # osascript -e 'tell application \"System Events\" to keystroke \"g\" using {command down, shift down}'\n\n    return 0\n}\n\nexport -f fulfill_order\n\n模板 5：API发货（调用外部服务）\n\n适用场景：\n\n调用自动生成秘钥的API\n集成第三方发货服务\n调用自己的服务器\n\n使用方法：\n\n#!/bin/bash\n# fulfillment-templates/05-api-delivery.sh\n\n# 配置\nAPI_ENDPOINT=\"https://your-api.com/generate-key\"\nAPI_KEY=\"YOUR_API_KEY\"\n\n# 调用API生成秘钥\ncall_api_generate_key() {\n    local buyer_nickname=\"$1\"\n    local product_title=\"$2\"\n\n    echo \"📡 调用API生成秘钥...\"\n\n    response=$(curl -s -X POST \"$API_ENDPOINT\" \\\n        -H \"Authorization: Bearer $API_KEY\" \\\n        -H \"Content-Type: application/json\" \\\n        -d \"{\n            \\\"buyer\\\": \\\"$buyer_nickname\\\",\n            \\\"product\\\": \\\"$product_title\\\",\n            \\\"timestamp\\\": \\\"$(date -u +%Y-%m-%dT%H:%M:%SZ)\\\"\n        }\")\n\n    # 解析响应（假设返回 {\"key\": \"xxx\", \"success\": true}）\n    if command -v jq &> /dev/null; then\n        key=$(echo \"$response\" | jq -r '.key')\n        success=$(echo \"$response\" | jq -r '.success')\n    else\n        # 如果没有jq，使用grep\n        key=$(echo \"$response\" | grep -o '\"key\":\"[^\"]*\"' | cut -d'\"' -f4)\n        success=$(echo \"$response\" | grep -o '\"success\":[^,]*' | cut -d':' -f2)\n    fi\n\n    if [ \"$success\" = \"true\" ] && [ -n \"$key\" ]; then\n        echo \"$key\"\n        return 0\n    else\n        echo \"❌ API调用失败：$response\"\n        return 1\n    fi\n}\n\n# 发货钩子\nfulfill_order() {\n    echo \"📦 通过API发货...\"\n\n    # 获取订单上下文\n    local buyer=\"$BUYER_NICKNAME\"\n    local product=\"$PRODUCT_TITLE\"\n\n    # 调用API\n    key=$(call_api_generate_key \"$buyer\" \"$product\")\n    if [ $? -ne 0 ]; then\n        echo \"❌ 生成秘钥失败\"\n        return 1\n    fi\n\n    echo \"✅ 生成秘钥：$key\"\n\n    # 发送秘钥\n    agent-browser type \"您的秘钥：$key，祝您使用愉快！\"\n    sleep 1\n    agent-browser click \"发 送\"\n\n    return 0\n}\n\nexport -f fulfill_order\n\n模板 6：文件发货（发送本地文件）\n\n适用场景：\n\n发送PDF/电子书\n发送压缩包（资源包）\n发送软件安装包\n\n使用方法：\n\n#!/bin/bash\n# fulfillment-templates/06-file-delivery.sh\n\n# 配置\nPRODUCT_FILE=\"$HOME/Downloads/product.pdf\"\n\n# 发货钩子\nfulfill_order() {\n    echo \"📦 发送文件...\"\n\n    if [ ! -f \"$PRODUCT_FILE\" ]; then\n        echo \"❌ 文件不存在：$PRODUCT_FILE\"\n        return 1\n    fi\n\n    # 先发送文字说明\n    agent-browser type \"文件已准备好，请查收：\"\n    sleep 1\n    agent-browser click \"发 送\"\n\n    # 等待一下再发送文件\n    sleep 2\n\n    # 上传文件（需要根据闲鱼界面调整）\n    agent-browser snapshot\n    # 找到文件上传按钮\n    agent-browser find role button click --name \"文件\" || \\\n    agent-browser click \"＋\" || \\\n    agent-browser find aria-label \"文件\" click\n\n    # 等待文件选择器\n    sleep 1\n\n    # 这里需要根据实际界面实现文件上传\n    # 可能需要使用自动化工具如 yd 或 osascript\n\n    return 0\n}\n\nexport -f fulfill_order\n\n模板 7：混合发货（组合多种方式）\n\n适用场景：\n\n同时发送秘钥和链接\n发送多个步骤的指引\n复杂的发货流程\n\n使用方法：\n\n#!/bin/bash\n# fulfillment-templates/07-hybrid-delivery.sh\n\n# 配置\nSECRET_KEY=\"YOUR_KEY\"\nDOWNLOAD_LINK=\"https://example.com/download\"\nTUTORIAL_LINK=\"https://example.com/tutorial\"\n\n# 发货钩子\nfulfill_order() {\n    echo \"📦 混合发货...\"\n\n    # 发送第1条消息：秘钥\n    agent-browser type \"🔑 秘钥：$SECRET_KEY\"\n    sleep 1\n    agent-browser click \"发 送\"\n\n    sleep 1\n\n    # 发送第2条消息：下载链接\n    agent-browser type \"📥 下载链接：$DOWNLOAD_LINK\"\n    sleep 1\n    agent-browser click \"发 送\"\n\n    sleep 1\n\n    # 发送第3条消息：教程链接\n    agent-browser type \"📖 使用教程：$TUTORIAL_LINK\\n\\n如有问题随时联系我！\"\n    sleep 1\n    agent-browser click \"发 送\"\n\n    return 0\n}\n\nexport -f fulfill_order\n\n🛠️ 自定义发货流程\n方法 1：使用内置模板（推荐）\n\n选择最接近你需求的模板，复制并修改配置：\n\n# 复制模板\ncp fulfillment-templates/02-key-pool.sh my-fulfillment.sh\n\n# 编辑配置\nnano my-fulfillment.sh\n\n方法 2：从头创建\n\n创建自己的发货脚本：\n\n#!/bin/bash\n# my-fulfillment.sh\n\n# 添加你的配置\nMY_CONFIG=\"value\"\n\n# 实现发货钩子\nfulfill_order() {\n    # 你的发货逻辑\n\n    return 0\n}\n\n# 导出钩子\nexport -f fulfill_order\n\n方法 3：高级自定义（Python/Node.js等）\n\n如果你更熟悉其他语言，也可以用其他语言实现发货逻辑：\n\n#!/usr/bin/env python3\n# my-fulfillment.py\n\nimport os\nimport json\n\ndef fulfill_order():\n    \"\"\"发货钩子\"\"\"\n    buyer = os.getenv('BUYER_NICKNAME', 'Unknown')\n    product = os.getenv('PRODUCT_TITLE', 'Unknown')\n\n    print(f\"📦 发货给 {buyer}\")\n\n    # 你的Python发货逻辑\n    key = generate_key()  # 你的秘钥生成逻辑\n\n    print(f\"✅ 生成秘钥：{key}\")\n\n    # 返回0表示成功，非0表示失败\n    return 0\n\nif __name__ == '__main__':\n    exit(fulfill_order())\n\n\n然后在Bash脚本中调用：\n\nfulfill_order() {\n    python3 my-fulfillment.py\n    return $?\n}\n\n🚀 框架核心实现\n主监控脚本\n#!/bin/bash\n# monitor.sh - 主监控脚本\n\nset -e\n\n# 配置\nFULFILLMENT_SCRIPT=\"./my-fulfillment.sh\"\nCHAT_URL=\"https://www.goofish.com/im\"\nPROFILE=\"$HOME/Library/Application Support/Google/Chrome/Default\"\nLOG_FILE=\"fulfillment-$(date +%Y%m%d).log\"\nCHECK_INTERVAL=30  # 检查间隔（秒）\n\n# 日志函数\nlog() {\n    echo \"[$(date '+%Y-%m-%d %H:%M:%S')] $1\" | tee -a \"$LOG_FILE\"\n}\n\n# 加载发货钩子\nload_fulfillment_hook() {\n    if [ -f \"$FULFILLMENT_SCRIPT\" ]; then\n        log \"📦 加载发货脚本：$FULFILLMENT_SCRIPT\"\n        source \"$FULFILLMENT_SCRIPT\"\n    else\n        log \"❌ 发货脚本不存在：$FULFILLMENT_SCRIPT\"\n        exit 1\n    fi\n}\n\n# 检测付款\ncheck_payment() {\n    log \"🔍 检测付款状态...\"\n\n    # 获取聊天快照\n    local snapshot=$(agent-browser snapshot)\n\n    # 检测付款卡片\n    if echo \"$snapshot\" | grep -q \"我已付款，等待你发货\" && \\\n       echo \"$snapshot\" | grep -q \"button.*去发货\"; then\n        log \"✅ 检测到付款\"\n        return 0\n    else\n        log \"⏸️  暂无新付款\"\n        return 1\n    fi\n}\n\n# 提取订单上下文\nextract_order_context() {\n    # 从聊天快照中提取订单信息\n    local snapshot=$(agent-browser snapshot)\n\n    # 提取买家昵称（根据实际页面结构调整）\n    BUYER_NICKNAME=$(echo \"$snapshot\" | grep -oP '(?<=nickname\":\")[^\"]*')\n\n    # 提取商品标题\n    PRODUCT_TITLE=$(echo \"$snapshot\" | grep -oP '(?<=title\":\")[^\"]*')\n\n    # 导出为环境变量\n    export BUYER_NICKNAME\n    export PRODUCT_TITLE\n    export ORDER_TIME=$(date '+%Y-%m-%d %H:%M:%S')\n\n    log \"📋 订单信息：买家=$BUYER_NICKNAME, 商品=$PRODUCT_TITLE\"\n}\n\n# 执行发货\nexecute_fulfillment() {\n    log \"🚀 执行发货...\"\n\n    # 提取订单上下文\n    extract_order_context\n\n    # 调用发货钩子\n    if declare -f fulfill_order > /dev/null; then\n        fulfill_order\n        local result=$?\n        if [ $result -eq 0 ]; then\n            log \"✅ 发货成功\"\n        else\n            log \"❌ 发货失败（返回码：$result）\"\n        fi\n        return $result\n    else\n        log \"❌ 发货钩子函数未定义\"\n        return 1\n    fi\n}\n\n# 主循环\nmain() {\n    log \"🚀 启动闲鱼自动发货系统\"\n\n    # 加载发货钩子\n    load_fulfillment_hook\n\n    # 打开闲鱼\n    agent-browser --headed --profile \"$PROFILE\" open \"$CHAT_URL\"\n    sleep 5\n\n    # 监控循环\n    while true; do\n        if check_payment; then\n            execute_fulfillment\n\n            # 发货后等待一段时间再检查下一个\n            sleep 60\n        else\n            sleep $CHECK_INTERVAL\n        fi\n    done\n}\n\n# 运行\nmain\n\n📋 完整工作流程\n首次设置\n# 1. 创建工作目录\nmkdir -p ~/xianyu-auto-fulfillment\ncd ~/xianyu-auto-fulfillment\n\n# 2. 安装依赖\nnpm install -g agent-browser\nagent-browser install\n\n# 3. 复制模板\ncp /path/to/xianyu-auto-fulfillment/fulfillment-templates/02-key-pool.sh my-fulfillment.sh\n\n# 4. 编辑配置\nnano my-fulfillment.sh\n\n# 5. 创建秘钥池\necho \"KEY-ABC123\" > keys.txt\necho \"KEY-DEF456\" >> keys.txt\n\n# 6. 首次运行（手动登录）\nagent-browser --headed --profile \"$PROFILE\" open \"https://www.goofish.com/im\"\n# 在浏览器中登录闲鱼\n\n# 7. 启动监控\nchmod +x monitor.sh\n./monitor.sh\n\n🔧 配置选项\n环境变量\n变量\t说明\t默认值\nFULFILLMENT_SCRIPT\t发货脚本路径\t./my-fulfillment.sh\nCHAT_URL\t闲鱼聊天URL\thttps://www.goofish.com/im\nPROFILE\tChrome配置文件路径\t~/Library/Application Support/Google/Chrome/Default\nCHECK_INTERVAL\t检查间隔（秒）\t30\nLOG_FILE\t日志文件路径\tfulfillment-YYYYMMDD.log\nagent-browser 配置\nexport AGENT_BROWSER_PROFILE=\"$HOME/Library/Application Support/Google/Chrome/Default\"\nexport AGENT_BROWSER_HEADED=true\nexport AGENT_BROWSER_TIMEOUT=25000\n\n📝 日志记录\n日志格式\n[2026-02-28 15:30:00] 🚀 启动闲鱼自动发货系统\n[2026-02-28 15:30:05] 📦 加载发货脚本：my-fulfillment.sh\n[2026-02-28 15:30:10] 🔍 检测付款状态...\n[2026-02-28 15:30:15] ✅ 检测到付款\n[2026-02-28 15:30:15] 📋 订单信息：买家=atting丶, 商品=VIP会员\n[2026-02-28 15:30:16] 🚀 执行发货...\n[2026-02-28 15:30:16] 📦 从秘钥池获取秘钥...\n[2026-02-28 15:30:16] ✅ 获取到秘钥：KEY-ABC123\n[2026-02-28 15:30:18] ✅ 发货成功\n\n查看日志\n# 查看今天的日志\ncat fulfillment-$(date +%Y%m%d).log\n\n# 实时监控日志\ntail -f fulfillment-$(date +%Y%m%d).log\n\n# 搜索发货记录\ngrep \"发货成功\" fulfillment-$(date +%Y%m%d).log\n\n🔔 通知提醒\nmacOS 通知\n# 在发货钩子中添加\nosascript -e 'display notification \"闲鱼订单已完成\" with title \"发货成功\"'\n\nTelegram 通知\n# 在发货钩子中添加\nsend_telegram_notification() {\n    local message=\"闲鱼订单已完成\\n\\n买家：$BUYER_NICKNAME\\n秘钥：$key\"\n    curl -s -X POST \"https://api.telegram.org/botYOUR_BOT_TOKEN/sendMessage\" \\\n        -d \"chat_id=YOUR_CHAT_ID\" \\\n        -d \"text=$message\"\n}\n\n企业微信通知\n# 企业微信机器人\nsend_wework_notification() {\n    local webhook_url=\"YOUR_WEBHOOK_URL\"\n    local data=$(cat <<EOF\n{\n    \"msgtype\": \"text\",\n    \"text\": {\n        \"content\": \"闲鱼订单已完成\\n买家：$BUYER_NICKNAME\\n秘钥：$key\"\n    }\n}\nEOF\n)\n    curl -s -X POST \"$webhook_url\" -H \"Content-Type: application/json\" -d \"$data\"\n}\n\n⚠️ 故障排查\n问题 1：无法检测付款\n\n症状： check_payment 始终返回\"暂无新付款\"\n\n排查步骤：\n\n确认买家已付款（在闲鱼APP中查看）\n确认是系统卡片，不是用户文本\n检查快照内容：agent-browser snapshot | grep \"我已付款\"\n确认是否有\"去发货\"按钮\n\n解决方案：\n\n# 手动检查页面\nagent-browser snapshot\n\n# 检查是否有付款卡片\nagent-browser snapshot | grep \"我已付款\"\nagent-browser snapshot | grep \"去发货\"\n\n问题 2：发货脚本未加载\n\n症状： ❌ 发货钩子函数未定义\n\n排查步骤：\n\n检查脚本是否存在：ls -l my-fulfillment.sh\n检查是否有执行权限：chmod +x my-fulfillment.sh\n检查是否正确导出函数：export -f fulfill_order\n检查脚本语法：bash -n my-fulfillment.sh\n\n解决方案：\n\n# 确保脚本中有这一行\nexport -f fulfill_order\n\n# 检查函数是否定义\ndeclare -f fulfill_order\n\n问题 3：Chrome 登录失效\n\n症状： 闲鱼要求重新登录\n\n解决方案：\n\n# 手动登录一次\nagent-browser --headed --profile \"$PROFILE\" open \"https://www.goofish.com/im\"\n# 在浏览器中完成登录\n\n问题 4：按钮点击失败\n\n症状： agent-browser click \"发 送\" 无效\n\n解决方案：\n\n# 方法1：使用 ref 点击\nagent-browser snapshot -i  # 获取可交互元素的 ref\nagent-browser click @e8\n\n# 方法2：使用角色查找\nagent-browser find role button click --name \"发送\"\n\n# 方法3：使用 ARIA 标签\nagent-browser find aria-label \"发送\" click\n\n🎓 最佳实践\n1. 错误处理\nfulfill_order() {\n    # 启用严格模式\n    set -e\n\n    # 检查必要条件\n    if [ -z \"$SECRET_KEY\" ]; then\n        echo \"❌ SECRET_KEY 未配置\"\n        return 1\n    fi\n\n    # 执行发货\n    agent-browser type \"您的秘钥：$SECRET_KEY\"\n    sleep 1\n\n    # 验证发送成功\n    if agent-browser find text \"您的秘钥\" > /dev/null; then\n        echo \"✅ 发送成功\"\n        return 0\n    else\n        echo \"❌ 发送失败\"\n        return 1\n    fi\n}\n\n2. 重试机制\nfulfill_order() {\n    local max_retries=3\n    local retry_count=0\n\n    while [ $retry_count -lt $max_retries ]; do\n        if send_key \"$SECRET_KEY\"; then\n            echo \"✅ 发货成功\"\n            return 0\n        else\n            retry_count=$((retry_count + 1))\n            echo \"⚠️  发送失败，重试 $retry_count/$max_retries...\"\n            sleep 2\n        fi\n    done\n\n    echo \"❌ 发货失败，已达最大重试次数\"\n    return 1\n}\n\n3. 订单限流\n# 防止同一买家短时间内重复下单\ncheck_rate_limit() {\n    local buyer=\"$BUYER_NICKNAME\"\n    local last_fulfillment_file=\".last_fulfillment_$buyer\"\n    local min_interval=300  # 5分钟\n\n    if [ -f \"$last_fulfillment_file\" ]; then\n        local last_time=$(cat \"$last_fulfillment_file\")\n        local current_time=$(date +%s)\n        local elapsed=$((current_time - last_time))\n\n        if [ $elapsed -lt $min_interval ]; then\n            echo \"⚠️  买家 $buyer 距上次发货仅 ${elapsed}秒，跳过\"\n            return 1\n        fi\n    fi\n\n    date +%s > \"$last_fulfillment_file\"\n    return 0\n}\n\nfulfill_order() {\n    if ! check_rate_limit; then\n        return 1\n    fi\n\n    # 正常发货逻辑\n    ...\n}\n\n4. 日志增强\nlog_order() {\n    local status=\"$1\"\n    local key=\"$2\"\n\n    echo \"[$(date '+%Y-%m-%d %H:%M:%S')] $status | 买家：$BUYER_NICKNAME | 商品：$PRODUCT_TITLE | 秘钥：$key\" >> \"$LOG_FILE\"\n}\n\nfulfill_order() {\n    log_order \"开始发货\" \"$key\"\n\n    if send_key \"$key\"; then\n        log_order \"发货成功\" \"$key\"\n        return 0\n    else\n        log_order \"发货失败\" \"$key\"\n        return 1\n    fi\n}\n\n🤝 贡献指南\n\n欢迎贡献新的发货模板！\n\n提交模板\n在 fulfillment-templates/ 目录下创建新文件\n遵循命名规范：XX-description.sh\n添加详细注释\n提供配置示例\n更新本文档\n模板结构\n#!/bin/bash\n# fulfillment-templates/XX-description.sh\n\n# === 配置区 ===\n# 在这里添加你的配置\n\n# === 函数区 ===\n# 在这里实现你的发货逻辑\n\n# 发货钩子（必须实现）\nfulfill_order() {\n    # 你的发货逻辑\n    return 0\n}\n\nexport -f fulfill_order\n\n📄 许可证\n\nMIT License\n\n🆘 获取帮助\n查看模板目录：fulfillment-templates/\n查看日志：fulfillment-YYYYMMDD.log\nGitHub Issues：提交问题\nDiscord 社区：加入讨论\n\n免责声明： 本框架仅供学习和个人使用，请遵守闲鱼的使用条款。作者不对使用本框架造成的任何后果负责。"
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/sliverp/xianyu-auto-saler",
    "publisherUrl": "https://clawhub.ai/sliverp/xianyu-auto-saler",
    "owner": "sliverp",
    "version": "1.0.0",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/xianyu-auto-saler",
    "downloadUrl": "https://openagent3.xyz/downloads/xianyu-auto-saler",
    "agentUrl": "https://openagent3.xyz/skills/xianyu-auto-saler/agent",
    "manifestUrl": "https://openagent3.xyz/skills/xianyu-auto-saler/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/xianyu-auto-saler/agent.md"
  }
}