Flask轻松构建钉钉接口模版,实现自动化流程优化

news2025/1/23 3:24:52

项目背景

随着钉钉应用的不断普及和企业数字化程度的提高,越来越多的企业需要开发钉钉接口来完成内部业务流程的自动化和优化。而Flask框架,则是一个轻量级的Python web框架,具有快速开发和灵活性的优势,是钉钉接口开发的理想选择。

简介

本博客将介绍如何使用Flask框架开发钉钉接口模版。通过本篇博客的学习,您将能够实现企业自定义机器人(Custom Bot)的基本功能,包括接收和发送消息,回复消息模版等。同时,我们也会提供完整的代码和相关技术文档,方便您在实际工作中快速实现自己的钉钉接口需求。

大致流程

环境搭建:安装Flask和钉钉SDK,并进行配置。
接口开发:编写接收和处理钉钉请求的API,并进行路由配置。
消息处理:解析钉钉请求的消息体,进行自定义消息的构建和发送。
模版回复:使用Jinja2模版引擎生成回复消息,并返回给钉钉服务端。
运行测试:运行Flask应用,并使用Postman等工具进行测试和调试。
以上仅是大致流程,具体实现步骤和技术细节会在博客中逐一详解。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

步骤流程

1、项目依赖

requirements.txt

certifi==2023.5.7
charset-normalizer==3.1.0
click==8.1.3
colorama==0.4.6
DingtalkChatbot==1.5.7
docopt==0.6.2
Flask==2.2.5
idna==3.4
importlib-metadata==6.6.0
itsdangerous==2.1.2
Jinja2==3.1.2
MarkupSafe==2.1.2
pipreqs==0.4.13
requests==2.30.0
typing_extensions==4.5.0
urllib3==1.26.5
Werkzeug==2.2.3
yarg==0.1.9
zipp==3.15.0

2、工具类

utils/send_ding.py

# -*- coding: utf-8 -*-
# @Time    : 2023/5/13 19:16
# @Author  : 南宫乘风
# @Email   : 1794748404@qq.com
# @File    : send_ding.py
# @Software: PyCharm
# -*- coding: utf-8 -*-
# @Time    : 2023/5/13 13:44
# @Author  : 南宫乘风
# @Email   : 1794748404@qq.com
# @File    : send_dingding.py
# @Software: PyCharm
"""
发送钉钉的api接口消息验证
"""

# https://oapi.dingtalk.com/robot/send?access_token=xxx

# 加密 xxxx


import time
import hmac
import hashlib
import base64
import urllib.parse

import requests

secret = 'xxxx 加密秘钥'
secret_enc = secret.encode('utf-8')
access_token = 'token'


def generate_timestamp():
    """获取当前时间戳"""
    return str(round(time.time() * 1000))


def generate_sign(secret_enc, timestamp):
    """生成签名"""
    string_to_sign = '{}\n{}'.format(timestamp, secret)
    string_to_sign_enc = string_to_sign.encode('utf-8')
    hmac_code = hmac.new(secret_enc, string_to_sign_enc, digestmod=hashlib.sha256).digest()
    sign = urllib.parse.quote_plus(base64.b64encode(hmac_code))
    return sign


def main():
    timestamp = generate_timestamp()
    sign = generate_sign(secret_enc, timestamp)

    # 构造请求 URL
    url = 'https://oapi.dingtalk.com/robot/send?access_token={}&timestamp={}&sign={}'.format(access_token, timestamp,
                                                                                             sign)
    content = 'Hello, World!'
    # 构造请求 headers 和 body
    headers = {'Content-Type': 'application/json'}
    payload = {'msgtype': 'text', 'text': {'content': content}}
    # 发送请求并返回响应结果
    response = requests.post(url, json=payload, headers=headers)
    print(response.text)


if __name__ == '__main__':
    main()




在这里插入图片描述

3、Flask接口

# -*- coding: utf-8 -*-
# @Time    : 2023/5/13 19:15
# @Author  : 南宫乘风
# @Email   : 1794748404@qq.com
# @File    : app.py
# @Software: PyCharm
import datetime
import json
from time import strftime
from utils.send_ding import access_token, generate_timestamp, generate_sign, secret_enc
from dingtalkchatbot.chatbot import DingtalkChatbot
import datetime
from flask import Flask, render_template, request, jsonify

