xianyu-auto-fulfillment

GitHub 作者 LeoYeAI/openclaw-master-skills

闲鱼自动发货框架 - 一个可扩展的闲鱼虚拟商品自动化发货系统。提供核心的付款检测逻辑,发货流程完全可自定义。 - 核心功能:自动检测买家付款(系统卡片识别) - 可扩展:支持任意发货方式(秘钥、链接、图片、文件、自定义API等) - 灵活配置:通过脚本或配置文件自定义发货逻辑 - 内置模板:提供多种常见发货场景的模板 - 使用 agent-browser 进行网页自动化

安装 / 下载方式

TotalClaw CLI推荐
totalclaw install github:LeoYeAI~openclaw-master-skills~xianyu-auto-saler
cURL直接下载,无需登录
curl -fsSL https://skills.taituai.com/api/skills/github%3ALeoYeAI~openclaw-master-skills~xianyu-auto-saler/file -o xianyu-auto-saler.md
# 🐟 闲鱼自动发货框架

一个可扩展的闲鱼虚拟商品自动化发货系统。核心提供付款检测,发货流程完全可自定义。

## 🎯 设计理念

```
┌─────────────────────────────────────────────────────────────┐
│                    核心检测层(框架提供)                     │
│  ┌──────────────┐    ┌──────────────┐    ┌──────────────┐  │
│  │  监控聊天    │ -> │  检测付款    │ -> │  触发发货    │  │
│  │  - 新消息    │    │  - 系统卡片  │    │  - 调用钩子  │  │
│  │  - 未读标记  │    │  - 状态判断  │    │              │  │
│  └──────────────┘    └──────────────┘    └──────────────┘  │
└─────────────────────────────────────────────────────────────┘
                              │
                              ▼
┌─────────────────────────────────────────────────────────────┐
│                  自定义发货层(用户实现)                      │
│  ┌──────────────┐  ┌──────────────┐  ┌──────────────┐      │
│  │  秘钥发货    │  │  链接发货    │  │  图片发货    │  ...  │
│  │  - 固定秘钥  │  │  - 网盘链接  │  │  - 二维码    │       │
│  │  - 秘钥池    │  │  - 下载地址  │  │  - 截图      │       │
│  └──────────────┘  └──────────────┘  └──────────────┘      │
│  ┌──────────────┐  ┌──────────────┐  ┌──────────────┐      │
│  │  文件发货    │  │  API发货     │  │  自定义逻辑  │  ...  │
│  │  - 发送文件  │  │  - 调用接口  │  │  - 按需定制  │       │
│  │  - 上传网盘  │  │  - 返回数据  │  │              │       │
│  └──────────────┘  └──────────────┘  └──────────────┘      │
└─────────────────────────────────────────────────────────────┘
```

**核心原则:**
- **关注点分离**:检测逻辑由框架提供,发货逻辑由用户自定义
- **可扩展性**:支持任意类型的发货方式
- **零侵入**:框架不强制特定的发货方式
- **开箱即用**:提供常用场景的完整模板

---

## 🏗️ 核心概念

### 1. 付款检测(框架核心)

自动检测闲鱼聊天中的系统付款卡片:

```
✅ 检测条件(AND 关系):
  - 消息类型:系统卡片(不是用户文本)
  - 卡片内容:"我已付款,等待你发货"
  - 按钮标识:有"去发货"按钮

❌ 排除情况:
  - 用户手打的:"我已付款了"、"老板发货"等
  - 没有"去发货"按钮的消息
  - "待付款"状态的卡片
```

### 2. 发货钩子(用户实现)

当检测到付款后,框架调用用户定义的发货钩子:

```bash
# 钩子函数签名
fulfill_order() {
    # 输入:无(通过环境变量或全局变量获取上下文)
    # 输出:0(成功)或非0(失败)
    # 作用:自定义发货逻辑
}
```

### 3. 订单上下文

发货时可用的上下文信息:

| 变量 | 说明 | 示例 |
|-----|------|------|
| `$BUYER_NICKNAME` | 买家昵称 | "atting丶" |
| `$ORDER_AMOUNT` | 订单金额 | "9.90" |
| `$ORDER_TIME` | 下单时间 | "2026-02-28 15:30:00" |
| `$PRODUCT_TITLE` | 商品标题 | "VIP会员兑换码" |
| `$BUYER_AVATAR` | 买家头像URL | "https://..." |

---

## 📦 内置发货模板

框架提供了多种常见发货场景的完整模板,可直接使用或作为参考。

