1. 概述
1.1 应用场景
用户上游节点获取到的图片、文件等信息,希望可以推送到企业微信群中。但目前的 消息通知 节点不支持企微群机器人推送附件。
1.2 预期效果
1)企业微信群机器人推送图片:

2)企业微信群机器人推送图文:

3)企业微信群机器人推送文件:

1.3 任务展示
FineDataLink 中的数据处理过程,详情参见:https://demo.finedatalink.com/ 「使用企业微信群机器人推送图文」
注:该工程中只有推送图文的定时任务示例,推送图片和文件的定时任务暂无法提供。
2. 推送图片
2.1 实现思路
根据 消息推送配置说明 文档,推送图片需要的 JSON 为:
注:企微接口要求:图片(base64编码前)最大不能超过2M,支持JPG,PNG格式
{
"msgtype": "image", ----这里是固定写死的
"image": {
"base64": "DATA", ----这里放的是图片内容的base64编码
"md5": "MD5" ----这里是图片内容(base64编码前)的md5值
}
}
1)使用「Python算子」来处理图片信息,获取图片编码前后的数据(该步骤针对:已知的图片是JPG、PNG格式的,如果用户可以直接获取到图片 base64 编码前后的信息,Pyhton 解析的步骤可替换或省略)。
2)使用「JSON生成」算子拼接信息。
3)调用企业微信群机器人,推送图片。
2.2 准备工作
1)方案中需要调用「Python算子」,需要提前准备 Python 环境,详情请参见:Python 算子
2)Python 代码中使用到以下资源,需要确保 Python 环境已安装这些资源:

3)准备好要推送的图片地址,详情请参见:消息推送配置说明
本文示例中,图片放在 FDL 服务器的 /opt 路径下。
2.3 使用 Python 算子处理图片信息
1)新建定时任务,拖入「数据转换」节点,进入「数据转换」节点。
2)拖入 Python 算子,将图片信息编码。如下图所示:
注:本文示例,图片放在 FDL 服务器上,路径为:/opt/6.png,用户根据实际情况替换。
注:图片可存放在文件服务器、共享文件夹、远程服务器中,但需要调整 Python 语句,用户需自行调整。
import base64
import hashlib
import pandas as pd
from tabulate import tabulate
def read_image_and_encode(img_path):
# 打开图片文件并读取内容
with open(img_path, "rb") as f:
img_data = f.read()
# 计算图片内容的MD5值
md5_value = hashlib.md5(img_data).hexdigest()
# 将图片内容转换为base64编码
base64_content = base64.b64encode(img_data).decode("utf-8")
return md5_value, base64_content
# 自定义输出函数
def output(data):
# 使用tabulate格式化输出DataFrame
print(tabulate(data, headers="keys", tablefmt="grid"))
# 示例调用
img_path ="/opt/6.png" # 替换为你的图片路径
md5_value, base64_content = read_image_and_encode(img_path)
# 创建一个DataFrame
data = {
"MD5 Value": [md5_value],
"Base64 Content": [base64_content]
}
df = pd.DataFrame(data)
# 调用自定义的output函数
output = (df) # 确保调用output函数并传递df

3)点击「数据预览」,处理后的数据如下图所示:

2.4 使用 JSON 生成算子拼接图片信息
1)拖入「JSON生成」算子,拼接图片信息,为调用企业微信群机器人接口做准备。

2)点击「数据预览」,效果如下图所示:

2.5 推送图片
拖入「API输出」算子,调用企业微信群机器人,API 填写企业微信群消息通知 webhook 地址。

2.6 效果查看
定时任务运行成功后,企业微信群可看到推送的图片。如下图所示:

3. 推送图文
3.1 实现思路
根据 消息推送配置说明 文档,推送图文需要的 JSON 为:
注:下方参数的说明和限制请参见:消息推送配置说明

