此教程用于处理钉钉群消息连接服务
优化售后服务流程,提升客户满意度
在电商行业的激烈竞争中,大促活动无疑是吸引顾客、提高销量的重要手段之一。然而,在这些高流量时期,售后服务的压力也随之增大。尤其是当遇到需要退差价、产品损坏需补发等复杂情况时,售后客服的工作量会显著增加,这不仅影响了工作效率,还可能降低客户的满意度。
在我近期接手的一项业务中,我发现许多客服伙伴在处理这类问题时感到力不从心。他们需要频繁地操作ERP系统来完成各种售后流程,而这往往占据了大量宝贵的工作时间。鉴于网上的相关教程较少,我认为有必要分享一些实用的方法来优化这一过程,希望能对同行有所帮助。
1、什么是Stream模式
Stream 模式是钉钉开放平台提供的一种集成方式,它可以监听机器人回调、事件订阅回调和注册卡片回调。使用 Stream 模式接入,钉钉开放平台将通过 Websocket 连接与应用程序通讯,Stream 模式将极大降低接入门槛和资源依赖,不需要公网服务器、IP、域名等资源,只需集成钉钉开放平台 SDK 即可。
2、Stream模式原理
在 Stream 模式下,开发者的应用程序通过集成 SDK 的方式与钉钉开放平台建立一条 WebSocket 连接,建立连接过程中开放平台将对连接进行鉴权。当有卡片回调发生时,开放平台将通过 WebSocket 连接将数据通知到开发者的应用程序。开发者的应用程序可以接收到这些数据并进行相应处理,从而实现与钉钉开放平台的实时通信,参考下图所示
3、Stream模式优势
在钉钉开放平台向应用程序发送请求的场景中,大部分都是采用 Webhook (注册公网 HTTPS 服务)的方式,包括卡片回调,使用 Webhook 方式开发过程中会遇到较多的问题,包括
申请公网域名和TLS证书
申请公网IP并部署接入网关
部署应用防火墙并配置白名单
独立处理请求的鉴权,以及加解密处理
搭建内网穿透环境进行本地开发调试(需要使用http请求模式的话可以看看我以前的文章<第三方接口回调,搭建本地服务器工具,内网穿透>)
效果展示:
逻辑思路:钉钉访问服务——服务拿到信息存入reeis——存入MySQL留存备份
1、创建钉钉机器人
钉钉开发者后台打开钉钉开发者后台,自行登录即可,获得开发权限(没有的话找公司内部负责钉钉这块的前辈授权)
点击创建应用填写相关信息保存即可
创建好保存两个重要参数<Client ID (原 AppKey 和 SuiteKey)><Client Secret (原 AppSecret 和 SuiteSecret)>(后续写服务要使用)
在旁边添加应用这里点击机器人,默认发布即可
配置权限:
1、钉钉表格读权限
2、钉钉表格写权限
3、企业内机器人发送消息权限
4、通讯录部门信息读权限
5、成员信息读权限
6、根据手机号姓名获取成员信息的接口访问权限
7、通讯录部门成员读权限
点击版本管理与发布即可在群机器人中看到自己创建的机器人
2、配置服务 可以选择Java版本和python,参考钉钉开发手册
我这里用的是python代码我粘贴上去,自行配置即可
import logging
import re
import redis
import json
import pytz
import mysql.connector
import dingtalk_stream
import uuid
from dingtalk_stream import AckMessage
from datetime import datetime
from mysql.connector import Error
# --------------配置信息--------------------------------------
# 钉钉配置
client_id = "" # 上文让保存的钉钉机器人参数
client_secret = ""
# redis配置
redis_host = "" # 地址
redis_port = # 端口号
redis_password = "" # 如果没有密码则留空
redis_db = 10 # Redis数据库编号
# mysql配置
mysql_config = {
"host": "", # MySQL地址
"user": "", # 用户名
"password": "", # 密码
"database": "", # 数据库名称
"port": 3306 # 默认 MySQL 端口是 3306
}
# --------------配置信息--------------------------------------
# 日志配置
def setup_logger():
logger = logging.getLogger()
handler = logging.StreamHandler()
handler.setFormatter(
logging.Formatter('%(asctime)s %(name)-8s %(levelname)-8s %(message)s [%(filename)s:%(lineno)d]'))
logger.addHandler(handler)
logger.setLevel(logging.INFO)
return logger
# # --------------消息校验--------------------------------------
def validate_order_info(content):
"""
定义正则表达式验证消息内容是否符合特定格式
"""
# 定义正则表达式模式
pattern = (
r"订单号[::](\d+)[;;]" # 匹配订单号后面跟着的数字
)
# 使用正则表达式匹配
match = re.match(pattern, content)
# 如果匹配成功,则返回True,否则返回False
return bool(match)
def setup_redis():
return redis.Redis(host=redis_host, port=redis_port, password=redis_password, db=redis_db)
def setup_mysql():
try:
connection = mysql.connector.connect(**mysql_config)
return connection
except Error as e:
print(f"Error while connecting to MySQL: {e}")
return None
def generate_uuid():
# 生成一个版本4的UUID
new_uuid = uuid.uuid4()
# 将UUID转换为字符串并返回
return str(new_uuid)
class mychatBot_Handler(dingtalk_stream.ChatbotHandler):
def __init__(self, logger: logging.Logger = None):
super().__init__()
if logger:
self.logger = logger
self.redis_conn = setup_redis()
self.mysql_conn = setup_mysql()
async def process(self, callback: dingtalk_stream.CallbackMessage):
# -------------------------1.获取聊天信息--------------------------------------------------
incoming_message = dingtalk_stream.ChatbotMessage.from_dict(callback.data)
# 时间戳转换为 UTC 时间
timestamp_milliseconds = incoming_message.create_at
timestamp_seconds = timestamp_milliseconds / 1000.0
# 获取上海时区
shanghai_tz = pytz.timezone('Asia/Shanghai')
# 将时间戳转换为 datetime 对象
local_datetime = datetime.fromtimestamp(timestamp_seconds)
# 应用上海时区信息
shanghai_datetime = shanghai_tz.localize(local_datetime)
creat_shanghai_datetime = shanghai_datetime.strftime('%Y-%m-%d %H:%M:%S')
generated_uuid = generate_uuid()
# 获取昵称
sender_nick = incoming_message.sender_nick
# 获取消息内容去除所有空格
content = incoming_message.text.content.replace(" ", "")
# 验证消息内容是否符合特定格式
if not validate_order_info(content):
self.reply_text(
"消息格式错误",
incoming_message)
print("消息格式错误")
return AckMessage.STATUS_OK, 'OK'
print("昵称:" + sender_nick)
print("消息内容:" + content)
print("消息创建时间:" + creat_shanghai_datetime)
print("uuid:" + generated_uuid)
# -------------------------2.写入Redis--------------------------------------------------
# 将消息序列化为JSON格式
message_data = {
"content": content,
"send_time": creat_shanghai_datetime,
"nickname": sender_nick,
"uuid": generated_uuid
}
message_json = json.dumps(message_data)
# 将消息推入Redis队列
queue_name = "chat_queue"
self.redis_conn.lpush(queue_name, message_json)
# -------------------------3.写入MySQL数据库--------------------------------------------------
if self.mysql_conn:
try:
cursor = self.mysql_conn.cursor()
cursor.execute('''
INSERT INTO 表名(id, nickname, content, send_time) VALUES (%s, %s, %s, %s)
''', (generated_uuid, sender_nick, content, creat_shanghai_datetime))
self.mysql_conn.commit()
except Error as e:
print(f"Error while inserting into MySQL: {e}")
# --------------------4.回复信息-------------------------------------------------------
self.reply_text("消息已收到", incoming_message)
return AckMessage.STATUS_OK, 'OK'
def main():
logger = setup_logger()
credential = dingtalk_stream.Credential(client_id, client_secret)
client = dingtalk_stream.DingTalkStreamClient(credential)
client.register_callback_handler(dingtalk_stream.chatbot.ChatbotMessage.TOPIC, mychatBot_Handler(logger))
client.start_forever()
if __name__ == '__main__':
main()
执行以上代码,群内艾特机器人即可将消息传递至服务
连接redis和数据库的代码均已经写上去了,只需要简单配置即可使用,代码所使用库需要c++环境,如果报错可后台留言,博主将全力协助您解决
温馨提示:服务运行会有红色信息警告,警告不是报错,不必理会
留在最后:不必纠结Java还是python,语言只是工具,思维才是核心;不会装redis或者mysql的可留言,人多的话专门出一期安装教程