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通过yield实现数组全排列的方法
Mar 18 Python
基于python实现微信模板消息
Dec 21 Python
以一个投票程序的实例来讲解Python的Django框架使用
Feb 18 Python
python用户管理系统
Mar 13 Python
python自动重试第三方包retrying模块的方法
Apr 24 Python
使用PyCharm创建Django项目及基本配置详解
Oct 24 Python
pandas通过loc生成新的列方法
Nov 28 Python
如何在Python中实现goto语句的方法
May 18 Python
Python-while 计算100以内奇数和的方法
Jun 11 Python
django实现将修改好的新模型写入数据库
Mar 31 Python
keras 获取某层输出 获取复用层的多次输出实例
May 23 Python
Numpy中np.max的用法及np.maximum区别
Nov 27 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
一个程序下载的管理程序(二)
2006/10/09 PHP
PHP stristr() 函数(不区分大小写的字符串查找)
2010/06/03 PHP
php通过文件头检测文件类型通用代码类(zip,rar等)
2010/10/19 PHP
php提示Call-time pass-by-reference has been deprecated in的解决方法[已测]
2012/05/06 PHP
php另类上传图片的方法(PHP用Socket上传图片)
2013/10/30 PHP
php多任务程序实例解析
2014/07/19 PHP
Thinkphp搭建包括JS多语言的多语言项目实现方法
2014/11/24 PHP
深入浅析PHP7.0新特征(五大新特征)
2015/10/29 PHP
PHP多个图片压缩成ZIP的方法
2020/08/18 PHP
js 小数取整的函数
2010/05/10 Javascript
js控制不同的时间段显示不同的css样式的实例代码
2013/11/04 Javascript
js实现单行文本向上滚动效果实例代码
2013/11/28 Javascript
利用javascript数组长度循环数组内所有元素
2013/12/27 Javascript
使用get方式提交表单在地址栏里面不显示提交信息
2017/02/21 Javascript
vue-cli webpack 开发环境跨域详解
2017/05/18 Javascript
微信小程序实现添加手机联系人功能示例
2017/11/30 Javascript
Vue中添加手机验证码组件功能操作方法
2017/12/07 Javascript
node的process以及child_process模块学习笔记
2018/03/06 Javascript
JS使用队列对数组排列,基数排序算法示例
2019/03/02 Javascript
[01:09]DOTA2次级职业联赛 - 99战队宣传片
2014/12/01 DOTA
[48:29]2018DOTA2亚洲邀请赛3月30日 小组赛A组 LGD VS KG
2018/03/31 DOTA
[01:05:59]Mineski vs Secret 2019国际邀请赛淘汰赛 败者组 BO3 第二场 8.22
2019/09/05 DOTA
浅谈Python2.6和Python3.0中八进制数字表示的区别
2017/04/28 Python
python 多维切片之冒号和三个点的用法介绍
2018/04/19 Python
python如何求解两数的最大公约数
2018/09/27 Python
python实现得到当前登录用户信息的方法
2019/06/21 Python
如何基于Python代码实现高精度免费OCR工具
2020/06/18 Python
Django中Q查询及Q()对象 F查询及F()对象用法
2020/07/09 Python
关于django python manage.py startapp 应用名出错异常原因解析
2020/12/15 Python
Cinque网上商店:德国服装品牌
2019/03/17 全球购物
西班牙购买隐形眼镜、眼镜和太阳镜网站:Lentiamo.es
2020/06/11 全球购物
大学生自荐信
2013/12/11 职场文书
大学生个人自荐信
2014/02/24 职场文书
《三个小伙伴》教学反思
2014/04/11 职场文书
桥梁工程专业求职信
2014/04/21 职场文书
婚内房产协议书范本
2014/10/02 职场文书