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访问类中docstring注释的实现方法
May 04 Python
Python 读取指定文件夹下的所有图像方法
Apr 27 Python
Tensorflow中使用tfrecord方式读取数据的方法
Jun 19 Python
Python中常用的内置方法
Jan 28 Python
python如何实现数据的线性拟合
Jul 19 Python
numpy数组做图片拼接的实现(concatenate、vstack、hstack)
Nov 08 Python
wxPython实现分隔窗口
Nov 19 Python
python飞机大战pygame游戏背景设计详解
Dec 17 Python
Spy++的使用方法及下载教程
Jan 29 Python
pandas:get_dummies()与pd.factorize()的用法及区别说明
May 21 Python
python实现局部图像放大
Nov 17 Python
python超详细实现完整学生成绩管理系统
Mar 17 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 Memcached应用实现代码
2010/02/08 PHP
使用php实现快钱支付功能(涉及到接口)
2013/07/01 PHP
php全角字符转换为半角函数
2014/02/07 PHP
PHP判断远程图片或文件是否存在的实现代码
2014/02/20 PHP
基于Laravel实现的用户动态模块开发
2017/09/21 PHP
Javascript入门学习资料收集整理篇
2008/07/06 Javascript
基于jquery实现的服务器验证控件的启用和禁用代码
2010/04/27 Javascript
js使用心得分享
2015/01/13 Javascript
NodeJS学习笔记之(Url,QueryString,Path)模块
2015/01/13 NodeJs
JS实现的表格操作类详解(添加,删除,排序,上移,下移)
2015/12/22 Javascript
浅谈JS原型对象和原型链
2016/03/02 Javascript
jquery树形菜单效果的简单实例
2016/06/06 Javascript
基于jquery插件编写countdown计时器
2016/06/12 Javascript
jQuery实现发送验证码并60秒倒计时功能
2016/11/25 Javascript
jQuery EasyUi 验证功能实例解析
2017/01/06 Javascript
AngularJs表单校验功能实例代码
2017/02/09 Javascript
详解基于 axios 的 Vue 项目 http 请求优化
2017/09/04 Javascript
js实现弹窗猜数字游戏
2020/11/26 Javascript
[03:59]第二届DOTA2亚洲邀请赛选手传记-VGJ.rOtk
2017/04/03 DOTA
[05:31]干嘛呢兄弟!DOTA2 TI9语音轮盘部分出处
2019/05/14 DOTA
Django模板Templates使用方法详解
2019/07/19 Python
pytorch 利用lstm做mnist手写数字识别分类的实例
2020/01/10 Python
python实现程序重启和系统重启方式
2020/04/16 Python
python 日志模块logging的使用场景及示例
2021/01/04 Python
美国Randolph太阳镜官网:美国制造的飞行员太阳镜和射击眼镜
2018/06/15 全球购物
如何找出EMP表里面SALARY第N高的employee
2013/12/05 面试题
简单的JAVA编程面试题
2013/03/19 面试题
如何在Shell脚本中使用函数
2015/09/06 面试题
环境科学专业大学生自荐信格式
2013/09/21 职场文书
美丽乡村建设实施方案
2014/03/23 职场文书
2014向国旗敬礼网上签名活动总结
2014/09/27 职场文书
公司清洁工岗位职责
2015/04/15 职场文书
提档介绍信范文
2015/10/22 职场文书
Python数据可视化之用Matplotlib绘制常用图形
2021/06/03 Python
VUE使用draggable实现组件拖拽
2022/04/06 Vue.js
ubuntu开机后ROS程序自启动问题
2022/12/24 Servers