钉钉单聊/群聊机器人实现思路

本文档详细介绍了如何在钉钉开发平台上申请机器人,管理回调接口,以及关键步骤如获取消息数据、后端认证和发送单聊/群聊消息。重点讲解了消息接收和实现代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

钉钉官网文档:https://open.dingtalk.com/document/group/robot-overview

一、钉钉开发平台
1.申请机器人

应用开发-企业内部开发-基础信息-机器人-创建机器人

2.开发管理

设置开发服务器出口IP列表

3.回调接口

设置钉钉扫码后的回调后端接口 (用于消息接收)

4.权限设置

企业内机器人发送消息权限


二、消息接收

获取post后的消息数据及各字段

1.通用字段
conversationType = req_data['conversationType']                         # 消息类型,1单聊,2群聊
conversationId = req_data['conversationId']                             # 加密的会话id
msgId = req_data['msgId']                                               # 加密的消息id
senderNick = req_data['senderNick']                                     # 发送消息的人昵称
isAdmin = req_data['isAdmin']                                           # 是否为管理员
sessionWebhookExpiredTime = req_data['sessionWebhookExpiredTime']       # 当前会话的Webhook地址过期时间
createAt = req_data['createAt']                                         # 消息的时间戳
senderId = req_data['senderId']                                         # 加密的发送者id
chatbotUserId = req_data['chatbotUserId']                               # 加密的机器人id
msgtype = req_data['msgtype']                                           # 消息类型,目前只支持text
text = req_data['text']['content']                                      # 消息的关键字
sessionWebhook = req_data['sessionWebhook']                             # 当前会话的webhook地址
robotCode = req_data['robotCode']                                       # 消息机器人代码
post_timestamp = request.headers.get('Timestamp')                       # 消息timestamp
post_sign = request.headers.get('Sign')                                 # 消息sign
2.单聊字段
chatbotCorpId = req_data['chatbotCorpId']                               # 加密的机器人所在的企业corpId
senderStaffId = req_data['senderStaffId']                               # 企业内部群中@该机器人的成员userid
senderCorpId = req_data['senderCorpId']                                 # 企业内部群有的发送者当前群的企业corpId。
3.群聊字段
atUsers = req_data['atUsers']                                           # 被@人的信息
conversationTitle = req_data['conversationTitle']                       # 群聊时的群名称
isInAtList = req_data['isInAtList']                                     # 是否在@列表中

三、后端认证


四、发送消息

1.单聊

msg = {
    "text": {
        "content": "单聊: {}".format(text)
    },
    "msgtype": "text"
}
return json.dumps(msg)

五、实现代码

import json
import hmac
import hashlib
import base64
import time

api_blueprint = Blueprint(__name__ + '_api', __name__)
logger = get_logger(logger_type='run')


def check_sign_result(post_timestamp, post_sign):
    timestamp = round(time.time() * 1000)
    app_secret = 'ASAO7-nwDBzT1ObEo1PC6htvjHwlIBeu-4sZ7oVDQjf86EOA0DASgylZg-LIKmcL'
    app_secret_enc = app_secret.encode('utf-8')
    string_to_sign = '{}\n{}'.format(post_timestamp, app_secret)
    string_to_sign_enc = string_to_sign.encode('utf-8')
    hmac_code = hmac.new(app_secret_enc, string_to_sign_enc, digestmod=hashlib.sha256).digest()
    sign = base64.b64encode(hmac_code).decode('utf-8')
    # 校验时间戳/sign
    if (timestamp - int(post_timestamp) < 36000000 or (int(post_timestamp) - timestamp) < 3600000) and sign == post_sign:
        return True
    else:
        return False


