xianyu-auto-fulfillment
闲鱼」での仮想商品販売において、購入者の支払いを自動検知し、秘匿情報やファイルなど多様な形式で商品を柔軟に自動配送するSkill。
📜 元の英語説明(参考)
闲鱼自动发货框架 - 一个可扩展的闲鱼虚拟商品自动化发货系统。提供核心的付款检测逻辑,发货流程完全可自定义。 - 核心功能:自动检测买家付款(系统卡片识别) - 可扩展:支持任意发货方式(秘钥、链接、图片、文件、自定义API等) - 灵活配置:通过脚本或配置文件自定义发货逻辑 - 内置模板:提供多种常见发货场景的模板 - 使用 agent-browser 进行网页自动化
🇯🇵 日本人クリエイター向け解説
闲鱼」での仮想商品販売において、購入者の支払いを自動検知し、秘匿情報やファイルなど多様な形式で商品を柔軟に自動配送するSkill。
※ jpskill.com 編集部が日本のビジネス現場向けに補足した解説です。Skill本体の挙動とは独立した参考情報です。
⚠️ ダウンロード・利用は自己責任でお願いします。当サイトは内容・動作・安全性について責任を負いません。
🎯 このSkillでできること
下記の説明文を読むと、このSkillがあなたに何をしてくれるかが分かります。Claudeにこの分野の依頼をすると、自動で発動します。
📦 インストール方法 (3ステップ)
- 1. 上の「ダウンロード」ボタンを押して .skill ファイルを取得
- 2. ファイル名の拡張子を .skill から .zip に変えて展開(macは自動展開可)
- 3. 展開してできたフォルダを、ホームフォルダの
.claude/skills/に置く- · macOS / Linux:
~/.claude/skills/ - · Windows:
%USERPROFILE%\.claude\skills\
- · macOS / Linux:
Claude Code を再起動すれば完了。「このSkillを使って…」と話しかけなくても、関連する依頼で自動的に呼び出されます。
詳しい使い方ガイドを見る →- 最終更新
- 2026-05-17
- 取得日時
- 2026-05-17
- 同梱ファイル
- 2
📖 Skill本文(日本語訳)
※ 原文(英語/中国語)を Gemini で日本語化したものです。Claude 自身は原文を読みます。誤訳がある場合は原文をご確認ください。
[スキル名] xianyu-auto-fulfillment
🐟 閑魚自動発送フレームワーク
拡張可能な閑魚仮想商品自動発送システムです。支払い検出をコアとして提供し、発送プロセスは完全にカスタマイズ可能です。
🎯 設計理念
┌─────────────────────────────────────────────────────────────┐
│ コア検出層(フレームワーク提供) │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ チャット監視 │ -> │ 支払い検出 │ -> │ 発送トリガー │ │
│ │ - 新着メッセージ │ │ - システムカード │ │ - フック呼び出し │ │
│ │ - 未読マーク │ │ - ステータス判断 │ │ │ │
│ └──────────────┘ └──────────────┘ └──────────────┘ │
└─────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ カスタム発送層(ユーザー実装) │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ キー発送 │ │ リンク発送 │ │ 画像発送 │ ... │
│ │ - 固定キー │ │ - ネットディスクリンク │ │ - QRコード │ │
│ │ - キープール │ │ - ダウンロードアドレス │ │ - スクリーンショット │ │
│ └──────────────┘ └──────────────┘ └──────────────┘ │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ ファイル発送 │ │ API発送 │ │ カスタムロジック │ ... │
│ │ - ファイル送信 │ │ - インターフェース呼び出し │ │ - 必要に応じてカスタマイズ │ │
│ │ - ネットディスクアップロード │ │ - データ返却 │ │ │ │
│ └──────────────┘ └──────────────┘ └──────────────┘ │
└─────────────────────────────────────────────────────────────┘
コア原則:
- 関心事の分離:検出ロジックはフレームワークが提供し、発送ロジックはユーザーがカスタマイズします。
- 拡張性:あらゆる種類の発送方法をサポートします。
- ゼロ侵入:フレームワークは特定の発送方法を強制しません。
- すぐに使える:一般的なシナリオの完全なテンプレートを提供します。
🏗️ コアコンセプト
1. 支払い検出(フレームワークコア)
閑魚チャット内のシステム支払いカードを自動検出します。
✅ 検出条件(AND 関係):
- メッセージタイプ:システムカード(ユーザーテキストではない)
- カード内容:"我已付款,等待你发货"(支払い済み、発送をお待ちください)
- ボタン識別子:"去发货"(発送へ)ボタンがある
❌ 除外ケース:
- ユーザーが手入力した:"我已付款了"(支払い済みです)、"老板发货"(店長、発送してください)など
- "去发货"(発送へ)ボタンがないメッセージ
- "待付款"(支払い待ち)状態のカード
2. 発送フック(ユーザー実装)
支払いを検出すると、フレームワークはユーザー定義の発送フックを呼び出します。
# フック関数シグネチャ
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:キー発送(固定キー)
適用シナリオ:
- テスト商品(全員が同じキーを使用)
- 無料リソース共有
- 公開チュートリアル
使用方法:
#!/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:キー発送(キープール)
適用シナリオ:
- 各注文で異なるキーを使用
- 仮想商品を大量販売
- 各キーの使用状況を追跡する必要がある
使用方法:
#!/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 "# キープールファイル - 1行に1つのキー" > "$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:リンク発送(ネットディスク/ダウンロードリンク)
適用シナリオ:
- デジタルリソースのダウンロード(ソフトウェア、電子書籍、コース)
- 大容量ファイルの共有(ビデオ、オーディオ)
- クラウドストレージ共有
使用方法:
#!/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:画像発送(QRコード/スクリーンショット)
適用シナリオ:
- QRコードの送信(公式アカウント、友達追加、受け取りページ)
- チュートリアルスクリーンショットの送信
- 証明書/カードパスワード画像の送信
使用方法:
#!/bin/bash
# fulfillment-templates/04-image-delivery.sh
# 設定
QR_CODE_IMAGE="$HOME/Desktop/qr-code.png"
# 発送フック
fulfill_order() {
echo "📦 QRコード画像を送信しています..."
# まずテキスト説明を送信
agent-browser type "以下のQRコードをスキャンして、友達を追加/商品を受け取ってください:"
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の呼び出し
- サードパーティ発送サービスとの統合
- 自身のサーバーの呼び出し
使用方法:
#!/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\",
📜 原文 SKILL.md(Claudeが読む英語/中国語)を展開
🐟 闲鱼自动发货框架
一个可扩展的闲鱼虚拟商品自动化发货系统。核心提供付款检测,发货流程完全可自定义。
🎯 设计理念
┌─────────────────────────────────────────────────────────────┐
│ 核心检测层(框架提供) │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ 监控聊天 │ -> │ 检测付款 │ -> │ 触发发货 │ │
│ │ - 新消息 │ │ - 系统卡片 │ │ - 调用钩子 │ │
│ │ - 未读标记 │ │ - 状态判断 │ │ │ │
│ └──────────────┘ └──────────────┘ └──────────────┘ │
└─────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ 自定义发货层(用户实现) │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ 秘钥发货 │ │ 链接发货 │ │ 图片发货 │ ... │
│ │ - 固定秘钥 │ │ - 网盘链接 │ │ - 二维码 │ │
│ │ - 秘钥池 │ │ - 下载地址 │ │ - 截图 │ │
│ └──────────────┘ └──────────────┘ └──────────────┘ │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ 文件发货 │ │ API发货 │ │ 自定义逻辑 │ ... │
│ │ - 发送文件 │ │ - 调用接口 │ │ - 按需定制 │ │
│ │ - 上传网盘 │ │ - 返回数据 │ │ │ │
│ └──────────────┘ └──────────────┘ └──────────────┘ │
└─────────────────────────────────────────────────────────────┘
核心原则:
- 关注点分离:检测逻辑由框架提供,发货逻辑由用户自定义
- 可扩展性:支持任意类型的发货方式
- 零侵入:框架不强制特定的发货方式
- 开箱即用:提供常用场景的完整模板
🏗️ 核心概念
1. 付款检测(框架核心)
自动检测闲鱼聊天中的系统付款卡片:
✅ 检测条件(AND 关系):
- 消息类型:系统卡片(不是用户文本)
- 卡片内容:"我已付款,等待你发货"
- 按钮标识:有"去发货"按钮
❌ 排除情况:
- 用户手打的:"我已付款了"、"老板发货"等
- 没有"去发货"按钮的消息
- "待付款"状态的卡片
2. 发货钩子(用户实现)
当检测到付款后,框架调用用户定义的发货钩子:
# 钩子函数签名
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:秘钥发货(固定秘钥)
适用场景:
- 测试商品(所有人用同一个秘钥)
- 免费资源分享
- 公开教程
使用方法:
#!/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:秘钥发货(秘钥池)
适用场景:
- 每个订单使用不同秘钥
- 批量售卖虚拟商品
- 需要追踪每个秘钥使用情况
使用方法:
#!/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:链接发货(网盘/下载链接)
适用场景:
- 数字资源下载(软件、电子书、课程)
- 大文件分享(视频、音频)
- 云盘分享
使用方法:
#!/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:图片发货(二维码/截图)
适用场景:
- 发送二维码(公众号、加好友、领取页面)
- 发送教程截图
- 发送凭证/卡密图片
使用方法:
#!/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
- 集成第三方发货服务
- 调用自己的服务器
使用方法:
#!/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/电子书
- 发送压缩包(资源包)
- 发送软件安装包
使用方法:
#!/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:混合发货(组合多种方式)
适用场景:
- 同时发送秘钥和链接
- 发送多个步骤的指引
- 复杂的发货流程
使用方法:
#!/bin/bash
# fulfillment-templates/07-hybrid-delivery.sh
# 配置
SECRET_KEY="YOUR_KEY"
DOWNLOAD_LINK="https://example.com/download"
TUTORIAL_LINK="https://example.com/tutorial"
# 发货钩子
fulfill_order() {
echo "📦 混合发货..."
# 发送第1条消息:秘钥
agent-browser type "🔑 秘钥:$SECRET_KEY"
sleep 1
agent-browser click "发 送"
sleep 1
# 发送第2条消息:下载链接
agent-browser type "📥 下载链接:$DOWNLOAD_LINK"
sleep 1
agent-browser click "发 送"
sleep 1
# 发送第3条消息:教程链接
agent-browser type "📖 使用教程:$TUTORIAL_LINK\n\n如有问题随时联系我!"
sleep 1
agent-browser click "发 送"
return 0
}
export -f fulfill_order
🛠️ 自定义发货流程
方法 1:使用内置模板(推荐)
选择最接近你需求的模板,复制并修改配置:
# 复制模板
cp fulfillment-templates/02-key-pool.sh my-fulfillment.sh
# 编辑配置
nano my-fulfillment.sh
方法 2:从头创建
创建自己的发货脚本:
#!/bin/bash
# my-fulfillment.sh
# 添加你的配置
MY_CONFIG="value"
# 实现发货钩子
fulfill_order() {
# 你的发货逻辑
return 0
}
# 导出钩子
export -f fulfill_order
方法 3:高级自定义(Python/Node.js等)
如果你更熟悉其他语言,也可以用其他语言实现发货逻辑:
#!/usr/bin/env python3
# my-fulfillment.py
import os
import json
def fulfill_order():
"""发货钩子"""
buyer = os.getenv('BUYER_NICKNAME', 'Unknown')
product = os.getenv('PRODUCT_TITLE', 'Unknown')
print(f"📦 发货给 {buyer}")
# 你的Python发货逻辑
key = generate_key() # 你的秘钥生成逻辑
print(f"✅ 生成秘钥:{key}")
# 返回0表示成功,非0表示失败
return 0
if __name__ == '__main__':
exit(fulfill_order())
然后在Bash脚本中调用:
fulfill_order() {
python3 my-fulfillment.py
return $?
}
🚀 框架核心实现
主监控脚本
#!/bin/bash
# monitor.sh - 主监控脚本
set -e
# 配置
FULFILLMENT_SCRIPT="./my-fulfillment.sh"
CHAT_URL="https://www.goofish.com/im"
PROFILE="$HOME/Library/Application Support/Google/Chrome/Default"
LOG_FILE="fulfillment-$(date +%Y%m%d).log"
CHECK_INTERVAL=30 # 检查间隔(秒)
# 日志函数
log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE"
}
# 加载发货钩子
load_fulfillment_hook() {
if [ -f "$FULFILLMENT_SCRIPT" ]; then
log "📦 加载发货脚本:$FULFILLMENT_SCRIPT"
source "$FULFILLMENT_SCRIPT"
else
log "❌ 发货脚本不存在:$FULFILLMENT_SCRIPT"
exit 1
fi
}
# 检测付款
check_payment() {
log "🔍 检测付款状态..."
# 获取聊天快照
local snapshot=$(agent-browser snapshot)
# 检测付款卡片
if echo "$snapshot" | grep -q "我已付款,等待你发货" && \
echo "$snapshot" | grep -q "button.*去发货"; then
log "✅ 检测到付款"
return 0
else
log "⏸️ 暂无新付款"
return 1
fi
}
# 提取订单上下文
extract_order_context() {
# 从聊天快照中提取订单信息
local snapshot=$(agent-browser snapshot)
# 提取买家昵称(根据实际页面结构调整)
BUYER_NICKNAME=$(echo "$snapshot" | grep -oP '(?<=nickname":")[^"]*')
# 提取商品标题
PRODUCT_TITLE=$(echo "$snapshot" | grep -oP '(?<=title":")[^"]*')
# 导出为环境变量
export BUYER_NICKNAME
export PRODUCT_TITLE
export ORDER_TIME=$(date '+%Y-%m-%d %H:%M:%S')
log "📋 订单信息:买家=$BUYER_NICKNAME, 商品=$PRODUCT_TITLE"
}
# 执行发货
execute_fulfillment() {
log "🚀 执行发货..."
# 提取订单上下文
extract_order_context
# 调用发货钩子
if declare -f fulfill_order > /dev/null; then
fulfill_order
local result=$?
if [ $result -eq 0 ]; then
log "✅ 发货成功"
else
log "❌ 发货失败(返回码:$result)"
fi
return $result
else
log "❌ 发货钩子函数未定义"
return 1
fi
}
# 主循环
main() {
log "🚀 启动闲鱼自动发货系统"
# 加载发货钩子
load_fulfillment_hook
# 打开闲鱼
agent-browser --headed --profile "$PROFILE" open "$CHAT_URL"
sleep 5
# 监控循环
while true; do
if check_payment; then
execute_fulfillment
# 发货后等待一段时间再检查下一个
sleep 60
else
sleep $CHECK_INTERVAL
fi
done
}
# 运行
main
📋 完整工作流程
首次设置
# 1. 创建工作目录
mkdir -p ~/xianyu-auto-fulfillment
cd ~/xianyu-auto-fulfillment
# 2. 安装依赖
npm install -g agent-browser
agent-browser install
# 3. 复制模板
cp /path/to/xianyu-auto-fulfillment/fulfillment-templates/02-key-pool.sh my-fulfillment.sh
# 4. 编辑配置
nano my-fulfillment.sh
# 5. 创建秘钥池
echo "KEY-ABC123" > keys.txt
echo "KEY-DEF456" >> keys.txt
# 6. 首次运行(手动登录)
agent-browser --headed --profile "$PROFILE" open "https://www.goofish.com/im"
# 在浏览器中登录闲鱼
# 7. 启动监控
chmod +x monitor.sh
./monitor.sh
🔧 配置选项
环境变量
| 变量 | 说明 | 默认值 |
|---|---|---|
FULFILLMENT_SCRIPT |
发货脚本路径 | ./my-fulfillment.sh |
CHAT_URL |
闲鱼聊天URL | https://www.goofish.com/im |
PROFILE |
Chrome配置文件路径 | ~/Library/Application Support/Google/Chrome/Default |
CHECK_INTERVAL |
检查间隔(秒) | 30 |
LOG_FILE |
日志文件路径 | fulfillment-YYYYMMDD.log |
agent-browser 配置
export AGENT_BROWSER_PROFILE="$HOME/Library/Application Support/Google/Chrome/Default"
export AGENT_BROWSER_HEADED=true
export AGENT_BROWSER_TIMEOUT=25000
📝 日志记录
日志格式
[2026-02-28 15:30:00] 🚀 启动闲鱼自动发货系统
[2026-02-28 15:30:05] 📦 加载发货脚本:my-fulfillment.sh
[2026-02-28 15:30:10] 🔍 检测付款状态...
[2026-02-28 15:30:15] ✅ 检测到付款
[2026-02-28 15:30:15] 📋 订单信息:买家=atting丶, 商品=VIP会员
[2026-02-28 15:30:16] 🚀 执行发货...
[2026-02-28 15:30:16] 📦 从秘钥池获取秘钥...
[2026-02-28 15:30:16] ✅ 获取到秘钥:KEY-ABC123
[2026-02-28 15:30:18] ✅ 发货成功
查看日志
# 查看今天的日志
cat fulfillment-$(date +%Y%m%d).log
# 实时监控日志
tail -f fulfillment-$(date +%Y%m%d).log
# 搜索发货记录
grep "发货成功" fulfillment-$(date +%Y%m%d).log
🔔 通知提醒
macOS 通知
# 在发货钩子中添加
osascript -e 'display notification "闲鱼订单已完成" with title "发货成功"'
Telegram 通知
# 在发货钩子中添加
send_telegram_notification() {
local message="闲鱼订单已完成\n\n买家:$BUYER_NICKNAME\n秘钥:$key"
curl -s -X POST "https://api.telegram.org/botYOUR_BOT_TOKEN/sendMessage" \
-d "chat_id=YOUR_CHAT_ID" \
-d "text=$message"
}
企业微信通知
# 企业微信机器人
send_wework_notification() {
local webhook_url="YOUR_WEBHOOK_URL"
local data=$(cat <<EOF
{
"msgtype": "text",
"text": {
"content": "闲鱼订单已完成\n买家:$BUYER_NICKNAME\n秘钥:$key"
}
}
EOF
)
curl -s -X POST "$webhook_url" -H "Content-Type: application/json" -d "$data"
}
⚠️ 故障排查
问题 1:无法检测付款
症状: check_payment 始终返回"暂无新付款"
排查步骤:
- 确认买家已付款(在闲鱼APP中查看)
- 确认是系统卡片,不是用户文本
- 检查快照内容:
agent-browser snapshot | grep "我已付款" - 确认是否有"去发货"按钮
解决方案:
# 手动检查页面
agent-browser snapshot
# 检查是否有付款卡片
agent-browser snapshot | grep "我已付款"
agent-browser snapshot | grep "去发货"
问题 2:发货脚本未加载
症状: ❌ 发货钩子函数未定义
排查步骤:
- 检查脚本是否存在:
ls -l my-fulfillment.sh - 检查是否有执行权限:
chmod +x my-fulfillment.sh - 检查是否正确导出函数:
export -f fulfill_order - 检查脚本语法:
bash -n my-fulfillment.sh
解决方案:
# 确保脚本中有这一行
export -f fulfill_order
# 检查函数是否定义
declare -f fulfill_order
问题 3:Chrome 登录失效
症状: 闲鱼要求重新登录
解决方案:
# 手动登录一次
agent-browser --headed --profile "$PROFILE" open "https://www.goofish.com/im"
# 在浏览器中完成登录
问题 4:按钮点击失败
症状: agent-browser click "发 送" 无效
解决方案:
# 方法1:使用 ref 点击
agent-browser snapshot -i # 获取可交互元素的 ref
agent-browser click @e8
# 方法2:使用角色查找
agent-browser find role button click --name "发送"
# 方法3:使用 ARIA 标签
agent-browser find aria-label "发送" click
🎓 最佳实践
1. 错误处理
fulfill_order() {
# 启用严格模式
set -e
# 检查必要条件
if [ -z "$SECRET_KEY" ]; then
echo "❌ SECRET_KEY 未配置"
return 1
fi
# 执行发货
agent-browser type "您的秘钥:$SECRET_KEY"
sleep 1
# 验证发送成功
if agent-browser find text "您的秘钥" > /dev/null; then
echo "✅ 发送成功"
return 0
else
echo "❌ 发送失败"
return 1
fi
}
2. 重试机制
fulfill_order() {
local max_retries=3
local retry_count=0
while [ $retry_count -lt $max_retries ]; do
if send_key "$SECRET_KEY"; then
echo "✅ 发货成功"
return 0
else
retry_count=$((retry_count + 1))
echo "⚠️ 发送失败,重试 $retry_count/$max_retries..."
sleep 2
fi
done
echo "❌ 发货失败,已达最大重试次数"
return 1
}
3. 订单限流
# 防止同一买家短时间内重复下单
check_rate_limit() {
local buyer="$BUYER_NICKNAME"
local last_fulfillment_file=".last_fulfillment_$buyer"
local min_interval=300 # 5分钟
if [ -f "$last_fulfillment_file" ]; then
local last_time=$(cat "$last_fulfillment_file")
local current_time=$(date +%s)
local elapsed=$((current_time - last_time))
if [ $elapsed -lt $min_interval ]; then
echo "⚠️ 买家 $buyer 距上次发货仅 ${elapsed}秒,跳过"
return 1
fi
fi
date +%s > "$last_fulfillment_file"
return 0
}
fulfill_order() {
if ! check_rate_limit; then
return 1
fi
# 正常发货逻辑
...
}
4. 日志增强
log_order() {
local status="$1"
local key="$2"
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $status | 买家:$BUYER_NICKNAME | 商品:$PRODUCT_TITLE | 秘钥:$key" >> "$LOG_FILE"
}
fulfill_order() {
log_order "开始发货" "$key"
if send_key "$key"; then
log_order "发货成功" "$key"
return 0
else
log_order "发货失败" "$key"
return 1
fi
}
🤝 贡献指南
欢迎贡献新的发货模板!
提交模板
- 在
fulfillment-templates/目录下创建新文件 - 遵循命名规范:
XX-description.sh - 添加详细注释
- 提供配置示例
- 更新本文档
模板结构
#!/bin/bash
# fulfillment-templates/XX-description.sh
# === 配置区 ===
# 在这里添加你的配置
# === 函数区 ===
# 在这里实现你的发货逻辑
# 发货钩子(必须实现)
fulfill_order() {
# 你的发货逻辑
return 0
}
export -f fulfill_order
📄 许可证
MIT License
🆘 获取帮助
免责声明: 本框架仅供学习和个人使用,请遵守闲鱼的使用条款。作者不对使用本框架造成的任何后果负责。
同梱ファイル
※ ZIPに含まれるファイル一覧。`SKILL.md` 本体に加え、参考資料・サンプル・スクリプトが入っている場合があります。
- 📄 SKILL.md (25,660 bytes)
- 📎 README.md (9,980 bytes)