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 相关文章推荐
haskell实现多线程服务器实例代码
Nov 26 Python
Pthon批量处理将pdb文件生成dssp文件
Jun 21 Python
Python的装饰器模式与面向切面编程详解
Jun 21 Python
Python+django实现文件下载
Jan 17 Python
Python3.4 splinter(模拟填写表单)使用方法
Oct 13 Python
对python模块中多个类的用法详解
Jan 10 Python
numpy基础教程之np.linalg
Feb 12 Python
Python使用Tkinter实现转盘抽奖器的步骤详解
Jan 06 Python
Python装饰器实现方法及应用场景详解
Mar 26 Python
Keras框架中的epoch、bacth、batch size、iteration使用介绍
Jun 10 Python
Docker如何部署Python项目的实现详解
Oct 26 Python
Python多线程实用方法以及共享变量资源竞争问题
Apr 12 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
把从SQL中取出的数据转化成XMl格式
2006/10/09 PHP
如何在PHP中使用Oracle数据库(1)
2006/10/09 PHP
PHP动态生成javascript文件的2个例子
2014/04/11 PHP
PHP实现 APP端微信支付功能
2018/06/22 PHP
laravel实现查询最后执行的一条sql语句的方法
2019/10/09 PHP
奇妙的js
2007/09/24 Javascript
JQuery从头学起第一讲
2010/07/04 Javascript
js实现一个省市区三级联动选择框代码分享
2013/03/06 Javascript
js 金额格式化来回转换示例
2014/02/23 Javascript
纯javascript实现简单下拉刷新功能
2015/03/13 Javascript
js实现同一页面多个运动效果的方法
2015/04/10 Javascript
js代码实现随机颜色的小方块
2015/07/30 Javascript
JavaScritp添加url参数并将参数加入到url中及更改url参数的方法
2015/10/26 Javascript
JavaScript+html5 canvas绘制缤纷多彩的三角形效果完整实例
2016/01/26 Javascript
全面了解addEventListener和on的区别
2016/07/14 Javascript
JS制作图形验证码实现代码
2020/10/19 Javascript
AngularJS实践之使用NgModelController进行数据绑定
2016/10/08 Javascript
JQuery Ajax WebService传递参数的简单实例
2016/11/02 Javascript
vue better-scroll插件使用详解
2018/01/25 Javascript
Vue核心概念Getter的使用方法
2019/01/18 Javascript
手把手带你封装一个vue component第三方库
2019/02/14 Javascript
React Native登录之指纹登录篇的示例代码
2020/11/03 Javascript
Python简单实现查找一个字符串中最长不重复子串的方法
2018/03/26 Python
python selenium爬取斗鱼所有直播房间信息过程详解
2019/08/09 Python
python正则过滤字母、中文、数字及特殊字符方法详解
2020/02/11 Python
基于python实现删除指定文件类型
2020/07/21 Python
CSS3制作ajax loader icon实现思路及代码
2013/08/25 HTML / CSS
让IE下支持Html5的placeholder属性的插件
2014/09/02 HTML / CSS
学校大课间活动方案
2014/01/30 职场文书
大学应届生的自我评价
2014/03/06 职场文书
2014年教师节演讲稿范文
2014/09/10 职场文书
2014年幼师工作总结
2014/11/22 职场文书
护士爱岗敬业心得体会
2016/01/25 职场文书
准备去美国留学,那么大学申请文书应该怎么写?
2019/08/12 职场文书
Java面试题冲刺第十五天--设计模式
2021/08/07 面试题
企业开发CSS命名BEM代码规范实践
2022/02/12 HTML / CSS