1. 开通钉钉机器人
image.png需要首先在PC端开通钉钉机器人,打开想要开通的群聊 -> 群设置 -> 智能群助手 -> 添加机器人 -> 自定义
- 对机器人进行设置(主要是安全设置)安全设置建议选择自定义关键字,最多可以设置10个关键字。设置后,消息中至少包含其中1个关键字才可以发送成功。更多关于安全设置请参见钉钉开放平台。
- 复制WebHook连接。
2. 程序说明
2.1 参数说明
# 数据库信息
host = sys.argv[1]
user = sys.argv[2]
passwd = sys.argv[3]
db = sys.argv[4]
# 查询sql
sql = sys.argv[5]
# 钉钉机器人的WebHook
api_url = sys.argv[6]
2.2 功能及设计思路说明
该脚本通过读取配置参数,连接mysql数据库查询表字段,并将结果以Markdown的形式发送到钉钉群
- 效果如下:
2.3 程序代码
#!/usr/bin/python3
# -*- coding: utf-8 -*-
import sys
import pandas as pd
import pymysql
import requests
import time
import json
# 数据库信息
host = sys.argv[1]
user = sys.argv[2]
passwd = sys.argv[3]
db = sys.argv[4]
# 查询sql
sql = sys.argv[5]
# 钉钉机器人的WebHook
api_url = sys.argv[6]
headers = {'Content-Type': 'application/json;charset=utf-8'}
def getData():
text = "# 时间: %s\n" % time.strftime("%Y-%m-%d %X") + "- 数据情况如下:\n"
conn = pymysql.connect(host, user, passwd, db, charset='utf8')
try:
data = pd.read_sql(sql, con=conn)
# 获取查询结果的列名
columns_data = data.columns.values.tolist()
# 拼接要输出表格的表头
for column in columns_data:
text += "| " + column + "\|"
text = text[:-2]
text += "\n" + "|:----" * len(columns_data) + "\n"
# 将表格数据拼接为text
data = data.values.tolist()
for row in data:
for cell in row:
text = text + '|' + str(cell)
text += '\n'
# print(text)
except Exception as e:
print(e)
print("Error: unable to fecth data")
conn.close()
return text
def msg(text):
json_text = {
"msgtype": "markdown",
"markdown": {
"title": "监控告警",
"text": text
}
}
print(requests.post(api_url, json.dumps(json_text), headers=headers).content)
if __name__ == '__main__':
msg(getData())
2.4 不足说明以及改进方法
由于钉钉群显示Markdown时无法用css调整表格宽度,当字段名称及字段值宽度较小的时候,显示效果不是很好,可能造成显示拥挤。如下:
image.png
- 改进方法:
image.png可以在SQL语句查询时设置一个较长的别名显示出来。这样看起来比较清爽一点。
3. 常见错误
- 校验不通过的消息将会发送失败,常见错误如下:
// 消息内容中不包含任何关键词,修改 安全设置->自定义关键词
{
"errcode":310000,
"errmsg":"keywords not in content"
}
// timestamp 无效
{
"errcode":310000,
"errmsg":"invalid timestamp"
}
// 签名不匹配,修改 安全设置->加签
{
"errcode":310000,
"errmsg":"sign not match"
}
// IP地址不在白名单,修改 安全设置->IP地址段
{
"errcode":310000,
"errmsg":"ip X.X.X.X not in whitelist"
}
网友评论