做闲鱼虚拟商品这几年,我最烦的其实不是没订单,而是订单来了人不在电脑前。有好几次晚上十一点多买家拍下激活码,我第二天早上才看到,结果人家早就退款了。后来我把一个叫 XianYuAutoDeliveryX 的开源自动发货项目从头折腾了一遍,从环境配置到把大模型接进去做智能客服,中间踩了不少坑。这篇就是完整记录,给同样在做虚拟商品、想解放双手的朋友一个可以直接照着抄的参考。
1. 整体设计与核心思路拆解
1.1 传统手工发货为什么撑不住
虚拟商品这个品类和实物不一样,特点是SKU多、单笔金额低、咨询量集中、发货时效要求高。卖激活码、网盘资料、会员代充、软件授权这类东西,买家拍下之后第一件事就是催发货,晚几分钟可能就退款跑单。我以前手动发货时,白天还能应付,晚上和午休时间完全离不开手机,出门吃个饭都要盯着订单提醒,真应了那句“人肉客服+人肉仓库”。
手工发货还有一个隐性成本:重复劳动。同一个商品卖了一百单,就要复制粘贴一百次卡密,中间只要有一次眼花发错,就要处理售后纠纷。数据一多,库存还容易乱——账面上有货,实际卡密池早就空了,超卖以后又要一个个道歉退款,非常消耗账号权重。
这个项目解决的其实就是三件事:订单来了自动发、库存没了自动停、买家问了自动回。把这些机械操作抽出来交给程序以后,人只需要在出现异常的时候介入,整个经营节奏一下就变了。
1.2 XianYuAutoDeliveryX 的定位与核心能力
XianYuAutoDeliveryX 本质上是一个跑在本地或者云服务器上的自动化服务,它做的是把闲鱼平台的订单信号接进来,再根据商品配置去完成发货动作。它的核心能力大致分四块:
- 商品与卡密管理:把虚拟商品建模成“商品+SKU+卡密池”,每个链接对应一组可发货的卡密、网盘地址或自定义文本。
- 订单监听与自动发货:监测到新订单以后自动校验支付状态,扣减库存,把发货内容通过会话消息推给买家。
- 关键词监控与行情参考:对关键词、竞品链接进行监控,整理同类商品的行情价和上新情况,辅助自己定价补货。
- 通知集成:发货结果、库存预警、异常订单都可以推到钉钉、企业微信、Server酱这类渠道,出门不带电脑也能第一时间掌握店铺状态。
这套能力组合起来之后,“闲鱼关键词监控”“闲鱼采集”“闲鱼行情价”这些大家在搜索的热词,其实都能通过项目里的数据采集与监控模块得到一部分答案。它不只是一个发货机器人,更像一个轻量级的店铺运营中台。
1.3 为什么选择自建而不是买现成工具
市面上确实有很多闲鱼管家、超级管家之类的第三方工具,但实际用下来有几个问题:一是价格不低,按年付费,功能还经常拆开卖;二是核心数据全在别人服务器上,店铺授权信息和订单数据都有安全隐患;三是可定制性很差,想要的功能没有,不想要的功能天天弹窗。
自建这套项目的好处首先是数据可控,所有订单、卡密、配置信息都在自己手里。其次是可以自由扩展,比如我把大模型接进去以后,海外SEO工具的能力就自动长出来了:买家咨询自动回复、差评预警、商品描述生成,全都可以基于同一个底座继续叠功能。再有就是成本,跑在一台低配云服务器上,一个月几十块钱,比按年订阅第三方工具要省得多。
当然,自建也有门槛,至少要有最基本的命令行操作能力。不过别被吓到,这篇文章就是从零开始带你搭起来。
2. 环境准备与配置实操
2.1 先把基础环境养熟:Node.js、Git、MySQL 的安装要点
这个项目属于 Node.js 生态,所以本机环境至少要装三样东西:Node.js、Git、MySQL。很多朋友卡在第一步就是环境变量没配好,我在配置环境时也踩过几次坑,这里把关键点都列出来。
Node.js 建议装 16 到 18 的 LTS 版本,太新或者太旧都可能出兼容性问题。装完以后在终端里执行 node -v 和 npm -v,只要能看到版本号就说明环境变量没问题。Windows 上如果提示“node 不是内部或外部命令”,多半是安装时没有勾选“Add to PATH”选项,重装一遍勾上就行。macOS 用户可以顺手装个 nvm 管理版本,切换起来会灵活很多。
Git 的安装相对简单,Windows 上就是一路下一步,选默认组件就行。注意安装完以后最好配置一下用户信息,不然后面提交代码或者拉取部分依赖时会报错:
git config --global user.name "yourname" git config --global user.email "youremail@example.com"MySQL 建议装 8.0 版本。很多新手在安装时容易忽略字符集和认证插件的问题,导致项目连接数据库报错。建议在初始化时选 utf8mb4 字符集,用户认证插件改成 mysql_native_password,或者在项目连接串里指定 supportBigNumbers 和 decimalNumbers 等参数。这一步提前做好了,后面初始化数据库表就不用反复折腾。
装完 MySQL 之后,顺手把服务启动起来,记住 root 账号密码。如果你以前装过 MySQL 但密码忘了,也不用重装,用 mysqld --skip-grant-tables 方式进入安全模式重置就行,不过重置完一定要记得退出安全模式再重启服务。
2.2 项目拉取、依赖安装与数据库初始化
环境就绪以后,先把项目代码拉下来。XianYuAutoDeliveryX 的代码在 GitHub 和 Gitee 上都有镜像,建议国内网络环境下优先用 Gitee 地址,速度稳定很多,GitHub 拉不下来的时候再切换源。
git clone https://gitee.com/your-mirror/XianYuAutoDeliveryX.git cd XianYuAutoDeliveryX npm installnpm install 这一步对网络要求比较高,如果速度慢可以临时切换镜像源:
npm config set registry https://registry.npmmirror.com依赖装完以后,在项目根目录下找一份 .env.example 文件,复制成 .env,这就是全局配置文件。接着初始化数据库,项目里通常带一份 schema.sql 或 init.sql,用命令行导入即可:
mysql -u root -p < schema.sql导入完成后,进 MySQL 里看一下表结构是否完整,重点确认几个核心表:商品表、SKU表、卡密池表、订单表、监控任务表。如果这些表都在,说明数据层已经就绪。
2.3 配置项逐项拆解与环境变量说明
.env 文件是项目的核心配置文件,里面每一项都对应一个具体的功能模块。第一次配置的时候不要急着全填,先搞明白每一项是干嘛的,不然填错了排查起来很费时间。以下是我在实际使用中整理出的关键配置项:
- APP_PORT:服务监听端口,默认 3000,如果和本地其他服务冲突就换一个。
- DB_HOST、DB_PORT、DB_USER、DB_PASSWORD、DB_NAME:数据库连接信息,确认和本机 MySQL 的实际配置保持一致。
- ADMIN_TOKEN:后台管理接口的访问令牌,相当于管理端钥匙,建议设置成一段随机长字符串。
- ORDER_POLL_INTERVAL:订单轮询间隔,单位是毫秒,默认 5000 到 10000 都合理。间隔太短会频繁请求接口,间隔太长则发货不够及时。
- NOTIFY_WEBHOOK:通知回调地址,可以是钉钉机器人、企业微信机器人或 Server酱的 Webhook。
- AI_PROVIDER、AI_API_KEY、AI_MODEL:大模型相关配置,对接完之后才用得到,可以先留空。
配置完以后用 node src/index.js 启动服务,看到类似“server started on port 3000”的日志,说明项目已经跑起来了。第一次启动建议先开着终端日志,观察一下有没有数据库连不上、端口占用之类的问题。
2.4 配置过程中的三个高频坑
第一个坑是 MySQL 8 的密码认证问题。默认的 caching_sha2_password 认证方式在很多旧版 Node 数据库驱动下会报错“ER_NOT_SUPPORTED_AUTH_MODE”。解决办法是在 MySQL 里执行一条语句把用户改回兼容认证模式:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'yourpassword'; FLUSH PRIVILEGES;第二个坑是.node 版本不匹配。有一次我用了 Node 20 启动项目,结果 bcrypt 这个原生模块编译失败,折腾了半个小时,最后换回 Node 16 一切正常。所以如果你启动时看到 node-gyp 或者编译相关报错,先别急着查依赖,换个 LTS 版本试试往往就解决了。
第三个坑是端口被占用。右键管理员身份打开终端,执行 netstat -ano | findstr 3000 查一下端口占用进程,把对应的 PID 进程结束掉,或者直接改 APP_PORT 换一个端口。
3. 自动发货核心机制与实战操作
3.1 商品与卡密要怎么建模
自动发货的前提是把商品的发货逻辑建模清楚。XianYuAutoDeliveryX 里,一个商品底下可以挂多个 SKU,比如“软件A标准版”和“软件A高级版”,每个 SKU 对应一个独立的卡密池。卡密池里的每一条记录可以是一串激活码、一个网盘链接、一段手动备注,也可以是任意自定义文本。
商品建模时我建议按“类目、规格、发货内容、库存阈值”四个维度来设计。类目决定它归到哪个监控分组,规格对应 SKU,发货内容决定自动发货时发什么,库存阈值则决定剩余多少条卡密时触发预警。比如某个商品SKU设置了20条卡密,库存阈值设为5,那么一旦库存低于5条,系统就会通过通知渠道提醒你补货。
这里要特别提醒:商品上架时的标题和描述最好和内部商品名做区分。内部可以叫“软件A-高级版-第3批”,但前台展示给买家的标题建议用相对宽泛的表述,这样既能避免被同行抓取比价,也能减少不必要的纠纷。
3.2 自动发货的完整链路拆解
自动发货不是简单地“收到订单→发一段文字”,正常流程里至少要经过订单校验、库存预占、扣减库存、内容获取、消息推送、结果回写这六个步骤。
订单校验这一步最容易忽略。系统监听到新订单后,一定要先验证支付状态和买家留言,防止买家拍下不付款就触发发货。库存预占的意思是先把库存锁定,避免并发订单同时扣减到最后一条卡密时发生超卖。这两步做完以后才真正扣库存、取出发货内容。
发货内容获取时,系统会从卡密池里弹出一条未使用的记录,并把它标记为“已使用”,然后通过会话消息接口发送给买家。发送成功后,订单表的状态会被更新为“已发货”,同时记录一条完整的发货日志,方便日后溯源。
这套流程里的核心代码逻辑并不复杂,把它简化成伪代码大概是这样的:
async function autoDeliver(order) { if (order.payStatus !== 'PAID') return; await lockStock(order.skuId); const card = await getAvailableCard(order.skuId); if (!card) { await notifyAdmin(`SKU ${order.skuId} 库存不足`); return; } await markCardUsed(card.id, order.orderId); await sendMessage(order.buyerId, buildDeliverText(card.content)); await updateOrderStatus(order.orderId, 'SHIPPED'); }这只是链路骨架,实际项目里还会包含重试机制、幂等处理、异常告警。比如消息发送失败时要重试,订单重复通知时要靠订单号幂等去重,这些都是自动发货稳定性的保障,缺一不可。
3.3 关键词监控与行情参考的进阶玩法
自动发货解决了“售后”问题,但只守不攻也不行。XianYuAutoDeliveryX 的关键词监控模块,可以让你实时盯住品类关键词的变化。比如你在卖某类软件激活码,就可以把“某软件 激活码”“某软件 会员”这类词设置成监控任务,每隔一段时间抓取一次搜索结果,记录商品标题、价格、销量和卖家信息。
这些数据积累下来以后,有两个直接用途。第一个是定价参考,通过整理同行的价格区间,你可以把自己的商品价格调整到既有利润又有竞争力的位置。第二个是发现空白市场,比如监控中发现某个关键词下面大部分卖家都只卖A版本,没人卖B版本,那你就可以迅速补上这个空缺。
行情价分析这块,我自己的做法是每周导出一份监控数据,在表格里按价格和销量排序,观察头部卖家的价格变动趋势。如果连续几天某个竞品都在降价,可能说明它快要清仓了,这时候我就不再压价跟进,而是把重心放在服务差异化上,比如更快的发货速度和更完善的售后说明。
3.4 消息模板与通知渠道怎么选
发货消息是买家的第一印象,模板至少要包含三部分内容:感谢语、发货内容、使用说明。如果是卡密类商品,使用说明尽量写清楚,比如“复制后进入软件输入激活码即可,请勿重复激活”之类的提示。模板不要太长,但关键信息一个都不能少。
通知渠道的选择就看你的使用场景。自己一个人用,Server酱推送到微信是最省事的;团队协作的话,钉钉或企业微信群机器人更合适,因为可以在群里留底,多人同时收到通知方便协作。我建议至少配两个渠道,一个主用、一个备用,因为单一渠道万一 Token 过期或者 Webhook 被禁,你连库存告警都收不到。
4. 对接大模型:从客服到文案生成
4.1 对接大模型能给这个项目带来什么
自动发货之后,人最常被绑住的就是咨询。买家问“这个是永久有效吗”“支持几个设备”“怎么安装”,这些问题反复出现,每个都答一遍非常熬人。把大模型接进来以后,最直观的变化是这些重复咨询可以被 AI 直接回复,而且话术可以根据你的风格动态生成。
除了客服,大模型还能做三件很有价值的事。第一件是商品描述生成,给它几个关键词和卖点,它就能输出多版标题和详情文案,省去憋文案的时间。第二件是语义化的关键词分类,可以把监控到的新商品按语义归入已有分类,比纯规则匹配精准很多。第三件是情感分析和预警,比如监控评论里出现“骗子”“不发货”这类情绪词时,自动拉高预警等级,让你第一时间处理口碑风险。
换句话说,大模型不是替代自动发货,而是让整个自动化系统从“能干活”升级成“会思考”。这也是现在很多闲鱼自动化工具开始卷的方向。
4.2 对接前的准备工作
对接大模型之前,先想清楚你要用哪个模型、哪个供应商。国内现在主流的方案包括阿里云百炼上的通义千问系列、DeepSeek、以及各类开源模型的中转服务。选型时主要看三点:响应速度、单次调用成本、对中文的理解能力。做客服场景,响应速度比生成质量更优先,毕竟买家没有耐心等十几秒才看到回复。
申请 API 的时候,注意把 Key 保存好,一旦泄露别人就能用你的额度。建议在项目配置里把 Key 放到 .env 环境变量里,不要硬编码到代码中,更不要把 .env 提交到 Git 仓库。
还需要理解 Token 这个概念。Token 是模型计费的基本单位,一个汉字大约占 1 到 2 个 Token。系统提示词、历史对话、模型输出都会消耗 Token,所以长对话场景要设置最大 Token 数,并定期清理历史消息,防止成本失控。
4.3 对接实操:从申请到链路联调
以大模型 API 对接为例,完成申请后,你会拿到 API Key 和接口地址。在项目里新增一个 aiClient 模块,比如这样:
const axios = require('axios'); const AI_API_URL = process.env.AI_API_URL; const AI_API_KEY = process.env.AI_API_KEY; async function chatWithAI(messages) { const response = await axios.post(AI_API_URL, { model: process.env.AI_MODEL, messages: messages, temperature: 0.7 }, { headers: { 'Authorization': `Bearer ${AI_API_KEY}`, 'Content-Type': 'application/json' } }); return response.data.choices[0].message.content; } module.exports = { chatWithAI };然后把这个模块接到客服线程上。当买家发来一条消息,系统先判断是不是常见问题,如果是高频问题就直接从关键词库找答案,避免每个问题都走大模型,节省成本;只有规则匹配不到的时候才调大模型生成回复,并设置超时兜底:
const answer = await chatWithAI([ { role: 'system', content: systemPrompt }, { role: 'user', content: userText } ]).catch(() => '抱歉,我现在有点忙,稍后人工回复您。');这样设计的好处是性能和成本都能兼顾。纯规则匹配处理 80% 的简单问题,大模型只处理剩下 20% 的模糊问题,既快又稳。
联调时先用几个典型问题测一下,比如“这个能用在几台电脑上”“Mac 能用吗”,看模型回答是否符合你的商品规则。如果发现回答不准确,不要急着换模型,先优化 system prompt,把商品规格、发货政策、禁忌事项写清楚,效果提升会很明显。
4.4 提示词设计关键与敏感内容兜底
提示词设计直接决定了大模型回得靠不靠谱。客服场景的 system prompt 至少要包含以下几层信息:角色定位、商品信息、服务规则、回复风格、边界兜底。
下面是我比较常用的一套模板,可以按你的商品类型微调:
你是【某店铺】的在线客服。你了解店铺内所有商品的信息,包括激活码类商品的使用方式、售后退换规则。 回复要求: 1. 语气友好但简洁,尽量在50字以内; 2. 如果涉及激活码或网盘资料,直接告知使用步骤; 3. 不承诺超出商品实际功能的内容; 4. 当用户问价格、优惠、发货时间时,按真实配置回答; 5. 遇到无法确认的问题,统一回复:请稍等,我为您转人工客服。兜底逻辑特别重要。大模型在某些情况下会一本正经地胡说八道,比如买家问“这个软件能破解吗”,这种内容一定要在提示词里明确禁止回答,并且指定固定话术。更稳妥的做法是在调用前做关键词过滤,命中敏感词后直接走人工,不交给大模型处理。
成本控制方面,建议给单日调用量设一个上限,超过之后自动降级为纯规则回复,防止某个无聊买家反复刷问题把余额刷光。我就是被坑过一次后加的这道保险,从那以后每个月模型费用都稳定在很低的范围。
5. 常见问题与排查技巧实录
5.1 环境部署类问题速查
我整理了一份高频问题清单,都是自己踩过或者帮朋友排查过的,遇到类似情况直接对照处理:
| 现象 | 可能原因 | 解决办法 |
|---|---|---|
| node -v 找不到命令 | Node 未加入 PATH | 重新安装并勾选 Add to PATH |
| npm install 卡住 | 网络问题 | 切换 npmmirror 镜像源 |
| 启动提示数据库连接失败 | MySQL 未启动或密码错误 | 检查 MySQL 服务,核对 .env |
| ER_NOT_SUPPORTED_AUTH_MODE | MySQL 8 默认认证方式不兼容 | 修改用户为 mysql_native_password |
| 端口被占用 | 其他服务占用 APP_PORT | 换端口或结束占用进程 |
| 原生模块编译失败 | Node 版本不匹配 | 切换 Node 16/18 LTS |
很多环境问题都是基础配置引起的,定位时先看日志,再看配置,最后才怀疑代码。项目日志里一般会明确提示哪一步失败了,比如数据库连接、接口请求、文件读取,按提示去排查往往五分钟内能找到原因。
5.2 自动发货相关问题排查
自动发货最常见的故障是“订单来了但不发货”。这种问题先不要急着重启服务,按顺序查三处:一是订单校验条件,确认支付状态判断正确;二是卡密池是否有可用库存,很多情况是库存已经空了但预警没触发;三是消息发送是否失败,如果接口返回风控提示,就要检查发送频率和内容。
另一个典型问题是“重复发货”。通常是服务重启后,未完成的订单又被重新扫描了一遍。解决办法是确认订单表的幂等判断,发货前先查一下订单状态是否为“待发货”,并且发货成功后立即更新状态。如果之前已经发过的订单不小心重复发货,也别慌,立刻给买家发消息解释并回收多余的内容,能挽回大部分体验分。我处理过一次,道歉及时,买家也没给差评。
还有“发货内容发错”的问题,多半是 SKU 和卡密池的关联关系配错了。配置后一定要做一次测试下单,不要直接拿真实买家当测试对象。
5.3 大模型对接的坑与调优
大模型接入初期最容易遇到请求超时。免费或者低价的模型服务端排队时间长,前面一两秒没有响应,前端就断了。解决方法是把超时时间放宽到 10 到 15 秒,同时加一个“快速兜底回复”机制,超时后立刻回复预设话术,等人工来处理。
Token 消耗过快也是常见问题。很多次我排查后发现是历史消息没有清理,每一轮对话都带着几十轮以前的记录,成本翻了好几倍。建议只保留最近五轮对话内容,并且把 system prompt 精简到必要信息,不要堆砌大量背景资料。
内容被模型拒绝是另一类高频问题。虚拟商品容易涉及授权、激活等表述,模型内置的安全策略有时候会误判,导致正常的企业咨询也没法回答。这种时候不要强行改提示词去绕过,而是把回复内容改得更中性一些,比如“请查看商品页面说明”这类通用话术,既能合规又不会卡住。
5.4 账号安全与平台规则的底线提醒
自动化工具是把双刃剑,用得好是提效神器,用不好就是封号加速器。我强烈建议把订单轮询间隔设置得保守一些,不要在高峰期频繁批量触发操作。任何自动化行为都要控制在正常人类操作频率以内,不要短时间大量关注、大量私信、大量重复请求。
另外,务必保证自动发送的内容真实可靠。虚拟商品的核心是信任,如果买家付款后收到的卡密是无效的,自动化发货反而会加速差评和举报。对于无法保证 100% 有效的商品,建议在发货消息里附带售后说明和人工处理入口,让买家感受到有兜底。
最后说一句,代码本身没有立场,关键看使用者。用自动化去提升服务效率和经营体验,是值得研究的方向;但如果用来刷量、欺骗、绕过规则搞灰产,那早晚要出问题。这套系统的正确用法,是帮你把精力从重复劳动里解放出来,放到选品、服务、供应链这些真正决定长期收入的事情上。
我在实盘运行这套系统时最大的体会是,技术不是最难的部分,最难的是找到“自动化”和“用户体验”之间的平衡。买家不会因为你用了机器人觉得贴心,他们只会在拿到货、解决掉问题的时候觉得靠谱。把发货做稳、把客服做活、把异常盯住,这套系统就算真正跑出价值了。后续我打算继续给它加上多店铺管理和更细粒度的利润统计,让数据不仅能发货,还能指导选品,等跑通了再来更新。