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内置的字符串处理函数详细整理(覆盖日常所用)
Aug 19 Python
Python中对列表排序实例
Jan 04 Python
Django中对数据查询结果进行排序的方法
Jul 17 Python
Python网络编程之TCP套接字简单用法示例
Apr 09 Python
基于python实现学生管理系统
Oct 17 Python
python版飞机大战代码分享
Nov 20 Python
Python安装Flask环境及简单应用示例
May 03 Python
seek引发的python文件读写的问题及解决
Jul 26 Python
Python中的list与tuple集合区别解析
Oct 12 Python
OpenCV Python实现拼图小游戏
Mar 23 Python
python中把元组转换为namedtuple方法
Dec 09 Python
python中添加模块导入路径的方法
Feb 03 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 分库分表hash算法
2009/11/12 PHP
php使用curl抓取qq空间的访客信息示例
2014/02/28 PHP
PHP中基本HTTP认证技巧分析
2015/03/16 PHP
整理php防注入和XSS攻击通用过滤
2015/09/13 PHP
php+ajax实现无刷新分页
2015/11/18 PHP
PHP 的Opcache加速的使用方法
2017/12/29 PHP
Laravel服务容器绑定的几种方法总结
2020/06/14 PHP
JQuery 选择器 xpath 语法应用
2010/05/13 Javascript
javascript动态的改变IFrame的高度实现自动伸展
2013/10/12 Javascript
NodeJS连接MongoDB数据库时报错的快速解决方法
2016/05/13 NodeJs
Angular外部使用js调用Angular控制器中的函数方法或变量用法示例
2016/08/05 Javascript
jQuery事件绑定方法学习总结(推荐)
2016/11/21 Javascript
JavaScript实现数值自动增加动画
2017/12/28 Javascript
javascript中的event loop事件循环详解
2018/12/14 Javascript
Nodejs核心模块之net和http的使用详解
2019/04/02 NodeJs
详解Python最长公共子串和最长公共子序列的实现
2018/07/07 Python
Python 互换字典的键值对实例
2019/02/12 Python
Django工程的分层结构详解
2019/07/18 Python
python3.x 生成3维随机数组实例
2019/11/28 Python
Python使用ElementTree美化XML格式的操作
2020/03/06 Python
Python装饰器的应用场景代码总结
2020/04/10 Python
PyTorch 导数应用的使用教程
2020/08/31 Python
Django Form常用功能及代码示例
2020/10/13 Python
matplotlib交互式数据光标实现(mplcursors)
2021/01/13 Python
Python如何telnet到网络设备
2021/02/18 Python
澳大利亚吉他在线:Artist Guitars
2017/03/30 全球购物
高三生物教学反思
2014/01/25 职场文书
进步之星获奖感言
2014/02/22 职场文书
《可爱的动物》教学反思
2014/02/22 职场文书
商学院大学生求职的自我评价
2014/03/12 职场文书
学校校庆演讲稿
2014/05/22 职场文书
大二学生学年自我鉴定
2014/09/12 职场文书
总经理检讨书
2014/09/15 职场文书
2015年保卫科工作总结
2015/05/14 职场文书
2016年大学生就业指导课心得体会
2015/10/09 职场文书
Python数据可视化之Seaborn的安装及使用
2022/04/19 Python