app = Flask(__name__)


def generate_text_info(url, title, context, author):
    t = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
    text = ('''<font color=\'#008000\'><b>[巡检]</b> </font><b>每天巡检</b>'''
            + '''\n\n --- \n\n'''
            + '''<font color=\'#708090\' size=2><b>详情:</b>   [点击查看详情](%s)</font> \n\n '''
            + '''<font color=\'#778899\' size=2><b>巡检标题:</b> %s</font> \n\n '''
            + '''<font color=\'#708090\' size=2><b>巡检类容:</b> %s</font> \n\n '''
            + '''<font color=\'#708090\' size=2><b>相关人员:</b> %s</font>'''
            + '''\n\n --- \n\n'''
            + '''<b>播报时间:</b> %s''') % (url, title, context, author, t)
    return text


def generate_text_error(url, title, context, author):
    t = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
    text = ('''<font color=\'#FF0000\'><b>[巡检]</b> </font><b>每天巡检异常</b>'''
            + '''\n\n --- \n\n'''
            + '''<font color=\'#708090\' size=2><b>详情:</b>   [点击查看详情](%s)</font> \n\n '''
            + '''<font color=\'#778899\' size=2><b>巡检标题:</b> %s</font> \n\n '''
            + '''<font color=\'#708090\' size=2><b>巡检类容:</b> %s</font> \n\n '''
            + '''<font color=\'#708090\' size=2><b>相关人员:</b> %s</font>'''
            + '''\n\n --- \n\n'''
            + '''<b>播报时间:</b> %s''') % (url, title, context, author, t)
    return text


def send_dingtalk_msg(title, wehook, text):
    ddrobot = DingtalkChatbot(wehook)
    ret = ddrobot.send_markdown(title, text=text, is_at_all=False)
    return ret


def dingtalk_robot(url, title, content, author, level):
    timestamp = generate_timestamp()
    sign = generate_sign(secret_enc, timestamp)
    # 构造请求 URL
    wehook = 'https://oapi.dingtalk.com/robot/send?access_token={}&timestamp={}&sign={}'.format(access_token, timestamp,
                                                                                                sign)
    # wehook = 'https://oapi.dingtalk.com/robot/send?access_token=paste_your_token_from_dingtalk'
    if level == "info":
        text = generate_text_info(url, title, content, author)
    else:
        text = generate_text_error(url, title, content, author)
    result = send_dingtalk_msg(title, wehook, text)
    return result


message = {
    'msg': '请按照上面格式 post 请求参数(source(认证) title(标题) content(内容) 必选参数)',
    'data': {'source': 'heian', 'title': 'rds日志拉去', 'content': 'rds日志拉去正常',
             'level': 'info|error (默认: info)',
             'author': '南宫乘风(默认: 巡检机器人)'}
}


@app.route('/ding/send', methods=['POST', "GET"])
def send():
    if request.method == 'GET':

        return jsonify(message)
    else:
        json_data = request.get_json()
        source = json_data.get('source')
        title = json_data.get('title')
        content = json_data.get('content')
        level = json_data.get('level', 'info')
        author = json_data.get('author', '巡检机器人')
        if not source or not title or not content:
            return jsonify(message)
        if source != 'heian':
            return "认证失败,请联系运维人员!"
        else:
            # 在这里处理传入的参数
            url = 'http://127.0.0.1:5000/'
            result = dingtalk_robot(url, title, content, author, level)
            # print(result)
            if result['errcode'] == 0:
                print('消息发送成功!')
                return "消息发送成功!"
            else:
                print('消息发送失败:', result['errmsg'])
                return f"消息发送失败, {result['errmsg']}"


if __name__ == '__main__':
    app.run(debug=True)

项目测试

1、启动Flask

在这里插入图片描述

2、访问接口

http://127.0.0.1:5000/ding/send

GET请求

POST请求
参数:

