钉钉企业内部机器人开发(公网部署版本)

钉钉给出的开发文档地址如下:
https://open.dingtalk.com/document/group/enterprise-created-chatbot

1.创建机器人

  1.登录钉钉开发者后台,依次选择应用开发 > 企业内部开发 > 机器人,点击创建应用
  2.填写机器人名字、描述、图片等信息,点击创建,创建完成会生成AppKey、AppSecret(代码里用来校验请求是否合法)等信息

2.开发机器人

当用户@机器人时,钉钉会通过机器人开发者的HTTPS服务地址,把消息内容发送出去,报文协议如下。

{"Content-Type": "application/json; charset=utf-8","timestamp": "1577262236757","sign":"xxxxxxxxxx"
}

开发者需对header中的timestamp和sign进行验证,以判断是否是来自钉钉的合法请求,避免其他仿冒钉钉调用开发者的HTTPS服务传送数据,具体验证逻辑如下:

 timestamp 与系统当前时间戳如果相差1小时以上,则认为是非法的请求。

 sign 与开发者自己计算的结果不一致,则认为是非法的请求。

 必须当timestamp和sign同时验证通过,才能认为是来自钉钉的合法请求。

sign的计算方法

header中的timestamp + “\n” + 机器人的appSecret当做签名字符串,使用HmacSHA256算法计算签名,然后进行Base64 encode,得到最终的签名值。,python的签名代码示例如下

#python 3.8
import hmac
import hashlib
import base64timestamp = '1577262236757'
app_secret = 'this is a secret'
app_secret_enc = app_secret.encode('utf-8')
string_to_sign = '{}\n{}'.format(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)

捋一下整体逻辑:
1.用户@机器人,发一个消息到消息接收地址(相当于访问机器人服务接口)
2.从请求headers里面获取到sign和timestamp两个值服务端自己算的sign及timestamp做校验
3.校验通过,是合法请求,返回给调用者对应的内容,否则不通过报错

代码实现
使用flask写个接口,host绑定0.0.0.0,端口9090(随意定即可)

# -*- encoding: utf-8 -*-
import flask
from flask import request
import json
import requests
import time
import hmac
import base64
import hashlibserver = flask.Flask(__name__)@server.route("/robot", methods=['post'])
def run():post_sign = request.headers.get("Sign")print("请求头中的sign", request.headers.get("Sign"))post_timestamp = request.headers.get("Timestamp")print("请求头中的Timestamp", request.headers.get("Timestamp"))# 得到当前时间戳timestamp = str(round(time.time() * 1000))# 计算签名# app_secret = '机器人阿Q的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)# 验证是否来自钉钉的合法请求if (abs(int(post_timestamp) - int(timestamp)) < 3600000 and post_sign == sign):request_data_dict = json.loads(request.get_data())print("请求数据:", request_data_dict)# 请求用户idpost_userid = request_data_dict.get("senderId")# 请求具体内容,可以根据该字段值写一些逻辑,返回对应内容post_message = request_data_dict.get("text").get("content").strip()print("请求内容:", post_message)# 请求的群机器人webhookpost_sessionwebhook = request_data_dict.get("sessionWebhook")header = {"Content-Type": "application/json","Charset": "UTF-8"}# 处理消息,组装返回消息格式# 这里可以扩展很多逻辑,可以把回复逻辑提取出去message_json = {"msgtype": "text","text": {"content": "这是响应内容"},"at": {"atDingtalkIds": [post_userid],"isAtAll": False}}# 返回发送状态info = requests.post(url=post_sessionwebhook, data=message_json, headers=header))print(info.text)else:print("Warning:Not DingDing's post")if __name__ == '__main__':server.run(host="0.0.0.0", port=9090)# 平台规则问题,有些图片发布不了,在#http://mp.weixin.qq.com/s?__biz=MzU1MDgxNjgyMg==&mid=2247484106&idx=1&sn=2909e41ce3b759ef52c7d417c680f44f&chksm=fb9b9f93ccec16852424bf42cab35cbcb2a857ab2a062d0664bb11210830e9a2a88bb383830c#rd#可查看全部内容

上述代码中只展示了一种返回格式,更多具体返回消息格式详见:
https://open.dingtalk.com/document/group/basic-message-types
写完之后,将代码上传公网服务器,使用命令启动该文件,如 python xxx.py 即可

3.发布机器人

发布之前,在机器7人详情页,单击开发管理,配置开发信息。主要包括两个点:
 1.服务器出口ip。这个其实就是部署机器人服务公网可访问的IP
 2.消息接收地址。这个就是机器人服务的 http://公网ip:9090/robot(上面接口定义的)

#很多图片展示不了,全文可在[零九一八]查看
#http://mp.weixin.qq.com/s?__biz=MzU1MDgxNjgyMg==&mid=2247484106&idx=1&sn=2909e41ce3b759ef52c7d417c680f44f&chksm=fb9b9f93ccec16852424bf42cab35cbcb2a857ab2a062d0664bb11210830e9a2a88bb383830c#rd

然后在开发者后台对应的机器人应用详情页面,单击版本管理与发布,点击发布,即可使用