@api_blueprint.route('/wanglei/robot', methods=["GET", "POST"])
def wanglei_robot():
    if request.method == 'GET':
        return 'get'
    elif request.method == 'POST':
        req_data = json.loads(request.data.decode())
        post_timestamp = request.headers.get('Timestamp')
        post_sign = request.headers.get('Sign')
        result = check_sign_result(post_timestamp, post_sign)
        if result:
            conversationType = req_data['conversationType']                         # 消息类型,1单聊,2群聊
            conversationId = req_data['conversationId']                             # 加密的会话id
            msgId = req_data['msgId']                                               # 加密的消息id
            senderNick = req_data['senderNick']                                     # 发送消息的人昵称
            isAdmin = req_data['isAdmin']                                           # 是否为管理员
            sessionWebhookExpiredTime = req_data['sessionWebhookExpiredTime']       # 当前会话的Webhook地址过期时间
            createAt = req_data['createAt']                                         # 消息的时间戳
            senderId = req_data['senderId']                                         # 加密的发送者id
            chatbotUserId = req_data['chatbotUserId']                               # 加密的机器人id
            msgtype = req_data['msgtype']                                           # 消息类型,目前只支持text
            text = req_data['text']['content']                                      # 消息的关键字
            sessionWebhook = req_data['sessionWebhook']                             # 当前会话的webhook地址
            robotCode = req_data['robotCode']                                       # 消息机器人代码

            if conversationType == '1':
                # 单聊
                chatbotCorpId = req_data['chatbotCorpId']                           # 加密的机器人所在的企业corpId
                senderStaffId = req_data['senderStaffId']                           # 企业内部群中@该机器人的成员userid
                senderCorpId = req_data['senderCorpId']                             # 企业内部群有的发送者当前群的企业corpId。
                msg = {
                    "text": {
                        "content": "单聊: {}".format(text)
                    },
                    "msgtype": "text"
                }
                return json.dumps(msg)
            else:
                # 群聊
                atUsers = req_data['atUsers']                                       # 被@人的信息
                conversationTitle = req_data['conversationTitle']                   # 群聊时的群名称
                isInAtList = req_data['isInAtList']                                 # 是否在@列表中

                # 如果回复的消息需要@用户,则通过senderNick获取userid,在atUserIds中列出userid即可
                msg = {
                    "at": {
                        "atUserIds": [
                            'manager8575'
                        ],
                        "isAtAll": False
                    },
                    "text": {
                        "content": '群聊: {}'.format(text)
                    },
                    "msgtype": "text"
                }
                return json.dumps(msg)

当然可以!使用 Python 和钉钉机器人 API,你可以编写以下代码实现将用户发给钉钉机器人的消息推送给某个人或某个钉钉群聊: ```python import requests import json def send_dingtalk_message(webhook, message): headers = {'Content-Type': 'application/json;charset=utf-8'} data = { "msgtype": "text", "text": { "content": message } } response = requests.post(webhook, data=json.dumps(data), headers=headers) result = response.json() if result["errcode"] == 0: print("消息发送成功!") else: print("消息发送失败:", result["errmsg"]) # 钉钉机器人的 webhook 地址 webhook = "https://oapi.dingtalk.com/robot/send?access_token=your_access_token" # 用户发送给钉钉机器人的消息 user_message = "用户发来的消息" # 要推送的钉钉群聊的 webhook 地址 group_webhook = "https://oapi.dingtalk.com/robot/send?access_token=your_group_access_token" # 推送用户消息给某个人 send_dingtalk_message(webhook, user_message) # 推送用户消息给某个群聊 send_dingtalk_message(group_webhook, user_message) ``` 请注意,你需要将 `your_access_token` 替换为你的钉钉机器人的 access_token,以及将 `your_group_access_token` 替换为你要推送的钉钉群聊的 access_token。 这段代码通过发送 HTTP POST 请求到钉钉机器人的 webhook 地址,将用户发来的消息以文本形式推送给指定人或群聊。如果发送成功,会打印出“消息发送成功!”;如果发送失败,会打印出具体的错误信息。 希望对你有所帮助!如有任何问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值