抖店飞鸽客服自动回复软件开发教程与下载体验(.NET版)
转载请注明出处!
原文链接:https://blog.csdn.net/zgyulongfei/article/details/140960430
本文适合的读者为:
- 抖店(抖音小店)个体商家;
- 抖店店群商家(店群商家:指的是开了几十个抖店的商家);
- 想要开发一款抖店自动回复工具的技术人员/团队;
- 想学习浏览器自动回复技术的程序员;
省流介绍:
- 如果您是抖店商家,可以下载优化过的完善版工具体验,不用查看技术教程。(非商家不要下载!非商家不要下载!非商家不要下载!因为需要有店铺才能用)下载地址:https://www.yunpan.com/surl_y9HVpCnUCAD (提取码:9d35)
- 如果您是技术人员,可以细细查看文章,可在文末下载源代码。
目录
一、抖店飞鸽客服系统简介
二、自动回复的原理
三、开发环境与第三方类库
四、创建窗体应用
五、安装第三方JSON库
六、安装浏览器组件
七、软件主窗体设计
八、在主窗体加载抖店飞鸽客服网页
九、识别顾客发送的消息并自动回复
十、创建自动回复规则库
十一、功能扩展
十二、源码下载
一、抖店飞鸽客服系统简介
抖店是抖音官方退出的购买产品的服务程序,商家在抖店平台上开店后需要与顾客沟通,抖店提供了飞鸽客服系统让商家与顾客进行有效沟通。
抖店飞鸽客服系统界面展示:

目前抖店飞鸽客服系统已经非常完善了,抖店官方也推出了【机器人】功能,帮助商家更高效地回复顾客。

对于咨询量不大的商家而言,平台自带的【机器人】功能已经足够使用了。
然而对于店铺数量多,日常咨询量大的商家来说,平台自带的【机器人】功能有时候会显得心有余而力不足。因为顾客给商家发送的客服消息,商家必须在3分钟内进行答复。当【机器人】遇到不会回答的消息时,而此时抖店商家非常繁忙无法及时给顾客答复消息时,会导致3分钟回复率降低。
什么是3分钟回复率?
顾客发送消息给商家后,商家需要在3分钟内答复顾客的咨询。3分钟回复率的计算方式是:在3分钟内回复的顾客咨询消息数,除以顾客咨询消息总数。快手平台要求这一比率不得低于80%,否则会影响店铺评分。
为了提高客服的3分钟回复率, 网店应该请足够多的人工客服人员来接待顾客的咨询。
然而,对于大部分利润微薄的抖店商家来说,请人工客服专员的成本非常高,网店的经营利润根本无法承担。
此时,要是网店主有一款客服自动回复工具,就可以减轻日常的工作量,减少店铺运营成本,进而提高网店的利润。
二、自动回复的原理
目前抖店飞鸽系统有电脑客户端软件、网页版客服、手机版几种形式。
本文的自动回复教程是对接飞鸽网页版客服系统,通过识别网页上的文字,匹配回复规则后再进行回复。
相当于是做一款飞鸽客服网页的浏览器插件,插件的主要功能是识别抖店飞鸽客服上顾客发送的咨询消息,然后匹配自定义的回复话术规则,再将匹配到的回复语发送给顾客。
三、开发环境与第三方类库
编程语言及框架:c# + WinForm
开发工具:Visual Studio 2017
应用程序运行环境:.Net Framework 4.5.2
Json库:Newtonsoft.Json v10.0.3
浏览器组件:CefSharp.WinForms v85.3.130
四、创建窗体应用

打开VS2017后,创建一个Windows窗体应用(.Net Framework)。
目标框架选择:.NET Framework 4.5.2
应用名称填写:抖店自动回复软件
五、安装第三方JSON库
既然是开发一款自动回复工具,那么就必须要有一个自动回复规则库 ,来保存顾客咨询问题的关键词与答复语之间的对应关系。
当顾客咨询时,软件去规则库中查找新消息是否包含规则中的关键词,关键词匹配后,将关键词对应的答复语发送给顾客。
自动回复规则库应该由商家根据店铺的主营商品、商品规格、发货时间、发货地点等情况合理设置,因此需要一个本地数据库。本地数据库一般使用SQLite,它是一款免费的轻量级数据库。
由于本文作为开发范例,主要目的是让读者方便理解与实践,本教程的规则库采用Json格式保存在文件中,因此需要用到第三方JSON库Newtonsoft.Json。
JSON库安装方法:点击VS2017菜单【项目】-【管理NuGet程序包】