### 模板 1:秘钥发货(固定秘钥)

**适用场景:**
- 测试商品(所有人用同一个秘钥)
- 免费资源分享
- 公开教程

**使用方法:**

```bash
#!/bin/bash
# fulfillment-templates/01-fixed-key.sh

# 配置
SECRET_KEY="YOUR_SECRET_KEY_HERE"

# 发货钩子
fulfill_order() {
    echo "📦 发送固定秘钥..."

    # 发送秘钥到聊天
    agent-browser type "您的秘钥:$SECRET_KEY,祝您使用愉快!"
    sleep 1
    agent-browser click "发 送"

    return 0
}

# 导出钩子(由框架调用)
export -f fulfill_order
```

---

### 模板 2:秘钥发货(秘钥池)

**适用场景:**
- 每个订单使用不同秘钥
- 批量售卖虚拟商品
- 需要追踪每个秘钥使用情况

**使用方法:**

```bash
#!/bin/bash
# fulfillment-templates/02-key-pool.sh

# 配置
KEY_POOL_FILE="keys.txt"
USED_KEYS_FILE="used-keys.txt"

# 初始化秘钥池
init_key_pool() {
    if [ ! -f "$KEY_POOL_FILE" ]; then
        echo "# 秘钥池文件 - 每行一个秘钥" > "$KEY_POOL_FILE"
        echo "# 示例:" >> "$KEY_POOL_FILE"
        echo "KEY-ABC123" >> "$KEY_POOL_FILE"
        echo "KEY-DEF456" >> "$KEY_POOL_FILE"
        echo "KEY-GHI789" >> "$KEY_POOL_FILE"
    fi
}

# 从秘钥池获取一个秘钥
get_key_from_pool() {
    if [ ! -f "$KEY_POOL_FILE" ]; then
        echo "❌ 秘钥池文件不存在:$KEY_POOL_FILE"
        return 1
    fi

    # 读取第一个非注释行
    key=$(grep -v "^#" "$KEY_POOL_FILE" | grep -v "^$" | head -1)

    if [ -z "$key" ]; then
        echo "❌ 秘钥池已空!"
        return 1
    fi

    # 从秘钥池中移除已使用的
    sed -i '' "/^$key$/d" "$KEY_POOL_FILE" 2>/dev/null || \
    sed -i "/^$key$/d" "$KEY_POOL_FILE" 2>/dev/null

    # 记录到已使用秘钥
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] $key" >> "$USED_KEYS_FILE"

    echo "$key"
}

# 发货钩子
fulfill_order() {
    echo "📦 从秘钥池获取秘钥..."

    # 初始化秘钥池
    init_key_pool

    # 获取秘钥
    key=$(get_key_from_pool)
    if [ $? -ne 0 ]; then
        echo "❌ 获取秘钥失败"
        return 1
    fi

    echo "✅ 获取到秘钥:$key"

    # 发送秘钥
    agent-browser type "您的秘钥:$key,祝您使用愉快!"
    sleep 1
    agent-browser click "发 送"

    return 0
}

export -f fulfill_order
```

---

### 模板 3:链接发货(网盘/下载链接)

**适用场景:**
- 数字资源下载(软件、电子书、课程)
- 大文件分享(视频、音频)
- 云盘分享

**使用方法:**

```bash
#!/bin/bash
# fulfillment-templates/03-link-delivery.sh

# 配置
DOWNLOAD_LINK="https://pan.baidu.com/s/XXXXXXXXXXXX"
EXTRACTION_CODE="abcd"

# 发货钩子
fulfill_order() {
    echo "📦 发送下载链接..."

    # 发送链接和提取码
    agent-browser type "您的下载链接已准备好!\n\n📁 网盘链接:$DOWNLOAD_LINK\n🔑 提取码:$EXTRACTION_CODE\n\n如有问题,随时联系我!"
    sleep 1
    agent-browser click "发 送"

    return 0
}

export -f fulfill_order
```

---

### 模板 4:图片发货(二维码/截图)

**适用场景:**
- 发送二维码(公众号、加好友、领取页面)
- 发送教程截图
- 发送凭证/卡密图片

**使用方法:**