使用过程建议:可以先和机器人单聊,然后再建个群使用@功能

钉钉企业内部机器人python开发(公网部署版本)相关推荐

  1. 使用钉钉创建企业内部机器人

    目录 玩转钉钉机器人 创建钉钉机器人: 如何创建钉钉机器人 如何调用机器人api 支持的消息格式 text类型 markdown类型 整体跳转actionCard类型 feedCard类型 使用钉钉机 ...

  2. 用python实现钉钉Outgoing机器人(企业内部机器人)全过程

    不多说,先上最终效果图 [Python钉钉Outgoing机器人初步研究 再上一段连接,后续所有过程都是在大佬的思路下进行的,代码也是从大佬这里复制的,只是稍微改动的一部分,大家可以在联调通过能实现交 ...

  3. 钉钉企业内部机器人开发——绑定群聊信息到机器人

    开发机器人的过程中,需要将用户添加的机器人存储在数据库中,对于企业内部机器人,官方只提供一个token,其他的机器人信息都没有提供. 对于自定义webhook机器人,还多了一个secret,其实,一个 ...

  4. 钉钉通知-调用钉钉发送企业内部消息开发

    首先,我们要明确需求:自己的系统需要发送通知消息到用户,接收消息用户为同一企业内的人员,选用短信可能涉及到费用问题,故可以选用钉钉或者企业微信,在此我使用钉钉进行发送消息. 调用钉钉发送企业内部消息: ...

  5. Python开发环境部署详细教程,附上免费Python开发平台

    Python开发环境部署详细教程来啦!本文将带大家搭建一个Python虚拟环境和基于网页的用于交互计算的应用程序Jupyter Notebook. 如果这么简单的部署教程你还是学不会,没关系,在文章末 ...

  6. 钉钉企业内部机器人开发——同步组织架构人员信息到数据库

    开发钉钉机器人的过程中,我们不仅需要直接把组织架构用户信息导入数据库,还要不定时的进行同步,因为钉钉里面的人员总是在变动,部门也是不断在调整. 下面是使用递归的方式,调用钉钉接口,同步部门和人员信息, ...

  7. 记录:实现钉钉(企业内部应用)登录第三方网站

    由于后台无法配合前端配置路由为history模式,故vue路由采用hash模式.但是钉钉扫码成功后会导致重定向地址格式错误: 错误格式:https://xxx.com/?authCode=xxxx#/ ...

  8. 智能家居python编程前景_[请看正文] 小米生态链公司、智能家居头部企业招聘大量 Python 开发工程师...

    小米生态链企业 智能家居出货量全国第一 外籍创始人,技术至上,扁平管理 8-10 位 Python 开发,主要做 ERP 平台.新零售平台 职责描述: 1.规划 ERP 后台系统技术架构,参与需求分析 ...

  9. python开发环境部署以及调试教程

    为了开始咱们的python之旅,从环境配置开始吧! 第一步:下载稳定版Python环境,我采用的是python2.7.3版本的. 把Python环境包解压缩,解压包放置在合适的位置.本教程中说明时直接 ...

最新文章

  1. 习惯了收听虾米酷狗网易云音乐的你,好歹知道一下音乐推荐到底是咋回事吧
  2. 【BZOJ】1034: [ZJOI2008]泡泡堂BNB(贪心)
  3. mac 安装cmake
  4. HDU-3974 Assign the task 线段树 或 直接模拟多叉树 或 并查集 (三种方法)
  5. php1500,圆周率1500多位
  6. 使用USB直接方式解决ESXi识别加密狗的问题
  7. rom大小 stm32f205_最小的基于STM32F205VE的系统板
  8. echarts-python数据可视化大屏展示
  9. 控制反转和依赖注入的理解(通俗易懂)
  10. IR(红外遥控)基本原理
  11. ngx_stream_core_module
  12. zookeeper Session Expired
  13. 威联通NAS备份到百度网盘
  14. 麦凯隆全屋分质供水 保障家庭饮用水安全与健康
  15. npoi2.0版本word中插入图片
  16. 二级建造师继续教育留念
  17. 数据模拟:利用Java模拟数据(姓名,邮箱,地址,电话等信息,时间,工资,1-10随机数)并存入mysql
  18. 什么是单工、半双工和双工通信(最详细)
  19. 图像超分算法小合集二:FSRCNN、DRCN、RDN、EDSR
  20. SIMXXX 在高德地图定位到我的位置

热门文章

  1. Linux如何安装rpm文件
  2. 新手上路开车技巧 八步教你如何倒车入位
  3. Ubuntu命令(转)
  4. Matlab 关闭提醒,开始使用MATLAB?[关闭]
  5. 【英语】很抱歉,我一天的86400秒却没有你
  6. QAT量化感知训练(一)【详解】
  7. 【单片机项目】基于STM32的智能小车设计(三)软件设计
  8. 基于STM32F103平台的ADS79xx系列ADC(TI公司)应用方案
  9. 编程语言是怎么发展的?
  10. matlab神经网络43个案例PDF,matlab神经网络预测模型