钉钉企业机器人outgoing功能实现(超详细)

1 篇文章 0 订阅
1 篇文章 0 订阅

第一次做,遇到了很多问题,都不知道从何开始,主要是没一个清晰的思路 ,闲话不多说,直入主题

目录

1、创建企业机器人

 1.1钉钉创建团队

1.2创建企业机器人

1.3登陆钉钉开放平台

1.4钉钉企业机器人创建

2、代码编写

2.1解析

 2.2部署


实现原理

这是@机器人后,要经过三处的交互,钉钉客户端、钉钉服务器、部署的http服务器,具体如下图:

1、创建企业机器人

这里指的是企业机器人,不是个人机器人,企业机器人,需要自己在钉钉里面创建一个团队,不然以个人的账号登陆【钉钉开放平台】会提示【暂无权限】钉钉开放平台

 1.1钉钉创建团队

点击pc端左上角公司按钮,下拉列表后,会有一个【创建企业/组织/团队】,点击后,按流程操作

 

注意:创建好团队后,给自己加一个最高职位的权限,一般是CEO,具体步骤到时候可以摸索下 

1.2创建企业机器人

这里的具体步骤可以看看钉钉官方文档:创建钉钉企业机器人

1.3登陆钉钉开放平台

  • 这里首先登陆钉钉开放平台钉钉开放平台
  • 然后点击:应用开发-企业内部开发

然后创建应用,创建一个机器人

应用信息这里的AppSecret要记住,后面代码需要用到

 点击基础信息-开发管理

服务器出口ip:这里的是你需要填写的公网ip地址,一般服务器都有公网,如果需要本地调试的话,需要使用:内网穿透

使用内网穿透后,外网可以访问本地的域名就可以了 

消息接收地址:这里填写http服务,我这里用的是Flask框架搭建的简易http服务

 最后就可以进行机器人发布啦

1.4钉钉企业机器人创建

机器人发布后,在钉钉机器人管理里面,就可以看到发布的企业机器人啦

注意:这里只有发布机器人的团队企业,创建内部钉钉群,添加企业机器人才有效。内部群需要加入你创建的企业,才可以创建内部群

  •  这里的post地址可以和钉钉开放平台里面的消息接收地址填写一致
  • 这里的主要作用是你@机器人的时候,就是通过这个post地址,发放到你搭建的http服务里

 到这一步,所有的基础工作都完成了,我们继续进行第二步

2、代码编写

我这里用的是python,所以以python为例,下面先直接贴代码

import flask
from flask import request
import json
import requests
import time
import hmac
import base64
import hashlib

server = flask.Flask(__name__)
@server.route("/run",methods=['post'])
def run():
    #获取到post响应体中的sign
    post_sign = request.headers.get("Sign")
    #获取到post响应体中的Timestamp
    post_timestamp = request.headers.get("Timestamp")
    # 得到当前时间戳
    timestamp = str(round(time.time() * 1000))
    # 计算签名
    app_secret = '这里填写钉钉开放平台-应用信息-里面的AppSecret'
    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')
    print("根据加密规则生成的sign:", sign)
    # 验证是否来自钉钉的合法请求
    #这里需要需要两个要求,请求的sign和响应的sign要一致,且当前时间和响应的时间不能大于10分钟
    if (abs(int(post_timestamp) - int(timestamp)) < 3600000 and post_sign == sign):
        request_data_dict = json.loads(request.get_data())
        print("请求数据:", request_data_dict)
        # 请求用户id
        post_userid = request_data_dict.get("senderStaffId")
        # 这里拿到的就是你@机器人是输入的文本,可以根据输入文本进行一些if判断
        post_message = request_data_dict.get("text").get("content").strip()
        print("请求内容:", post_message)
        #以上部分是接收@机器人时发送的post请求,对响应数据进行处理。进行签名验证,签名验证这一步也可不需要
        #------------------------------------------分割线------------------------------------
        #以下部分是进行消息发送,我们接收到机器人发送的请求了,对请求进行一系列的出来,然后就需要返回给钉钉了
        # 请求的群机器人webhook
        post_webhook = request_data_dict.get("sessionWebhook")
        # 构建请求头部
        header = {
            "Content-Type": "application/json",
            "Charset": "UTF-8",
        }
        # 构建请求数据
        tex = "监控报警TEST\n回复消息{0}".format(post_message)
        data = {

            "msgtype": "text",
            "text": {
                "content": tex
            },
            "at": {

                "isAtAll": False,
                'atMobiles': ['18#########2'],
                "atUserIds": [post_userid],
            }

        }
        # 对请求的数据进行json封装
        message_json = json.dumps (data)
        # 发送请求
        info = requests.post (url=post_webhook, data=message_json, headers=header)
        # 打印返回的结果
        print (info.text)
        return info.text
    else:
        print("这不是一个post请求")

