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解析JSON数据的基本方法
Oct 15 Python
Python中用字符串调用函数或方法示例代码
Aug 04 Python
简单了解OpenCV是个什么东西
Nov 10 Python
Python编程实现蚁群算法详解
Nov 13 Python
python matlibplot绘制多条曲线图
Feb 19 Python
Django 限制用户访问频率的中间件的实现
Aug 23 Python
python使用numpy读取、保存txt数据的实例
Oct 14 Python
Python Pexpect库的简单使用方法
Jan 29 Python
python实现对输入的密文加密
Mar 20 Python
Python列表对象实现原理详解
Jul 01 Python
Python实现名片管理系统
Feb 14 Python
python中if嵌套命令实例讲解
Feb 25 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
discuz论坛 用户登录 后台程序代码
2008/11/27 PHP
php提示Warning:mysql_fetch_array() expects的解决方法
2014/12/16 PHP
PHP+MySQL实现模糊查询员工信息功能示例
2018/06/01 PHP
ThinkPHP5.1框架数据库链接和增删改查操作示例
2019/08/03 PHP
JavaScript静态的动态
2006/09/18 Javascript
Javascript实例教程(19) 使用HoTMetal(3)
2006/12/23 Javascript
JavaScript?Apple设备检测示例代码
2013/11/15 Javascript
jquery果冻抖动效果实现方法
2015/01/15 Javascript
JavaScript中创建字典对象(dictionary)实例
2015/03/31 Javascript
实现前后端数据交互方法汇总
2015/04/07 Javascript
jquery实现顶部向右伸缩的导航区域代码
2015/09/02 Javascript
使用Bootstrap美化按钮实例代码(demo)
2017/02/03 Javascript
JavaScript函数节流和函数防抖之间的区别
2017/02/15 Javascript
基于react框架使用的一些细节要点的思考
2017/05/31 Javascript
javascript基于定时器实现进度条功能实例
2017/10/13 Javascript
AngularJS 表单验证手机号的实例(非必填)
2017/11/12 Javascript
详解VUE2.X过滤器的使用方法
2018/01/11 Javascript
webpack4之SplitChunksPlugin使用指南
2018/06/12 Javascript
ES6 系列之 WeakMap的使用示例
2018/08/06 Javascript
浅谈express.js框架中间件(middleware)
2019/04/07 Javascript
详解一个小实例理解js原型和继承
2019/04/24 Javascript
vue实现数字动态翻牌的效果(开箱即用)
2019/12/08 Javascript
js实现网页版贪吃蛇游戏
2020/02/22 Javascript
python实现获取序列中最小的几个元素
2014/09/25 Python
python生成验证码图片代码分享
2016/01/28 Python
Python绑定方法与非绑定方法详解
2017/08/18 Python
Python爬虫使用脚本登录Github并查看信息
2018/07/16 Python
简单瞅瞅Python vars()内置函数的实现
2019/09/27 Python
flask 实现上传图片并缩放作为头像的例子
2020/01/09 Python
python爬虫scrapy基本使用超详细教程
2021/02/20 Python
CSS3实现苹果手机解锁的字体闪亮效果示例
2021/01/05 HTML / CSS
使用phonegap进行提示操作的具体方法
2017/03/30 HTML / CSS
"9.18"国耻日演讲稿范文
2014/09/14 职场文书
经典祝酒词大全
2015/08/12 职场文书
Linux安装Nginx步骤详解
2021/03/31 Servers
MySQL数据库之存储过程 procedure
2022/06/16 MySQL