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实现TCP服务器端与客户端的方法详解
Apr 30 Python
python解决Fedora解压zip时中文乱码的方法
Sep 18 Python
Python计算一个给定时间点前一个月和后一个月第一天的方法
May 29 Python
python实现定时压缩指定文件夹发送邮件
Dec 22 Python
Python变量访问权限控制详解
Jun 29 Python
Python反爬虫伪装浏览器进行爬虫
Feb 28 Python
解决python中import文件夹下面py文件报错问题
Jun 01 Python
python报错: 'list' object has no attribute 'shape'的解决
Jul 15 Python
如何用python 操作zookeeper
Dec 28 Python
详解Django的MVT设计模式
Apr 29 Python
Python 线程池模块之多线程操作代码
May 20 Python
Python面向对象之内置函数相关知识总结
Jun 24 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截取字符串长度函数
2015/10/29 PHP
Laravel 框架控制器 Controller原理与用法实例分析
2020/04/14 PHP
Javascript miscellanea -display data real time, using window.status
2007/01/09 Javascript
非常漂亮的JS+CSS图片幻灯切换特效
2013/11/20 Javascript
自己动手实现jQuery Callbacks完整功能代码详解
2013/11/25 Javascript
node.js中的http.request.end方法使用说明
2014/12/10 Javascript
node.js中的fs.realpathSync方法使用说明
2014/12/16 Javascript
jQuery中hide()方法用法实例
2014/12/24 Javascript
原生js实现图片层叠轮播切换效果
2016/02/02 Javascript
Bootstrap项目实战之首页内容介绍(全)
2016/04/25 Javascript
使用Web Uploader实现多文件上传
2016/06/08 Javascript
js select实现省市区联动选择
2020/04/17 Javascript
AngularJS入门教程之过滤器用法示例
2016/11/02 Javascript
基于Vue实现timepicker
2017/04/25 Javascript
Node中使用ES6语法的基础教程
2018/01/05 Javascript
基于$.ajax()方法从服务器获取json数据的几种方式总结
2018/01/31 Javascript
VUE中使用MUI方法
2019/02/12 Javascript
vue实现图片预览组件封装与使用
2019/07/13 Javascript
浅谈vue限制文本框输入数字的正确姿势
2019/09/02 Javascript
Javascript 关于基本类型和引用类型的个人理解
2019/11/01 Javascript
基于JS实现table导出Excel并保留样式
2020/05/19 Javascript
jQuery实现可以计算进制转换的计算器
2020/10/19 jQuery
Python编写检测数据库SA用户的方法
2014/07/11 Python
python显示生日是星期几的方法
2015/05/27 Python
Python程序员面试题 你必须提前准备!
2018/01/16 Python
Python中SQLite如何使用
2020/05/27 Python
Expedia印度:您的一站式在线旅游网站
2017/08/24 全球购物
狗狗玩具、零食和咀嚼物的月度送货服务:Super Chewer
2018/08/22 全球购物
马来西亚最大的在线隐形眼镜商店:MrLens
2019/03/27 全球购物
应届生.NET方向面试题
2015/05/23 面试题
化学系大学生自荐信范文
2014/03/01 职场文书
本科生导师推荐信范文
2014/05/18 职场文书
500字作文之周记
2019/12/13 职场文书
Python列表的索引与切片
2022/04/07 Python
JS实现简单九宫格抽奖
2022/06/28 Javascript
如何用H5实现好玩的2048小游戏
2022/07/23 HTML / CSS