```bash
#!/bin/bash
# fulfillment-templates/04-image-delivery.sh

# 配置
QR_CODE_IMAGE="$HOME/Desktop/qr-code.png"

# 发货钩子
fulfill_order() {
    echo "📦 发送二维码图片..."

    # 先发送文字说明
    agent-browser type "请扫描下方二维码添加好友/领取商品:"
    sleep 1
    agent-browser click "发 送"

    # 等待一下再发送图片
    sleep 2

    # 上传并发送图片(需要根据闲鱼界面调整)
    agent-browser snapshot
    # 找到图片上传按钮并点击
    agent-browser find role button click --name "图片" || \
    agent-browser click "+" || \
    agent-browser find aria-label "图片" click

    # 等待文件选择器
    sleep 1

    # 上传文件(方法1:使用 file 输入)
    # 注意:需要根据实际界面调整
    agent-browser find role textbox click --name "选择文件"
    # 使用系统对话框上传(需要用户手动选择或使用工具如 yd)

    # 或使用快捷键(如果支持)
    # osascript -e 'tell application "System Events" to keystroke "g" using {command down, shift down}'

    return 0
}

export -f fulfill_order
```

---

### 模板 5:API发货(调用外部服务)

**适用场景:**
- 调用自动生成秘钥的API
- 集成第三方发货服务
- 调用自己的服务器

**使用方法:**

```bash
#!/bin/bash
# fulfillment-templates/05-api-delivery.sh

# 配置
API_ENDPOINT="https://your-api.com/generate-key"
API_KEY="YOUR_API_KEY"

# 调用API生成秘钥
call_api_generate_key() {
    local buyer_nickname="$1"
    local product_title="$2"

    echo "📡 调用API生成秘钥..."

    response=$(curl -s -X POST "$API_ENDPOINT" \
        -H "Authorization: Bearer $API_KEY" \
        -H "Content-Type: application/json" \
        -d "{
            \"buyer\": \"$buyer_nickname\",
            \"product\": \"$product_title\",
            \"timestamp\": \"$(date -u +%Y-%m-%dT%H:%M:%SZ)\"
        }")

    # 解析响应(假设返回 {"key": "xxx", "success": true})
    if command -v jq &> /dev/null; then
        key=$(echo "$response" | jq -r '.key')
        success=$(echo "$response" | jq -r '.success')
    else
        # 如果没有jq,使用grep
        key=$(echo "$response" | grep -o '"key":"[^"]*"' | cut -d'"' -f4)
        success=$(echo "$response" | grep -o '"success":[^,]*' | cut -d':' -f2)
    fi

    if [ "$success" = "true" ] && [ -n "$key" ]; then
        echo "$key"
        return 0
    else
        echo "❌ API调用失败:$response"
        return 1
    fi
}

# 发货钩子
fulfill_order() {
    echo "📦 通过API发货..."

    # 获取订单上下文
    local buyer="$BUYER_NICKNAME"
    local product="$PRODUCT_TITLE"

    # 调用API
    key=$(call_api_generate_key "$buyer" "$product")
    if [ $? -ne 0 ]; then
        echo "❌ 生成秘钥失败"
        return 1
    fi

    echo "✅ 生成秘钥:$key"

    # 发送秘钥
    agent-browser type "您的秘钥:$key,祝您使用愉快!"
    sleep 1
    agent-browser click "发 送"

    return 0
}

export -f fulfill_order
```

---

### 模板 6:文件发货(发送本地文件)

**适用场景:**
- 发送PDF/电子书
- 发送压缩包(资源包)
- 发送软件安装包

**使用方法:**

```bash
#!/bin/bash
# fulfillment-templates/06-file-delivery.sh

# 配置
PRODUCT_FILE="$HOME/Downloads/product.pdf"

# 发货钩子
fulfill_order() {
    echo "📦 发送文件..."

    if [ ! -f "$PRODUCT_FILE" ]; then
        echo "❌ 文件不存在:$PRODUCT_FILE"
        return 1
    fi

    # 先发送文字说明
    agent-browser type "文件已准备好,请查收:"
    sleep 1
    agent-browser click "发 送"

    # 等待一下再发送文件
    sleep 2

    # 上传文件(需要根据闲鱼界面调整)
    agent-browser snapshot
    # 找到文件上传按钮
    agent-browser find role button click --name "文件" || \
    agent-browser click "+" || \
    agent-browser find aria-label "文件" click

    # 等待文件选择器
    sleep 1

    # 这里需要根据实际界面实现文件上传
    # 可能需要使用自动化工具如 yd 或 osascript

    return 0
}

export -f fulfill_order
```

---

### 模板 7:混合发货(组合多种方式)

**适用场景:**
- 同时发送秘钥和链接
- 发送多个步骤的指引
- 复杂的发货流程

**使用方法:**

```bash
#!/bin/bash
# fulfillment-template