{
"author": "南宫乘风(默认: 巡检机器人)",
"content": "rds日志拉去正常",
"level": "info|error (默认: info)",
"source": "heian",
"title": "rds日志拉去"
}

在这里插入图片描述
在这里插入图片描述
传入JSON数据不对
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/522004.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

python去重列表中相同的字典元素

python去重列表中相同的字典元素 文章目录 python去重列表中相同的字典元素一.知识点二.代码|代码1|问题 |代码2 三.分析总结1、分析2、总结 四.后续代码知识点代码流程问题总结总结 一.知识点 ​ data_list [{“a”: 1, “b”: 2}, {“a”: 2, “b”: 3}, {“a”: 1, “b”:…

华为OD机试真题 Java 实现【相同数字的积木游戏1】【2023Q2 100分】

一、题目描述 小华和小薇一起通过玩积木游戏学习数学。 他们有很多积木&#xff0c;每个积木块上都有一个数字&#xff0c;积木块上的数字可能相同。 小华随机拿一些积木挨着排成一排&#xff0c;请小薇找到这排积木中数字相同且所处位置最远的2块积木块&#xff0c;计算他们…

【C++】——string的模拟实现

前言&#xff1a; 在之前的学习中&#xff0c;我们已经对string类进行了简单的介绍&#xff0c;大家只要能够正常使用即可。但是在面试中&#xff0c;面试官总喜欢让学生自己 来模拟实现string类&#xff0c;最主要是实现string类的构造、拷贝构造、赋值运算符重载以及析构函数…

lightroom磨皮滤镜中文插件Portraiture4最新版本

哈喽&#xff01;小伙伴们&#xff01;整个摄影后期行业都在用Portraiture&#xff0c;这是一个被奉为高级磨皮面板&#xff0c;修图神器、修图的的扩展面板&#xff01;Portraiture这款磨皮插件终于更新啦&#xff01;最近推出了Portraiture4.03版本,新版本光影处理更强大&…

《编程思维与实践》1066.最小不重复数

《编程思维与实践》1066.最小不重复数 题目 思路 一般在oj上循环 2 ⋅ 1 0 9 2\cdot 10^9 2⋅109次以上就会超时,所以由于这题的数据A可以很大,直接循环加一再判断会超时. 优化:首先可以明确要想使不重复数尽可能小,则高位数字应该尽可能小, 即先找到最靠前的两个重复数字,然后…

【Vector VN1630/40 I/O应用】-1-简易示波器

案例背景(共13页精简)&#xff1a;该篇博客将告诉您&#xff1a; Vector VN1630A&#xff0c;VN1640A&#xff0c;VH6501 I/O的使用&#xff1b;将Vector VN1630A/VN1640A CAN/LIN Interface的I/O接口充当一个简易的“示波器”使用&#xff1b;观察“CAN唤醒”工作的ECU控制器…

关于C语言的杂记4

文章目录 数据与程序结构C语言的编程机制#include <>和#include ""的区别形式参数和实际参数值传递地址传递 素数 文章内容摘自或加工于C技能树一些大佬的博文 数据与程序结构 阅读完C的编程机制和函数的声明和定义后的一些启发。——预处理 C语言的编程机制 …

dubbo技术

1、Dubbo的前世今生 2011年10月27日&#xff0c;阿里巴巴开源了自己的SOA服务化治理方案的核心框架Dubbo&#xff0c;服务治理和SOA的设计理念开始逐渐在国内软件行业中落地&#xff0c;并被广泛应用。 早期版本的dubbo遵循SOA的思想&#xff0c;是面向服务架构的重要组件。 …

1708_Simulink中取数组元素

全部学习汇总&#xff1a; GitHub - GreyZhang/g_matlab: MATLAB once used to be my daily tool. After many years when I go back and read my old learning notes I felt maybe I still need it in the future. So, start this repo to keep some of my old learning notes…

【多线程】线程安全问题原因与解决方案

目录 线程安全的概念 线程不安全示例 线程不安全的原因 多个线程修改了同一个变量 线程是抢占式执行的 原子性 内存可见性 有序性 线程不安全解决办法 synchronized 关键字-监视器锁monitor lock synchronized 的特性 互斥 刷新内存 可重入 synchronized 使用示例 Java 标…

【第三章:存储系统】

目录 知识框架No.0 引言No.1 存储器概述No.2 主存储器一、SRAM芯片和DRAM芯片二、只读存储器三、主存储器的基本组成1、基本的半导体元件和原理 知识框架 No.0 引言 这一章节主要是&#xff1a;这些二进制的数据在计算机内部如何存储 在学习这个章节之前&#xff0c;首先把下面…

Mybatis - 基础

文章目录 一、 Mybatis基本介绍二、 Mybatis 快速入门程序2.1 引入Mybatis依赖2.2 准备工作2.3 配置SQL信息2.3.1 IDEA连接数据库2.3.2 打开日志信息 2.4 JDBC 了解2.5 数据库连接池2.5.1 Druid数据库连接池 三、 Mybatis 基础3.1 环境准备3.1.1 数据库表3.1.2 实体类 3.2 基础…

EasyRecovery16中文最新版电脑数据恢复软件下载使用教程

EasyRecovery如果需要使用它来恢复数据&#xff0c;请注意&#xff0c;尤其是当需要恢复的数据文件非常重要时&#xff0c;建议使用软件EasyRecovery以保障数据安全。共有三个版本&#xff0c;分别是个人版、专业版、企业版&#xff0c;这三种都可以免费下载并使用&#xff0c;…

[MySQL]关于MySQL索引的一点点东西

最是人间留不住,朱颜辞镜花辞树. 目录 一.为什么需要索引 1.什么是索引 2.索引的创建原则 二.理解索引 1. MySQL与磁盘交互基本单位 2.索引的结构 a.关于hash索引,B树索引,B树索引的特点 B树 B树 HASH b.为什么使用InnoDB 存储引…

15-721 chapter 13 查询执行

优化的目标 CPU层面 cpu是多级流水线操作&#xff0c;所以我们的目标是让每个处理器的每个部分都处于busy。多条流水线&#xff0c;我们没有依赖的指令可以放到不同的流水线里面。但是流水线如果遇到branch判断错误的话&#xff0c;就要flush掉 可以用值传递来代替跳转 查询执…

Linux开发板安装Python环境

1. 环境介绍 硬件&#xff1a;STM32MP157&#xff0c;使用的是野火出的开发板。 软件&#xff1a;Debian ARM 架构制作的 Linux 发行版&#xff0c;版本信息如下&#xff1a; Linux发行版本&#xff1a;Debian GNU/Linux 10 内核版本&#xff1a;4.19.94 2. Python 简介…

基于常用设计模式的业务框架

前言 做开发也有好几年时间了&#xff0c;最近总结和梳理自己在工作中遇到的一些问题&#xff0c;工作中最容易写出BUG的需求就是改造需求了。一个成熟的业务系统是需要经过无数次迭代而成的&#xff0c;也意味着经过很多开发人员之手&#xff0c;最后到你这里&#xff0c;大部…

每日学术速递5.11

CV - 计算机视觉 | ML - 机器学习 | RL - 强化学习 | NLP 自然语言处理 Subjects: cs.CV 1.Diffusion Explainer: Visual Explanation for Text-to-image Stable Diffusion 标题&#xff1a;扩散解释器&#xff1a;文本到图像稳定扩散的视觉解释 作者&#xff1a;Seongmin…

【数据结构】【算法】二叉树、二叉排序树、树的相关操作

树结构是以分支关系定义的一种层次结构&#xff0c;应用树结构组织起来的数据&#xff0c;逻辑上都具有明显的层次关系。 操作系统中的文件管理系统、网络系统中的域名管理、数据库系统中的索引管理等都使用了树结构来组织和管理数据。 树的基本概念 树Tree是由n个节点组成的有…

数据结构-查找-散列结构(散列表)

目录 *一、散列表 二、散列函数 *除留余数法 *直接定址法 数字分析法 平方取中法 三、冲突处理方法--开发定地法 *3.1线性探测法 *查找效率&#xff1a; *3.2平方探测法 3.3伪随机序列法 3.4再散列法 *一、散列表 又称哈希表&#xff0c;数据元素的关键字与其存储…