调用钉钉群机器人发送消息

1.普通调用钉钉机器人发消息

1)发送文本消息

# 用于发送http请求和处理json数据的库
import requests
import json


# 发送钉钉消息函数:text是要发送的文本信息,at_mobiles用于指定@的人
def send_message_to_dingtalk(text, at_mobiles=None):
    # 钉钉机器人的webhook
    webhook_url = "机器人的webhook"
    # 请求头信息
    headers = {'Content-Type': 'application/json'}
    # 要发送的内容
    data = {
        # 发送消息的类型:文本
        "msgtype": "text",
        # 消息的具体内容
        "text": {
            "content": text  # 消息的具体内容
        },
        # @的人列表
        "at": {
            "atMobiles": at_mobiles,  # @的手机号列表
            "isAtAll": False  # 是否@所有人
        }
    }
    # 用request发送POST请求。(机器人webhook、请求头、请求数据[请求数据需要转成json格式字符串])
    response = requests.post(webhook_url, headers=headers, data=json.dumps(data))
    # 根据响应状态码判断是否成功
    if response.status_code == 200:
        print("消息发送成功")
    else:
        print("消息发送失败")


# 调用函数发送消息
message_text = "发送的文本消息,没有@任何人"
# at_mobiles = ["手机号1", "手机号2"]  # 需要@的成员手机号,可选参数,如果不需要@任何成员,可以设置为None或空列表[]
at_mobiles = []
send_message_to_dingtalk(message_text, at_mobiles)

2)发送excel文件消息

注意钉钉自定义机器人是无法发送文件的,自定义机器人主要用于发送文本消息、链接、Markdown 格式的消息、整体跳转等功能,但不支持直接发送文件。
如果要发送文件消息则可以考虑:

1.将文件上传到云存储服务(如阿里云OSS、腾讯云 COS等),并在钉钉消息中提供文件的下载链接,让接收者通过链接下载文件。
2.使用其他钉钉的消息类型,例如图片消息、图文消息等,将文件内容转换为对应类型的消息进行发送。
3.开发自定义应用,使用钉钉开放平台的文件上传接口和消息发送接口进行文件上传和发送操作。

第一种方案是较为常见和简便的方式,适用于大部分场景。
第二种方案需要将文件内容转换为对应消息类型的格式,可能需要一定的处理和解析工作。
第三种方案需要进行开发和集成,适用于需要更高度定制和复杂功能的场景。

  • 演示如何通过阿里云 OSS 存储文件并发送钉钉消息包含下载链接

1.首先,确保你有一个可用的阿里云OSS 账户,并已经创建了相应的存储空间(Bucket)。
2.使用阿里云 OSS 的 Python SDK,将文件上传到 OSS。以下是一个简单的示例代码:

import oss2

# 配置阿里云 OSS 的访问信息
access_key_id = 'your_access_key_id'
access_key_secret = 'your_access_key_secret'
endpoint = 'your_oss_endpoint'
bucket_name = 'your_bucket_name'

# 创建 OSS 客户端
auth = oss2.Auth(access_key_id, access_key_secret)
bucket = oss2.Bucket(auth, endpoint, bucket_name)

# 上传文件
local_file_path = 'path_to_local_file.xlsx'  # 本地文件路径
remote_file_name = 'excel_file.xlsx'  # OSS 上的文件名
bucket.put_object_from_file(remote_file_name, local_file_path)

"""
请将 your_access_key_id、your_access_key_secret、your_oss_endpoint、your_bucket_name、path_to_local_file.xlsx 和 excel_file.xlsx 替换为实际的阿里云 OSS 访问信息和文件路径。
"""

3.发送钉钉消息时,包含文件的下载链接

import requests
import json

def send_message_with_file_link_to_dingtalk(file_name, file_url, access_token):
    webhook_url = f"https://oapi.dingtalk.com/robot/send?access_token={access_token}"

    message_text = f"Hello, 这是一个文件的下载链接:[{file_name}]({file_url})"

    headers = {'Content-Type': 'application/json'}
    data = {
        "msgtype": "markdown",
        "markdown": {
            "title": "文件下载",
            "text": message_text
        }
    }

    response = requests.post(webhook_url, headers=headers, data=json.dumps(data))

    if response.status_code == 200:
        print("消息发送成功")
    else:
        print("消息发送失败")

# 调用函数发送消息
file_name = "日良率分析.xlsx"  # 文件名
file_url = f"https://{bucket_name}.{endpoint}/{remote_file_name}"  # 文件的下载链接
access_token = "your_access_token"
send_message_with_file_link_to_dingtalk(file_name, file_url, access_token)

"""
请将 file_name、file_url、your_access_token 替换为实际的文件名、文件的下载链接和钉钉机器人的访问令牌。
"""

上述段代码通过 Markdown 格式的消息,在钉钉消息中展示文件的下载链接。当接收者点击链接时,将会下载对应的文件。

2.APScheduler定时任务调用钉钉机器人发消息

# 导入发送http请求、json、APScheduler的BlockingScheduler阻塞调度器
import requests
import json
from apscheduler.schedulers.blocking import BlockingScheduler


# 发送钉钉消息函数:text是要发送的文本信息,at_mobiles用于指定@的人
def send_message_to_dingtalk(text, at_mobiles=None):
    # 钉钉机器人的webhook
    webhook_url = "https://oapi.dingtalk.com/robot/send?access_token=12b899122360eac0b611d44bc5f39ab8b9dba9764e6186ad3a8474a74d1cd1d9"
    # 请求头信息:告诉钉钉机器人要发的是json格式数据,因为钉钉机器人只能接收json格式数据来传输和解析
    headers = {'Content-Type': 'application/json'}
    # 要发送的内容
    data = {
        # 发送消息的类型:文本
        "msgtype": "text",
        # 消息的具体内容
        "text": {
            "content": text  # 消息的具体内容
        },
        # @的人列表
        "at": {
            "atMobiles": at_mobiles,  # @的手机号列表
            "isAtAll": False  # 是否@所有人
        }
    }
    # 用request发送POST请求。(机器人webhook、请求头、请求数据[请求数据需要转成json格式字符串])
    response = requests.post(webhook_url, headers=headers, data=json.dumps(data))
    # 根据响应状态码判断是否成功
    if response.status_code == 200:
        print("消息发送成功")
    else:
        print("消息发送失败")


message_text = "发送的文本消息,没有@任何人,注意关键词如:日良率"
# at_mobiles = ["手机号1", "手机号2"]  # 需要@的成员手机号,可选参数,如果不需要@任何成员,可以设置为None或空列表[]
at_mobiles = []

# 用APScheduler的BlockingScheduler阻塞调度器创建实例
scheduler = BlockingScheduler()
# 用add_job(要执行的函数,触发器类型[],时间参数,args)向调度器添加任务
scheduler.add_job(send_message_to_dingtalk, 'interval', minutes=0.5, args=(message_text, at_mobiles))
"""
触发器类型:
    interval,按照时间间隔触发任务,如minutes=2 每隔两分钟触发一次
    Cron,按照Cron表达式触发任务,如day_of_week='mon-fri', hour=9, minute=30 每个工作日的9:30触发
                               如hour=9 每天早上9点触发
    date,在特定日期和时间触发任务,如run_date=datetime(2023, 6, 1, 10, 30) 在2023年6月1日10:30触发
时间参数:
    hours时,minutes分,seconds秒
args:
    前面函数要的参数
"""
scheduler.start()

posted @ 2023-06-02 21:01  oreox  阅读(644)  评论(0)    收藏  举报