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列出目录下指定文件与子目录的方法
Jul 03 Python
Python实现选择排序
Jun 04 Python
利用python爬取散文网的文章实例教程
Jun 18 Python
pycharm远程调试openstack的图文教程
Nov 21 Python
使用pandas把某一列的字符值转换为数字的实例
Jan 29 Python
Python编写合并字典并实现敏感目录的小脚本
Feb 26 Python
python中嵌套函数的实操步骤
Feb 27 Python
python实现简单五子棋游戏
Jun 18 Python
python实现飞船大战
Apr 24 Python
Python转换字典成为对象,可以用"."方式访问对象属性实例
May 11 Python
Django模板获取field的verbose_name实例
May 19 Python
基于tensorflow for循环 while循环案例
Jun 30 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
收音机玩机评测 406 篇视频合集
2020/03/11 无线电
PHP图片裁剪与缩放示例(无损裁剪图片)
2017/02/08 PHP
jquery select(列表)的操作(取值/赋值)
2009/08/06 Javascript
js禁止document element对象选中文本实现代码
2013/03/21 Javascript
编写js扩展方法判断一个数组中是否包含某个元素
2013/11/08 Javascript
处理文本部分内容的TextRange对象应用实例
2014/07/29 Javascript
javascript中this的四种用法
2015/05/11 Javascript
使用jquery实现的循环连续可停顿滚动实例
2016/11/23 Javascript
微信小程序开发(一) 微信登录流程详解
2017/01/11 Javascript
jQuery实现的简单在线计算器功能
2017/05/11 jQuery
vue 表单验证按钮事件交由父组件触发的方法
2018/12/17 Javascript
Windows上node.js的多版本管理工具用法实例分析
2019/11/06 Javascript
使用 UniApp 实现小程序的微信登录功能
2020/06/09 Javascript
JS+JQuery实现无缝连接轮播图
2020/12/30 jQuery
Python ORM框架SQLAlchemy学习笔记之安装和简单查询实例
2014/06/10 Python
Python中的字符串替换操作示例
2016/06/27 Python
浅析Python中yield关键词的作用与用法
2016/11/29 Python
python距离测量的方法
2018/03/06 Python
Python3 Post登录并且保存cookie登录其他页面的方法
2018/12/28 Python
Python 实现子类获取父类的类成员方法
2019/01/11 Python
Python检测数据类型的方法总结
2019/05/20 Python
详解PANDAS 数据合并与重塑(join/merge篇)
2019/07/09 Python
Pandas分组与排序的实现
2019/07/23 Python
python3字符串操作总结
2019/07/24 Python
解决Django删除migrations文件夹中的文件后出现的异常问题
2019/08/31 Python
python中有函数重载吗
2020/05/28 Python
HTML5 Notification(桌面提醒)功能使用实例
2014/03/17 HTML / CSS
师范生自我鉴定
2014/03/20 职场文书
教师节宣传方案
2014/05/23 职场文书
召开会议通知范文
2015/04/15 职场文书
匿名信格式范文
2015/05/27 职场文书
治庸问责工作总结
2015/08/11 职场文书
关于国庆节的广播稿
2015/08/19 职场文书
创业计划书详解
2019/07/19 职场文书
Android Flutter实现3D动画效果示例详解
2022/04/07 Java/Android
Java设计模式之代理模式
2022/04/22 Java/Android