if __name__ == '__main__':
    server.run(host="0.0.0.0", port=5050)

2.1解析

这里的代码分成了上下两部分

  1. 上部分是接收@机器人时发送的post请求,对响应数据进行处理。进行签名验证,签名验证这一步也可不需要,签名这里具体可以看钉钉签名解析钉钉企业机器人签名计算
  2. 下部分是进行消息发送,我们接收到机器人发送的请求了,对请求进行一系列的出来,然后就需要返回给钉钉了
  • 其他一些消息类型也可以参考钉钉官方文档钉钉机器人消息类型
  • 在代码中,我们@机器人时,相当于像我们搭建的http发送了一个post请求,这个时候我们可以拿到post请求的响应体,具体响应字段如下,有需要用到的字段,可以去获取
{
    "conversationId": "xxx",
    "atUsers": [
        {
            "dingtalkId": "xxx",
            "staffId":"xxx"
        }
    ],
    "chatbotCorpId": "dinge8a565xxxx",
    "chatbotUserId": "$:LWCP_v1:$Cxxxxx",
    "msgId": "msg0xxxxx",
    "senderNick": "杨xx",
    "isAdmin": true,
    "senderStaffId": "user123",
    "sessionWebhookExpiredTime": 1613635652738,
    "createAt": 1613630252678,
    "senderCorpId": "dinge8a565xxxx",
    "conversationType": "2",
    "senderId": "$:LWCP_v1:$Ff09GIxxxxx",
    "conversationTitle": "机器人测试-TEST",
    "isInAtList": true,
    "sessionWebhook": "https://oapi.dingtalk.com/robot/sendBySession?session=xxxxx",
    "text": {
        "content": " 你好"
    },
    "msgtype": "text"
}

 2.2部署

  • 这里我们把代码放到服务器,然后使用命令:python ****.py
  • 显示如下就是服务启动成功了

注意:这里首先要确认是否安装了python环境,一般云服务器自带python2环境的,应该也可以用

  • 然后就是你服务设置的端口是否开放,如果没有开放,外网是访问不了的
  • 服务启动后,就可以使用:​http://公网ip:端口号/run​  进行外网访问了
  • 这里的​http://公网ip:端口号/run也就是之前填入到钉钉开放平台的【消息接收地址】和钉钉机器人的【post地址】

  1.  这里会发现,关闭服务器连接后,http服务也会被关闭
  2. 这个时候我们使用命令:nohup python xx.py &  
  3. 可以服务器连接关闭后,也不断开
  4. 需要关闭服务的话,使用命令:netstat -ntpl  找到启动的服务pid
  5. 然后:kill -9 pid 关闭服务

最后贴上实现效果

  • 7
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
好的,我会尽力回答你的问题。首先,你需要先在开发者平台上创建一个自定义机器人,并获取到机器人的webhook地址。然后,使用Python编写代码,调用机器人API发送图片。 以下是一个示例代码,可以帮助你实现机器人发送图片的功能: ```python import requests def send_dingtalk_image(image_url, access_token): """ 发送机器人图片消息 :param image_url: 图片的URL地址 :param access_token: 机器人的access_token """ url = "https://oapi.dingtalk.com/robot/send?access_token=" + access_token headers = {"Content-Type": "application/json;charset=utf-8"} data = { "msgtype": "image", "image": { "media_id": image_url } } response = requests.post(url=url, json=data, headers=headers) if response.status_code == 200: print("发送成功") else: print("发送失败") if __name__ == '__main__': # 图片的URL地址 image_url = "http://example.com/image.png" # 机器人的access_token access_token = "xxxxxxxxxxxxxx" # 调用发送机器人图片消息的函数 send_dingtalk_image(image_url, access_token) ``` 在调用`send_dingtalk_image`函数时,你需要传入图片的URL地址和机器人的access_token。其中,`image_url`参数为图片的URL地址,`access_token`参数为机器人的access_token。 注意,在发送图片消息时,需要将`msgtype`参数设置为`image`,并且在`image`字段中,将`media_id`设置为图片的URL地址。 希望这个示例代码可以帮助你实现机器人发送图片的功能。如果你还有其他问题,请随时提出。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值