切换菜单为【浏览】,然后搜索:Newtonsoft.Json,下拉框中选择v10.0.3版本并安装

六、安装浏览器组件
由于需要对接抖店飞鸽网页版客服,因此需要一个浏览器组件来加载和显示飞鸽客服网页,之后再通过操作浏览器组件来实现识别客服文字以及自动回复。
在Winform中添加一个浏览器控件,现在一般使用第三方开源组件CefSharp.WinForms。
在NuGet中搜索CefSharp.Winfoms,选择v85.3.130版本后安装。

由于CefSharp不支持以Any CPU模式运行程序,所以需要在配置管理器中指定运行平台为x86或x64。调整后的截图如下:

七、软件主窗体设计
软件主窗体需要显示一个【抖店飞鸽客服网页】,以及一些功能性按钮【设置回复规则、开启自动回复、关闭自动回复】。

浏览器组件嵌套在一个Dock.Fill的Panel中,功能区使用MenuStrip组件并创建菜单项。
八、在主窗体加载抖店飞鸽客服网页
在项目上新建CefHelper类,用来初始化CefSharp.Winforms组件的初始化配置。

CefHelper类中的代码如下:
class CefHelper{public static readonly string WebCachePath = Application.StartupPath + "\\cache";public static void InitCef(){Cef.EnableHighDPISupport();CefSettings settings = new CefSettings{Locale = "zh-CN",AcceptLanguageList = "zh-CN,zh;q=0.9",UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36",PersistUserPreferences = true,PersistSessionCookies = true,RootCachePath = WebCachePath};settings.CefCommandLineArgs.Add("disable-features", "WebRtcHideLocalIpsWithMdns");Cef.Initialize(settings);}}
接着在应用程序入口点调用CefSharp的初始化代码:

CefSharp初始化完毕之后,才能创建浏览器组件。
创建浏览器组件不能用常规拖放控件的方式,必须使用代码创建,浏览器组件类名为ChromiumWebBrowser。
创建方法:在主窗体Form1中编写创建方法CreateWebBrowser()来创建一个ChromiumWebBrowser控件,并将其放在主窗体的Panel中。
/// <summary>/// 创建飞鸽客服浏览器/// </summary>/// <returns></returns>private ChromiumWebBrowser CreateFeiGeWebBrowser(){//浏览器启动时,初始化显示的飞鸽客服网址string initUrl = "https://im.jinritemai.com/pc_seller_v2/main/workspace";ChromiumWebBrowser fgBrowser = new ChromiumWebBrowser(initUrl){RequestContext = new RequestContext(new RequestContextSettings(){PersistSessionCookies = true,PersistUserPreferences = true,CachePath = CefHelper.WebCachePath})};//将浏览器添加到Panelpanel_Browser.Controls.Add(fgBrowser);//return fgBrowser;}
在主窗体构造函数中调用此方法:

运行程序后,效果如下:

飞鸽客服网页已经打开,先登录抖店店铺方便后续操作!
九、识别顾客发送的消息并自动回复
为了获取用户发送的消息,需要使用到JavaScript技术,利用js代码获取网页元素中的内容。

抖店飞鸽客服会把新的咨询顾客放在【当前会话】中。
要识别是否有新消息,需要识别顾客行上是否有显示时间,这个时间表示顾客发信息了多长时间。

由于抖店飞鸽网页中的元素class都是乱码,无法直接通过getElementsByClassName来定位到元素:

因此需要根据文字内容来识别,获取所有同一种元素标签的集合,然后循环遍历这个标签集合,去找到其中的元素包含:时、分、秒的关键词,进而定位到元素。
检测到当前会话列表含有未回复的顾客时,点击顾客加载对话内容,参考代码如下:
var doms = document.getElementsByClassName('i-icon i-icon-icon-collection-solid');
for (var i = 0; i < doms.length; ++i) {var d = doms[i];var f1 = d.parentElement;if (f1) {var f2 = f1.parentElement;if (f2) {var f3 = f2.parentElement;if (f3) {var timeSpan = f3.textContent.trim();if (timeSpan.indexOf('秒') >= 0 || timeSpan.indexOf('分') >= 0 || timeSpan.indexOf('时') >= 0) {f3.click();break;}}}}
}
点击完顾客后,获取顾客发送的最后一条信息,自动回复仅匹配最后一条信息即可!

用js编写如下代码即可获取到最后一条信息:

获取到顾客最后一条信息之后,去自动回复规则库中匹配回复语,然后将回复语填充到文本输入框中发送给顾客(规则库如何设计在后面章节中说明)。
假设回复语为:ok
那么在文本框中填充文字的js代码为:
document.getElementsByTagName('textarea')[0].value='ok'
填充后效果为:

但是点击【发送】按钮后,系统却提示:

明明已经在文本框中填充了【ok】文字了,为什么发送的时候却提示文本为空呢?
原因是网页系统监听了文本框事件,只有打字进去才会识别已输入,设置元素的value无效。
那么如何解决呢?
可以将文字【ok】复制到剪切板,然后在将剪切板的文字粘贴到textarea中即可。此种方法需要占用剪切板,实现效果不是很好。也有不占用剪切板,更高效且简单的方法,感兴趣的可以与作者联系。
整个自动回复过程为:
- 检测新消息
- 获取顾客发送的最后一条消息
- 填充回复语
- 点击发送
将js代码封装到c#中,由c#调用js代码。编写JsHelper类:

JsHelper内编写几个静态方法供调用:
- GetUnreplyMsgCount
- GetCustomerLastAskMsg
- InputReplyMsg
- ClickSendButton
- ClickFirstCustomer
具体源代码可以在文末下载!
接着在主窗体Form1中创建一个线程,每隔5秒定时检测一次是否有未回复的消息,如果有消息就去回复一次。
private void StartAutoReplyTask(ChromiumWebBrowser b){Task.Factory.StartNew(() =>{//等待一会儿再开始执行轮询线程Thread.Sleep(2000);//循环检测消息while (true){if (OpenAutoReplyTask){//检测是否有新消息while (JsHelper.GetUnreplyMsgCount(b) > 0){//点击第一个顾客JsHelper.ClickFirstCustomer(b);//等待聊天对话加载Thread.Sleep(1000);//获取此顾客最后一条消息string lastMsg = JsHelper.GetCustomerLastAskMsg(b);//根据顾客消息匹配回复语string replyMsg = GetReplyMsg(lastMsg);//在聊天文本框中填充回复语JsHelper.InputReplyMsg(b, replyMsg);//点击发送按钮JsHelper.ClickSendButton(b);//回复完每一个顾客都等几秒,防止页面反应慢,这个顾客还在【请在3分钟内回复】菜单内Thread.Sleep(3000);}}//执行完一遍流程后,等待5秒再继续执行下一轮Thread.Sleep(5000);}}, TaskCreationOptions.LongRunning);}
上面代码中的方法GetReplyMsg()是去规则库中获取匹配到的回复语,将在下一节说明。
十、创建自动回复规则库
为了能让自动回复软件根据顾客的问题回答不同的回复语,必须创建一个回复规则库。
为了便于理解与实践,本文采用Json文件存储规则库。
新建类Rules,用来存储关键词与回复语的映射关系。
/// <summary>/// 单条规则/// </summary>class RuleItem{/// <summary>/// 规则关键词/// </summary>public string Keyword { get; set; }/// <summary>/// 关键词匹配的回复语/// </summary>public string ReplyMsg { get; set; }}
创建RuleHelper类,用来操作规则库(增、删、改、查)

Helper类中的方法:
- SaveJsonToFile
- AddRule
- FindRuleReply
在哪个地方做增删改查?
需要创建一个规则库窗口FormRules,然后在窗口上进行操作


在按钮添加事件,增加规则即可。
运行软件后,打开规则窗体添加规则效果:


规则文件rules.json内容:

发消息测试:


运行效果说明软件能正常地根据顾客的消息回复对应的答复语。
十一、功能扩展
这个抖店飞鸽自动回复软件只是一个简单的样例,距离完善还有很大的距离。
功能可扩展的地方还有很多,如:
- 支持多关键词匹配
- 支持完全匹配与包含匹配
- 规则库可修改、删除
- 能保存历史回复记录
- 能店铺多开同时回复
- 能根据不同店铺回复不同话术
- ……
- ……
十二、源码下载
CSDN下载地址:https://download.csdn.net/download/zgyulongfei/89623129
相关文章:
抖店飞鸽客服自动回复软件开发教程与下载体验(.NET版)
转载请注明出处! 原文链接:https://blog.csdn.net/zgyulongfei/article/details/140960430 本文适合的读者为: 抖店(抖音小店)个体商家;抖店店群商家(店群商家:指的是开了几十个抖…...
如何关闭redis的自动清理缓存,声明式事务(含有redis)如何解决,redis setnx锁的使用。
20240809 一、解决redis数据被删除的方案1、发现问题2、解决注意!! 二、声明式事务(当有redis的时候)1. 先看代码2. Transactional(rollbackFor Exception.class)3. 如何解决redis在事务里面,如何保证原子性和一致性3…...
C#中抽象类的使用
前言 我们在C#中使用抽象类可以发挥C#多态的功能,把具有共性的方法定义在抽象类中,然后在不同的类中去实现,可增强代码的可读性、扩展性。 1、不使用抽象类 我们定义了下面两个类XiaoWang、XiaoMing,他们有一个Country方法&…...
揭秘网络攻击:深入理解JavaScript中的跨站点请求伪造(CSRF)
标题:揭秘网络攻击:深入理解JavaScript中的跨站点请求伪造(CSRF) 在当今数字化时代,网络安全已成为每个开发者和用户必须关注的重点。其中,跨站点请求伪造(CSRF)是一种常见的网络攻…...
【项目实战】C++视频共享点播系统
目录 一、项目介绍 1.1 对视频共享点播系统的认识 1.2服务端程序负责功能 1.3 服务端功能模块划分 1.4 项目界面演示 1.5预备知识 二.环境搭建 2.1 安装 Jsoncpp 库 2.1.1 使用jsoncpp 2.2 引入httplib库 2.2.1 安装Git(如果你的系统尚未安装Git…...
Android逆向题解 攻防世界难度4- Android2.0
Jeb打开apk 关键代码在Native函数getResult IDA 打开 so 发现代码比较简单,可以直接静态分析。 输出字符串也就是flag 长度是15,然后分成三段,第一段是可以整除3,第二段是除3取余1,第三段是除3取余等于2࿱…...
P4155 [SCOI2015] 计划
[SCOI2015] 计划 - 洛谷 核心思路 注意到, 可推出, 表示 战士 走 步到达战士位置。 若可以走到且 r < 终点 则答案 然后再加上自己这个哨兵,和走回自己的一个哨兵即可。 AC 代码 #include<bits/stdc.h> using namespace std…...
今日(2024年8月12日)科技新闻
国内: 航空航天领域 我国成功发射卫星互联网高轨卫星。我国试验性冰川保护项目取得积极成效,被形容为“为冰川盖棉被”。2024西太平洋国际航次科考队起航,开启探秘深海海山之旅。我国首架固定翼海上专业搜救航空器正式列编。“祥云”as700载…...
CP AUTOSAR标准之ECUStateManager(AUTOSAR_SWS_ECUStateManager)(更新中……)
1 简介和功能概述 ECU管理器模块(如本文档中所述)是一个基本软件模块(参见[1]),用于管理ECU状态的常见方面。具体来说,ECU管理器模块: 初始化和取消初始化OS、SchM和BswM以及一些基本软件驱动模块。根据请求配置ECU进入休眠和关机状态。管理ECU上的所有唤醒事件ECU管理器模块…...
Java中的中介者模式:解耦复杂系统的有效策略
Java中的中介者模式:解耦复杂系统的有效策略 在软件开发中,随着系统规模的扩大和复杂度的增加,各组件之间的直接交互会导致代码的耦合性增高,从而影响系统的可维护性和可扩展性。为了应对这种复杂性,中介者模式&#…...
transformer(李宏毅老师系列)
自学参考: Transformer:Attention Is All You Need Transformer论文逐段精读 视频课 课件资料 笔记 一、引入 seq2seq:输入一个序列的向量作为input,output的长度由机器自己决定seq2seq model应用: 语音辨识 输入是声音讯号的一串vector 输出…...
XCode15.4真机运行调试
更新Xcode后,没有模拟器内容,而且真机也不显示,编译按钮无法点击,设备在管理运行目标中可见,但无法选中解决方案:下载iOS17.5模拟器,但最坑的是直接点击“Get”下载总是中断,且无法断…...
Google Mock 和 Google Test编写单元测试入门(环境配置、简单执行)
文章目录 环境的配置方法1:从源代码构建第一步:克隆库的源代码第二步:构建库 方法 2:使用 CMake 的 FetchContent示例 CMakeLists.txt 项目的创建项目结构CMakeLists.txt (根目录)main.cpp (示例程序)tests/CMakeLists.txt (测试部…...
shell外壳与Linux权限
🌈个人主页:Yui_ 🌈Linux专栏:Linux 🌈C语言笔记专栏:C语言笔记 🌈数据结构专栏:数据结构 文章目录 1.shell命令以及运行原理2. Linux权限的概念3.Linux权限管理3.1 文件访问者的分类…...
越混越好的项目经理做对了哪些事?现在知道还不晚
作为一名项目经理,你最害怕的是什么? 是做不完的项目?延迟的进度条?还是团队人心涣散? 很多人都知道,得人心者得天下,一个成功的领导者,一定是能做到让人心服口服的。如果失去了团…...
haproxy是什么?以及haproxy基础实验
目录 一、什么是负载均衡? 二、为什么要用haproxy? 三、haproxy的基本部署实验: 3.1 基本配置实验 环境准备: 详细步骤: 3.2 haproxy-多进程与多线程实验: 多进程: 多线程:…...
【向量数据库】向量数据库的构建和检索
1、使用 sentence-transformers 将文本编码为向量 安装 sentence-transformers: pip install -U sentence-transformers在 huggingface 下载 all-MiniLM-L6-v2 模型权重(1_Pooling 是文件夹,里面包含一个 config.json 文件)&…...
Mysql基础篇之DQL语言
Mysql基础篇之DQL语言 1. 基础查询特点语法格式闲言碎语 2. 条件查询语法格式条件表达式逻辑表达式模糊查询 3. 排序查询4. 常见函数单行函数1. 字符函数2. 数学函数3. 日期函数4. 流程控制函数5. 其他函数 分组函数 5. 分组查询分组函数语法格式特点 6. 多表连接查询分类SQL 七…...
python async
要使用 Python 的 async 特性编写一个代码,以交替使用两个 AI API 处理数据,您可以按照以下步骤进行。假设这两个 AI API 的调用是异步的,并且我们需要在两个 API 之间轮流处理一组数据。 import asyncio import aiohttp async def call_ap…...
利用QT和FFmpeg实现一个简单的视频播放器
在当今的多媒体世界中,视频播放已成为不可或缺的一部分。从简单的媒体播放器到复杂的视频编辑软件,视频解码和显示技术无处不在。本示例使用Qt和FFmpeg构建一个简单的视频播放器。利用ffmpeg解码视频,通过QWidget渲染解码后的图像,…...
使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式
一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明:假设每台服务器已…...
centos 7 部署awstats 网站访问检测
一、基础环境准备(两种安装方式都要做) bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats࿰…...
iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版分享
平时用 iPhone 的时候,难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵,或者买了二手 iPhone 却被原来的 iCloud 账号锁住,这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...
视频字幕质量评估的大规模细粒度基准
大家读完觉得有帮助记得关注和点赞!!! 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用,因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型(VLMs)在字幕生成方面…...
高危文件识别的常用算法:原理、应用与企业场景
高危文件识别的常用算法:原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件,如包含恶意代码、敏感数据或欺诈内容的文档,在企业协同办公环境中(如Teams、Google Workspace)尤为重要。结合大模型技术&…...
【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)
升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点,但无自动故障转移能力,Master宕机后需人工切换,期间消息可能无法读取。Slave仅存储数据,无法主动升级为Master响应请求ÿ…...
关于 WASM:1. WASM 基础原理
一、WASM 简介 1.1 WebAssembly 是什么? WebAssembly(WASM) 是一种能在现代浏览器中高效运行的二进制指令格式,它不是传统的编程语言,而是一种 低级字节码格式,可由高级语言(如 C、C、Rust&am…...
IP如何挑?2025年海外专线IP如何购买?
你花了时间和预算买了IP,结果IP质量不佳,项目效率低下不说,还可能带来莫名的网络问题,是不是太闹心了?尤其是在面对海外专线IP时,到底怎么才能买到适合自己的呢?所以,挑IP绝对是个技…...
打手机检测算法AI智能分析网关V4守护公共/工业/医疗等多场景安全应用
一、方案背景 在现代生产与生活场景中,如工厂高危作业区、医院手术室、公共场景等,人员违规打手机的行为潜藏着巨大风险。传统依靠人工巡查的监管方式,存在效率低、覆盖面不足、判断主观性强等问题,难以满足对人员打手机行为精…...
Linux部署私有文件管理系统MinIO
最近需要用到一个文件管理服务,但是又不想花钱,所以就想着自己搭建一个,刚好我们用的一个开源框架已经集成了MinIO,所以就选了这个 我这边对文件服务性能要求不是太高,单机版就可以 安装非常简单,几个命令就…...