注意点:
picurl 必须是公网可访问的 https 地址,它不会像「图片消息(image)」那样支持把本地文件转成 base64 后上传,如果需要上传本地图片,可以把本地图片上传到一个可外链的图床(例如腾讯云 COS、阿里云 OSS、GitHub、Imgur 、路过图床等),拿到 https 直链,再填到 picurl。
实现思路说明:
将图片URL和点击图片要跳转到的地址URL进行处理,再调用接口实现推送效果。
3.2 数据准备
1)新建定时任务,拖入「数据转换」节点,进入「数据转换」节点。
2)拖入 Spark SQL 算子,处理链接。如下图所示:
注:用户根据实际情况替换 SQL 语句中的链接。
select 'https://help.fanruan.com/finedatalink/' as article_url,'https://i.postimg.cc/hGctStjF/mm.jpg' as pic_url

点击「数据预览」,效果如下图所示:

3)拖入 JSON 生成算子,生成调用接口所需数据。
注:用户根据实际情况填写 title、description 参数的值。

点击「数据预览」,效果如下图所示:

3.3 推送图文
拖入「API输出」算子,调用企业微信群机器人,API 填写企业微信群消息通知 webhook 地址。

3.4 效果查看
定时任务运行成功后,企业微信群可看到推送的图片。如下图所示:

4. 推送文件
4.1 实现思路
需要先把附件上传到企微服务器,获取文件 id 之后然后再发送;media_id 是文件 id,需要通过文件上传接口获取。素材上传得到 media_id,该 media_id 仅三天内有效,media_id 只能是对应上传文件的机器人可以使用。
附件上传到企微服务器调用接口说明:
请求方式:POST(HTTPS)
请求地址:https://qyapi.weixin.qq.com/cgi-bin/webhook/upload_media?key=KEY&type=TYPE
| 参数 | 说明 |
|---|---|
| key | 调用接口凭证, 企业微信群机器人 webhook url 中的 key 参数 |
| type | 文件类型,分别有语音(voice)和普通文件(file) |
使用multipart/form-data POST上传文件或语音, 文件标识名为"media" ---企业微信文件上传接口不支持直接通过 JSON 或 XML 格式的 body 来传输文件内容。文件上传需要使用 multipart/form-data 格式来发送请求,所以还需要用到 Python。
调用企微机器人推送文件接口说明:
根据 消息推送配置说明 文档,推送文件需要的 JSON 为:

实现思路说明:
1)使用「Python算子」来获取 media_id。
2)使用「JSON生成」算子拼接信息。
3)调用企业微信群机器人,推送文件。
4.2 准备工作
方案中需要调用「Python算子」,需要提前准备 Python 环境,详情请参见:Python 算子
4.3 使用 Python 算子获取 media_id
1)新建定时任务,拖入「数据转换」节点,进入「数据转换」节点。
2)拖入 Python 算子,获取media_id。如下图所示:
注:upload_media_url 为附件上传到企微服务器接口,具体说明请参见本文 4.1 节内容,需要根据实际情况填写;file_path 为待发送的附件位置,本文示例是放在 FineDataLink 工程所在服务器上,需根据实际情况填写。
import requests
# 文件上传接口地址
upload_media_url = "https://qyapi.weixin.qq.com/cgi-bin/webhook/upload_media?key=968dae75-732f-8ccd-b34d-f98537aaff4b&type=file"
# 文件路径
file_path = "/opt/user.xls"
def upload_file_to_wecom(file_path, upload_url):
"""
上传文件到企业微信并返回media_id
:param file_path: 本地文件路径
:param upload_url: 上传接口URL
:return: media_id (成功时) 或 None (失败时)
"""
try:
with open(file_path, 'rb') as file:
files = {'media': file}
response = requests.post(upload_url, files=files)
response.raise_for_status()
return response.json().get('media_id')
except:
return None
# 调用上传函数并打印media_id
output = (upload_file_to_wecom(file_path, upload_media_url))

3)点击「数据预览」,处理后的数据如下图所示:

4.4 拼接 JSON
1)拖入「JSON生成」算子,拼接 JSON 信息,为调用企业微信群机器人接口做准备。

2)点击「数据预览」,效果如下图所示:

4.5 推送文件
拖入「API输出」算子,调用企业微信群机器人,API 填写企业微信群消息通知 webhook 地址。

4.6 效果查看
定时任务运行成功后,企业微信群可看到推送的文件。如下图所示:

