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实现CET查分的方法
Mar 10 Python
Python中文件操作简明介绍
Apr 13 Python
python中urlparse模块介绍与使用示例
Nov 19 Python
Python matplotlib画图实例之绘制拥有彩条的图表
Dec 28 Python
浅谈Matplotlib简介和pyplot的简单使用——文本标注和箭头
Jan 09 Python
python 递归深度优先搜索与广度优先搜索算法模拟实现
Oct 22 Python
Python获取时间范围内日期列表和周列表的函数
Aug 05 Python
Tensorflow读取并输出已保存模型的权重数值方式
Jan 04 Python
使用已经得到的keras模型识别自己手写的数字方式
Jun 29 Python
python调用摄像头的示例代码
Sep 28 Python
python自动打开浏览器下载zip并提取内容写入excel
Jan 04 Python
Python Django获取URL中的数据详解
Nov 01 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
解析如何去掉CodeIgniter URL中的index.php
2013/06/25 PHP
微信红包随机生成算法php版
2016/07/21 PHP
HTML页面如何象ASP一样接受参数
2007/02/07 Javascript
node.js 一个简单的页面输出实现代码
2012/03/07 Javascript
JavaScript分析、压缩工具JavaScript Analyser
2014/12/31 Javascript
JavaScript通过事件代理高亮显示表格行的方法
2015/05/27 Javascript
基于jQuery实现的双11天猫拆红包抽奖效果
2015/12/01 Javascript
基于jQuery实现点击弹出层实例代码
2016/01/01 Javascript
详解node.js 下载图片的 2 种方式
2018/03/02 Javascript
JS动画定时器知识总结
2018/03/23 Javascript
jQuery常见的遍历DOM操作详解
2018/09/05 jQuery
Js中使用正则表达式验证输入是否有特殊字符
2018/09/07 Javascript
vue3.0 CLI - 2.5 - 了解组件的三维
2018/09/14 Javascript
ES6基础之默认参数值
2019/02/21 Javascript
JavaScript中的垃圾回收与内存泄漏示例详解
2019/05/02 Javascript
webpack 如何解析代码模块路径的实现
2019/09/04 Javascript
vue 封装面包屑组件教程
2020/11/16 Javascript
python字符串加密解密的三种方法分享(base64 win32com)
2014/01/19 Python
Win7上搭建Cocos2d-x 3.1.1开发环境
2014/07/03 Python
Python获取Windows或Linux主机名称通用函数分享
2014/11/22 Python
在Python中处理XML的教程
2015/04/29 Python
python从入门到精通(DAY 1)
2015/12/20 Python
Python实现Smtplib发送带有各种附件的邮件实例
2017/06/05 Python
python 实现selenium断言和验证的方法
2019/02/13 Python
python 随机森林算法及其优化详解
2019/07/11 Python
python+selenium select下拉选择框定位处理方法
2019/08/24 Python
使用matplotlib动态刷新指定曲线实例
2020/04/23 Python
千禧酒店及度假村官方网站:Millennium Hotels and Resorts
2019/05/10 全球购物
Sony C++笔试题
2013/03/10 面试题
财产公证书
2014/04/10 职场文书
乡镇党的群众路线教育实践活动制度建设计划
2014/11/03 职场文书
少先队工作总结2015
2015/05/13 职场文书
2015年高校教师个人工作总结
2015/05/25 职场文书
微信小程序实现聊天室功能
2021/06/14 Javascript
Python中递归以及递归遍历目录详解
2021/10/24 Python
关于Python使用turtle库画任意图的问题
2022/04/01 Python