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自定义主从分布式架构实例分析
Sep 19 Python
Python 专题六 局部变量、全局变量global、导入模块变量
Mar 20 Python
Python编程之列表操作实例详解【创建、使用、更新、删除】
Jul 22 Python
python中文分词,使用结巴分词对python进行分词(实例讲解)
Nov 14 Python
Python下使用Scrapy爬取网页内容的实例
May 21 Python
浅析Python pandas模块输出每行中间省略号问题
Jul 03 Python
Python实现某论坛自动签到功能
Aug 20 Python
Python 变量的创建过程详解
Sep 02 Python
Python函数的定义方式与函数参数问题实例分析
Dec 26 Python
Django分页器的用法你都了解吗
May 26 Python
Django+Nginx+uWSGI 定时任务的实现方法
Jan 22 Python
在Python 中将类对象序列化为JSON
Apr 06 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注入实例
2006/10/09 PHP
一个简单的自动发送邮件系统(一)
2006/10/09 PHP
php生成zip压缩文件的方法详解
2013/06/09 PHP
Laravel 5 框架入门(四)完结篇
2015/04/09 PHP
php面向对象值单例模式
2016/05/03 PHP
PHP 闭包详解及实例代码
2016/09/28 PHP
PHP 并发场景的几种解决方案
2019/06/14 PHP
css值转换成数值请抛弃parseInt
2011/10/24 Javascript
js如何设置在iframe框架中指定div不显示
2013/12/04 Javascript
jquery使用each方法遍历json格式数据实例
2015/05/18 Javascript
JQuery中Ajax()的data参数类型实例分析
2015/12/15 Javascript
javascript实现label标签跳出循环操作
2016/03/06 Javascript
jQuery+ajax简单实现文件上传的方法
2016/06/03 Javascript
详解AngularJS中的表单验证(推荐)
2016/11/17 Javascript
vue组件的写法汇总
2018/04/12 Javascript
微信小程序使用蓝牙小插件
2019/09/23 Javascript
浅谈vue3中effect与computed的亲密关系
2019/10/10 Javascript
Vue学习之常用指令实例详解
2020/01/06 Javascript
Vue-cli3多页面配置详解
2020/03/22 Javascript
Python translator使用实例
2008/09/06 Python
Python最基本的数据类型以及对元组的介绍
2015/04/14 Python
python搭建虚拟环境的步骤详解
2016/09/27 Python
python3设计模式之简单工厂模式
2017/10/17 Python
Python使用selenium实现网页用户名 密码 验证码自动登录功能
2018/05/16 Python
python-opencv 将连续图片写成视频格式的方法
2019/01/08 Python
PYQT5设置textEdit自动滚屏的方法
2019/06/14 Python
python实现按行分割文件
2019/07/22 Python
Django密码存储策略分析
2020/01/09 Python
Python内置函数locals和globals对比
2020/04/28 Python
keras.utils.to_categorical和one hot格式解析
2020/07/02 Python
意大利在线高尔夫商店:Online Golf
2021/03/09 全球购物
上级检查欢迎词
2014/01/18 职场文书
工程材料采购方案
2014/05/18 职场文书
广播体操口号
2014/06/18 职场文书
机电一体化专业毕业生自荐信
2014/06/19 职场文书
SQL中的三种去重方法小结
2021/11/01 SQL Server