美文网首页大数据 爬虫Python AI Sql
python3调用钉钉机器人读取mysql表的内容并发群通知

python3调用钉钉机器人读取mysql表的内容并发群通知

作者: 文艺小卿年 | 来源:发表于2020-02-07 08:48 被阅读0次

    1. 开通钉钉机器人

    需要首先在PC端开通钉钉机器人,打开想要开通的群聊 -> 群设置 -> 智能群助手 -> 添加机器人 -> 自定义

    image.png
    • 对机器人进行设置(主要是安全设置)安全设置建议选择自定义关键字,最多可以设置10个关键字。设置后,消息中至少包含其中1个关键字才可以发送成功。更多关于安全设置请参见钉钉开放平台
    image.png
    • 复制WebHook连接。
    image.png

    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的形式发送到钉钉群

    • 效果如下:
    image.png

    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
    • 改进方法:

    可以在SQL语句查询时设置一个较长的别名显示出来。这样看起来比较清爽一点。

    image.png

    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"
    }
    
    

    相关文章

      网友评论

        本文标题:python3调用钉钉机器人读取mysql表的内容并发群通知

        本文链接:https://www.haomeiwen.com/subject/lxzpxhtx.html