Python实现钉钉发送报警消息的方法


Posted in Python onFebruary 20, 2019

钉钉开放平台传送门:https://open.dingtalk.com

我司使用钉钉作为内部通讯工具,基本上大家在电脑和手机上都开着,消息可以第一时间查看,报警消息的即时性要求比较高,所以适合用钉钉通知。

下面介绍如何用Python实现钉钉发送报警消息。

获取access token

要使用钉钉发送消息,首先需要获取access token,代码如下:

def get_access_token():
 url = 'https://oapi.dingtalk.com/gettoken?corpid=%s&corpsecret=%s' % (corp_id, corp_secret)
 request = urllib2.Request(url)
 response = urllib2.urlopen(request)
 response_str = response.read()
 response_dict = json.loads(response_str)
 error_code_key = "errcode"
 access_token_key = "access_token"
 if response_dict.has_key(error_code_key) and response_dict[error_code_key] == 0 and response_dict.has_key(access_token_key):
  return response_dict[access_token_key]
 else:
  return ''

access token在2小时内有效,有效期内重复获取返回相同结果,有效期会自动延长。corp_id和corp_secret是企业的id和secret,在钉钉的管理后台可以找到。另外,上面用到了urllib2和json,需要import:

import urllib2
import json

消息类型

钉钉的消息类型分为:text,image,voice,file,link和OA,具体消息格式参见:https://open-doc.dingtalk.com/docs/doc.htm?treeId=172&articleId=104972&docType=1 。

下面以发送文本,链接和文件消息为例进行说明。

给用户发送消息

发送文本

def send_text_to_users(access_token, users, text):
 msg_type, msg = _gen_text_msg(text)
 return _send_msg_to_users(access_token, users, msg_type, msg)

def _gen_text_msg(text):
 msg_type = 'text'
 msg = { "content": text }
 return msg_type, msg

def _send_msg_to_users(access_token, users, msg_type, msg):
 to_users = '|'.join(users)
 body_dict = {
  "touser": to_users,
  "agentid": agent_id,
  "msgtype": msg_type
 }
 body_dict[msg_type] = msg
 body = json.dumps(body_dict)
 return _send_msg("https://oapi.dingtalk.com/message/send?access_token=", access_token, body)

其中agent_id是一个钉钉应用的id,以钉钉应用的名义给用户发送消息。users是用户id列表,每个用户id是一个字符串。

发送链接

def send_link_to_users(access_token, users, url, title, text):
 msg_type, msg = _gen_link_msg(url, title, text)
 return _send_msg_to_users(access_token, users, msg_type, msg)

def _gen_link_msg(url, title, text):
 msg_type = 'link'
 msg = { 
  "messageUrl": url,
  "picUrl": "https://gw.alicdn.com/tps/TB1FN16LFXXXXXJXpXXXXXXXXXX-256-130.png",
  "title": title,
  "text": text 
 }
 return msg_type, msg

其中_send_msg_to_users方法参见前面的代码,picUrl字段设置的是钉钉官方的图片,这里用于测试。

发送文件

def send_file_to_users(access_token, users, file_name):
 media_id = upload_file(access_token, file_name)
 if media_id == '':
  return
 msg_type, msg = _gen_file_msg(media_id)
 return _send_msg_to_users(access_token, users, msg_type, msg)

def upload_file(access_token, file_name):
 register_openers()
 datagen, headers = multipart_encode({'media': open(file_name, 'rb')})
 requst_url = 'https://oapi.dingtalk.com/media/upload?access_token=' + access_token + '&type=file'
 request = urllib2.Request(requst_url, datagen, headers)
 response = urllib2.urlopen(request)
 response_str = response.read()
 response_dict = json.loads(response_str)
 media_id_key = 'media_id'
 error_code_key = 'errcode'
 if response_dict.has_key(error_code_key) and response_dict[error_code_key] == 0 and response_dict.has_key(media_id_key):
  return response_dict[media_id_key]
 else:
  return ''

需要先上传文件获得media_id,然后使用media_id将文件发送给用户。另外,这里用到了poster,可使用pip安装:

pip install poster

之后引入multipart_encode和register_openers函数:

from poster.encode import multipart_encode
from poster.streaminghttp import register_openers

给群会话发送消息

与给用户发送信息类似,区别是需要群会话id,而不是用户列表,以发送文本消息为例,代码如下:

