调用钉钉接口实现机器人推送消息

0 内容简介

​ 钉钉群机器人是一个高级扩展功能,只要有一个钉钉账号,就可以使用它。它可以将第三方信息聚合到钉钉群中,实现信息自动同步。支持Webhook协议的自定义接入,通过发明者量化机器人,将提醒、报警等信息聚合到钉钉群中。支持文本(text)、链接(link)、markdown三种消息格式,五种消息类型。同一条信息还可以同时发送至多个钉钉群。

​ 本篇通过调用钉钉群接口实现机器人推送消息,以文本(text)消息格式为实例进行开发,功能实现:从RDS(MySQL)数据库中读取需求消息,并配置时间调度,如一天内需求范围内每10分钟读取一次数据库信息,并发送至钉钉群内的指定接收人。
文章借鉴:https://zhuanlan.zhihu.com/p/244858570

​ 【操作流程】:钉钉群设置 --> 创建自定义机器人 --> API开发

1 钉钉群设置

​ 首先,创建钉钉群。我们以PC端钉钉为例,首先点击左上方“+”号发起群聊,如果只想自己接受消息,可以随便拉两个人再踢出去,填写群名称:如“WebHook_机器人”,群类型选择普通群即可。
在这里插入图片描述

2 创建自定机器人

​ 钉钉群每创建一个自定义机器人都会产生唯一的Hook地址,我们称为WebHook地址,通过向该WebHook地址推送消息,钉钉群就会收到消息。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3 API开发

调用钉钉接口实现机器人推送消息,这里使用Python-3.10.3进行代码实现,代码整体由三个对象类组成:

  • OperateMysql:RDS(MySQL)数据库对象类
  • My_WHRobot:钉钉自定义机器人对象类
  • main:时间调度与执行主类
3.1 RDS(MySQL)数据库对象类
import pymysql

# 类对象一: 数据库连接与增删改查
class OperateMysql:

    # 数据库连接与操作模块
    def __init__(self):
        # 创建一个连接数据库的对象
        self.conn = pymysql.connect(
            host='rm-...mysql.rds.aliyuncs.com',  # 连接的数据库服务器主机名
            port=3310,  # 数据库端口号
            user='root',  # 数据库登录用户名
            passwd='*******',
            db='database',  # 数据库名称
            charset='utf8'  # 连接编码
        )
        # 使用cursor()方法创建一个游标对象,用于操作数据库
        self.cur = self.conn.cursor()

    # 查询一条数据
    def search_one(self, sql):
        self.cur.execute(sql)
        # result = self.cur.fetchone()   # 使用 fetchone()方法获取单条数据.只显示一行结果
        result = self.cur.fetchall()  # 显示所有结果
        return result

    # 更新SQL
    def updata_one(self, sql):
        try:
            self.cur.execute(sql)  # 执行sql
            self.conn.commit()  # 增删改操作完数据库后,需要执行提交操作
        except:
            # 发生错误时回滚
            self.conn.rollback()
        self.conn.close()  # 记得关闭数据库连接

    # 插入SQL
    def insert_one(self, sql):
        try:
            self.cur.execute(sql)  # 执行sql
            self.conn.commit()  # 增删改操作完数据库后,需要执行提交操作
        except:
            # 发生错误时回滚
            self.conn.rollback()
        self.conn.close()

    # 删除sql
    def delete_one(self, sql):
        try:
            self.cur.execute(sql)  # 执行sql
            self.conn.commit()  # 增删改操作完数据库后,需要执行提交操作
        except:
            # 发生错误时回滚
            self.conn.rollback()
        self.conn.close()
3.2 钉钉自定义机器人对象类
import json
import requests

# 类对象二: 钉钉机器人API的调度
class My_WHRobot:

    # 钉钉机器人消息API
    def msg(self, text):
        headers = {'Content-Type': 'application/json;charset=utf-8'}
        # 只需更改这一项,将双引号内容替换为刚才复制的Webhook地址
        token = "***********************************"
        api_url = f"https://oapi.dingtalk.com/robot/send?access_token={token}"
        json_text = {
            "msgtype": "text",
            "at": {
                "atMobiles": [
                    "177*****620"
                ],
                "isAtAll": False  # false : 仅仅@ "at" 对应的的人
            },
            "text": {
                "content": "123:" + text
            }
        }
        print(requests.post(api_url, json.dumps(json_text), headers=headers).content)
3.3 时间调度与执行主类
import schedule
from datetime import time
from OperateMysql import *
from My_WHRobot import *

# 类对象继承三: 钉钉机器人API的调度
class Schedule_Robot(OperateMysql, My_WHRobot):

    # 钉钉机器人消息API调度
    def main(self, sql):

        robot_mysql = OperateMysql()     # 启动Mysql对象类
        robot_webhook = My_WHRobot()     # 启动My_WHRobot对象类

        res = robot_mysql.search_one(sql)
        # tuple结果转换成text的过程代码
        arr = '每2分钟更新 \n'
        for row in res:
            ROW = map(str, row)  # 把每条记录row中的元素map成str类型
            unit = '  '.join(ROW)  # 每条记录.join()拼接成长string
            arr = arr + unit + '\n'  # 把每条记录拼接成text
        print(arr)
        # 创建时间调度器-周期调度,设置调度周期、调度结束时间
        schedule.every(60*2).seconds.until(time(22, 52, 59)).do(robot_webhook.msg, text=arr) 
        # 今天 21:59:59 停止
        while True:
            schedule.run_pending()

# 运行
if __name__ == '__main__':

    sql = "SELECT" \
          " e.empno as 员工号, " \
          " e.ename as 员工姓名, " \
          " d.dname as 部门 " \
          "from emp e left join dept d " \
          "on e.deptno = d.deptno " \
          "limit 4 " \
          ";"
    myrobot = Schedule_Robot()
    myrobot.main(sql)
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