钉钉群聊机器人发送本地图片解决方案--不用图床版(附源码)
评论
收藏

钉钉群聊机器人发送本地图片解决方案--不用图床版(附源码)

经验分享
南星伯格
2025-01-14 15:32·浏览量:2950
南星伯格
影刀高级开发者
发布于 2025-01-14 15:322950浏览

一、效果展示

二、需求原因

对于钉钉发送本地图片,之前一直使用的是钉钉云盘操作的指令集(感谢驿站大佬~~这次的解决方案也是受了这个解决思路的启发),但是遇到了两个问题

1.需要是群聊管理员

2.需要群聊在钉钉开发者权限下,对于多个企业主体就要多次请求权限

这两个问题使我面对一些已经建立已久的群聊无从下手~于是我想找其他的方案解决这个问题,官方的接口只有在线图片的接口,我学习了钉钉云盘操作,先上传图片到云盘然后发送的操作,感觉也不错,这个解决方案不限制群聊,只要接入群聊机器人都可以控制发送本地图片~~

三、前期准备:

1.开发者后台的appkey和appsercet(可以直接网上找教程,这里就不多数)

参考:获取开发者权限 - 钉钉开放平台

2.目标群聊接入机器人(注意使用sign加密),获取access_token和sign加密值

参考:自定义机器人接入 - 钉钉开放平台

3.其他就是自定义部分 图片的本地路径、消息的标题和文本内容 ,也可以根据需要自己修改内容

四、源码:

import requests
import json
import time
import hmac
import base64
import urllib.parse
import hashlib
import os 
def get_access_token(appkey, appsecret):
"""获取钉钉访问令牌"""
url = "https://oapi.dingtalk.com/gettoken"
params = {
"appkey": appkey,
"appsecret": appsecret
}
response = requests.get(url, params=params)
return response.json()["access_token"] 
def upload_to_dingtalk(file_path, access_token):
"""上传文件到钉盘"""
url = "https://oapi.dingtalk.com/media/upload"
# 获取文件类型
file_type = "image" # 可以是 image、voice、file、video
# 准备文件
files = {
'media': open(file_path, 'rb')
}
# 准备参数
params = {
'access_token': access_token,
'type': file_type
}
# 上传文件
response = requests.post(url, params=params, files=files)
return response.json()["media_id"] 
def send_dingtalk_message(access_token, secret, pic_url, title, message_text, at_all=False):
"""发送钉钉消息"""
try:
# 计算签名
timestamp = str(round(time.time() * 1000))
string_to_sign = f'{timestamp}\n{secret}'
hmac_code = hmac.new(
secret.encode('utf-8'),
string_to_sign.encode('utf-8'),
digestmod=hashlib.sha256
).digest()
sign = urllib.parse.quote_plus(base64.b64encode(hmac_code))
url = f'https://oapi.dingtalk.com/robot/send?access_token={access_token}×tamp={timestamp}&sign={sign}'
headers = {
'Content-Type': 'application/json;charset=utf-8'
}
# 使用 ActionCard 类型
data = {
"msgtype": "actionCard",
"actionCard": {
"title": title,
"text": f"### {message_text}\n\n" + 
f"![]({pic_url})\n\n" +
"请查收",
"btnOrientation": "0",
"singleTitle": "查看大图",
"singleURL": pic_url
},
"at": {
"isAtAll": at_all
}
}
response = requests.post(url, data=json.dumps(data), headers=headers)
return response.json()
except Exception as e:
print(f"发送钉钉消息时出错: {str(e)}")
return {"error": str(e)}
def process_and_send_image(image_path, appkey, appsecret, robot_access_token, robot_secret, title, message_text):
"""完整的处理流程"""
try:
# 1. 获取访问令牌
access_token = get_access_token(appkey, appsecret)
# 2. 上传图片到钉盘
media_id = upload_to_dingtalk(image_path, access_token)
# 3. 发送消息
result = send_dingtalk_message(
access_token=robot_access_token,
secret=robot_secret,
pic_url=media_id,
title=title,
message_text=message_text
)
return result
except Exception as e:
print(f"处理过程出错: {str(e)}")
return {"error": str(e)} 
# 使用示例
if __name__ == "__main__":
# 配置参数
APPKEY = "your_appkey"
APPSECRET = "your_appsecret"
ROBOT_ACCESS_TOKEN = "your_robot_access_token"
ROBOT_SECRET = "your_robot_secret"
IMAGE_PATH = "path/to/your/image.jpg"
# 发送消息
result = process_and_send_image(
image_path=IMAGE_PATH,
appkey=APPKEY,
appsecret=APPSECRET,
robot_access_token=ROBOT_ACCESS_TOKEN,
robot_secret=ROBOT_SECRET,
title="自定义标题",
message_text="自定义消息内容"
)
print("发送结果:", result)


收藏21
全部评论1
最新
发布评论
评论