def send_text_to_chat(access_token, chat_id, text):
 msg_type, msg = _gen_text_msg(text)
 return _send_msg_to_chat(access_token, chat_id, msg_type, msg)

def _send_msg_to_chat(access_token, chat_id, msg_type, msg):
 body_dict = {
  "chatid": chat_id,
  "msgtype": msg_type
 }
 body_dict[msg_type] = msg
 body = json.dumps(body_dict)
 return _send_msg("https://oapi.dingtalk.com/chat/send?access_token=", access_token, body)

其中_gen_text_msg方法参见前面的代码。

群会话可以自行创建,参见https://open-doc.dingtalk.com/docs/doc.htm?treeId=172&articleId=104977&docType=1 。

以上这篇Python实现钉钉发送报警消息的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
深入Python解释器理解Python中的字节码
Apr 01 Python
python学习之matplotlib绘制散点图实例
Dec 09 Python
Python 判断 有向图 是否有环的实例讲解
Feb 01 Python
python Opencv将图片转为字符画
Feb 19 Python
Python简单生成随机数的方法示例
Mar 31 Python
Python应用库大全总结
May 30 Python
python字典改变value值方法总结
Jun 21 Python
python 数据提取及拆分的实现代码
Aug 26 Python
Python Sphinx使用实例及问题解决
Jan 17 Python
selenium 多窗口切换的实现(windows)
Jan 18 Python
Django重设Admin密码过程解析
Feb 10 Python
Python中操作各种多媒体,视频、音频到图片的代码详解
Jun 04 Python
python给微信好友定时推送消息的示例
Feb 20 #Python
linux查找当前python解释器的位置方法
Feb 20 #Python
python 定时器,实现每天凌晨3点执行的方法
Feb 20 #Python
python爬取酷狗音乐排行榜
Feb 20 #Python
python 定时器,轮询定时器的实例
Feb 20 #Python
在Python中,不用while和for循环遍历列表的实例
Feb 20 #Python
python爬取内容存入Excel实例
Feb 20 #Python
You might like
提高PHP性能的编码技巧以及性能优化详细解析
2013/08/24 PHP
PHP文件操作方法汇总
2015/07/01 PHP
24条货真价实的PHP代码优化技巧
2016/07/28 PHP
PHP 用session与gd库实现简单验证码生成与验证的类方法
2016/11/15 PHP
解决php写入数据库乱码的问题
2019/09/17 PHP
fmt:formatDate的输出格式详解
2014/01/09 Javascript
从零学JSON之JSON数据结构
2014/05/19 Javascript
node.js中的fs.appendFile方法使用说明
2014/12/17 Javascript
js实现浏览器倒计时跳转页面效果
2016/08/12 Javascript
Html5+jQuery+CSS制作相册小记录
2016/12/30 Javascript
Angular2 自定义validators的实现方法
2017/07/05 Javascript
jQury Ajax使用Token验证身份实例代码
2017/09/22 Javascript
小程序实现投票进度条
2019/11/20 Javascript
JS实现移动端双指缩放和旋转方法
2019/12/13 Javascript
纯js实现无缝滚动功能代码实例
2020/02/21 Javascript
vue使用map代替Aarry数组循环遍历的方法
2020/04/30 Javascript
学习python (2)
2006/10/31 Python
python字典的常用操作方法小结
2016/05/16 Python
每天迁移MySQL历史数据到历史库Python脚本
2018/04/13 Python
python用户评论标签匹配的解决方法
2018/05/31 Python
Python单元测试unittest的具体使用示例
2018/12/17 Python
对Python定时任务的启动和停止方法详解
2019/02/19 Python
Django Xadmin多对多字段过滤实例
2020/04/07 Python
完美解决Pycharm中matplotlib画图中文乱码问题
2021/01/11 Python
设计总监岗位职责
2013/12/07 职场文书
工艺员岗位职责
2014/02/11 职场文书
文艺晚会主持词
2014/03/24 职场文书
《郑和远航》教学反思
2014/04/16 职场文书
党建工作先进材料
2014/05/02 职场文书
学前班评语大全
2014/05/04 职场文书
党员学习新党章思想汇报
2014/10/25 职场文书
一年级语文上册复习计划
2015/01/17 职场文书
2015年考研复习计划
2015/01/19 职场文书
MySQL Threads_running飙升与慢查询的相关问题解决
2021/05/08 MySQL
vue如何批量引入组件、注册和使用详解
2021/05/12 Vue.js
mysql优化之query_cache_limit参数说明
2021/07/01 MySQL