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自动化测试之从命令行运行测试用例with verbosity
Sep 28 Python
python对数组进行反转的方法
May 20 Python
基于python的字节编译详解
Sep 20 Python
python去除扩展名的实例讲解
Apr 23 Python
python多进程提取处理大量文本的关键词方法
Jun 05 Python
python批量下载抖音视频
Jun 17 Python
python实现知乎高颜值图片爬取
Aug 12 Python
python3获取url文件大小示例代码
Sep 18 Python
Python进阶之迭代器与迭代器切片教程
Jan 29 Python
tensorflow 20:搭网络,导出模型,运行模型的实例
May 26 Python
python如何用matplotlib创建三维图表
Jan 26 Python
python中os.remove()用法及注意事项
Jan 31 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/06/13 PHP
php json转换成数组形式代码分享
2014/11/10 PHP
php视频拍照上传头像功能实现代码分享
2015/10/08 PHP
老生常谈PHP数组函数array_merge(必看篇)
2017/05/25 PHP
PHP基于DateTime类解决Unix时间戳与日期互转问题【针对1970年前及2038年后时间戳】
2018/06/13 PHP
php微信公众号开发之简答题
2018/10/20 PHP
浅析PHP echo 和 print 语句
2020/06/30 PHP
php框架知识点的整理和补充
2021/03/01 PHP
JavaScript 编程引入命名空间的方法与代码
2007/08/13 Javascript
javascript 函数调用规则
2009/08/26 Javascript
javascript 触发事件列表 比较不错
2009/09/03 Javascript
contains和compareDocumentPosition 方法来确定是否HTML节点间的关系
2011/09/13 Javascript
js实现在页面上弹出蒙板技巧简单实用
2013/04/16 Javascript
jQuery实现仿美橙互联两级导航菜单效果完整实例
2015/09/17 Javascript
jquery解析json格式数据的方法(对象、字符串)
2015/11/24 Javascript
给before和after伪元素设置js效果的方法
2015/12/04 Javascript
JavaScript中的ParseInt("08")和“09”返回0的原因分析及解决办法
2016/05/19 Javascript
详解XMLHttpRequest(二)响应属性、二进制数据、监测上传下载进度
2016/09/14 Javascript
Bootstrap基本组件学习笔记之缩略图(13)
2016/12/08 Javascript
微信小程序-横向滑动scroll-view隐藏滚动条
2017/04/20 Javascript
详解给Vue2路由导航钩子和axios拦截器做个封装
2018/04/10 Javascript
jQuery实现导航样式布局操作示例【可自定义样式布局】
2018/07/24 jQuery
JS实现横向轮播图(初级版)
2020/06/24 Javascript
Vue 样式切换及三元判断样式关联操作
2020/08/09 Javascript
简洁的十分钟Python入门教程
2015/04/03 Python
用Python脚本来删除指定容量以上的文件的教程
2015/05/04 Python
python执行使用shell命令方法分享
2017/11/08 Python
Python加载带有注释的Json文件实例
2018/05/23 Python
关于python中密码加盐的学习体会小结
2019/07/15 Python
详解Python是如何实现issubclass的
2019/07/24 Python
python2爬取百度贴吧指定关键字和图片代码实例
2019/08/14 Python
伦敦高达60%折扣的钻石珠宝商:Purely Diamonds
2018/06/24 全球购物
培训班开班仪式主持词
2014/03/28 职场文书
单位未婚证明范本
2014/11/25 职场文书
迎客户欢迎词三篇
2019/09/27 职场文书
Redis6.0搭建集群Redis-cluster的方法
2021/05/08 Redis