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自动化测试Eclipse+Pydev 搭建开发环境
Aug 15 Python
Python numpy 常用函数总结
Dec 07 Python
对python .txt文件读取及数据处理方法总结
Apr 23 Python
IntelliJ IDEA安装运行python插件方法
Dec 10 Python
django项目简单调取百度翻译接口的方法
Aug 06 Python
django 通过url实现简单的权限控制的例子
Aug 16 Python
Python基础之变量基本用法与进阶详解
Jan 03 Python
Python3操作YAML文件格式方法解析
Apr 10 Python
Python闭包装饰器使用方法汇总
Jun 29 Python
详解Django中的FBV和CBV对比分析
Mar 01 Python
pytorch中的model=model.to(device)使用说明
May 24 Python
python文本处理的方案(结巴分词并去除符号)
May 26 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
提取HTML标签
2006/10/09 PHP
PHP 数组实例说明
2008/08/18 PHP
基于php-fpm的配置详解
2013/06/03 PHP
php修改文件上传限制方法汇总
2015/04/07 PHP
PHP数据库连接mysql与mysqli对比分析
2016/01/04 PHP
Laravel中正确地返回HTTP状态码方法示例
2019/09/10 PHP
利用Ext Js生成动态树实例代码
2008/09/08 Javascript
慎用 somefunction.prototype 分析
2009/06/02 Javascript
JQuery自定义事件的应用 JQuery最佳实践
2010/08/01 Javascript
jquery插件之easing使用
2010/08/19 Javascript
Google AJAX 搜索 API实现代码
2010/11/17 Javascript
基于jquery的代码显示区域自动拉长效果
2011/12/07 Javascript
jQuery实现的图文高亮滚动切换特效实例
2015/08/10 Javascript
JavaScript中this详解
2015/09/01 Javascript
解决js页面滚动效果scrollTop在FireFox与Chrome浏览器间的兼容问题的方法
2015/12/03 Javascript
浏览器环境下JavaScript脚本加载与执行探析之动态脚本与Ajax脚本注入
2016/01/19 Javascript
基于javascript实现九宫格大转盘效果
2020/05/28 Javascript
JS获取地址栏参数的两种方法(简单实用)
2016/06/14 Javascript
在windows上用nodejs搭建静态文件服务器的简单方法
2016/08/11 NodeJs
Ionic2系列之使用DeepLinker实现指定页面URL
2016/11/21 Javascript
vue2中使用less简易教程
2018/03/27 Javascript
使用JS代码实现俄罗斯方块游戏
2018/08/03 Javascript
javascript将16进制的字符串转换为10进制整数hex
2020/03/05 Javascript
一篇不错的Python入门教程
2007/02/08 Python
python实现JAVA源代码从ANSI到UTF-8的批量转换方法
2015/08/10 Python
TensorFlow Session会话控制&Variable变量详解
2018/07/30 Python
Python Learning 列表的更多操作及示例代码
2018/08/22 Python
Python安装OpenCV的示例代码
2020/03/05 Python
如何对python的字典进行排序
2020/06/19 Python
Pytest如何使用skip跳过执行测试
2020/08/13 Python
单位单身证明范本
2014/01/11 职场文书
中学运动会广播稿
2014/01/19 职场文书
个人求职信范例
2014/01/29 职场文书
在校大学生个人的自我评价
2014/02/13 职场文书
晚会主持词开场白
2014/03/17 职场文书
Windows Server 2008 修改远程登录端口以及配置防火墙
2022/04/28 Servers