服务打通钉钉群机器人Stream模式(无需服务器)连接redis实现消息队列

此教程用于处理钉钉群消息连接服务

优化售后服务流程,提升客户满意度

        在电商行业的激烈竞争中,大促活动无疑是吸引顾客、提高销量的重要手段之一。然而,在这些高流量时期,售后服务的压力也随之增大。尤其是当遇到需要退差价、产品损坏需补发等复杂情况时,售后客服的工作量会显著增加,这不仅影响了工作效率,还可能降低客户的满意度。

        在我近期接手的一项业务中,我发现许多客服伙伴在处理这类问题时感到力不从心。他们需要频繁地操作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的可留言,人多的话专门出一期安装教程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值