在FastAPI中接收微信机器人发送的图片文件
微信机器人webhook项目提供了一个便捷的方式来接收微信机器人发送的各种消息类型,包括文本、图片、文件等。本文将重点介绍如何在FastAPI框架中正确处理微信机器人发送的图片文件。
消息接收基础
微信机器人webhook通过HTTP POST请求发送消息到开发者配置的回调地址。所有消息都以表单(form-data)格式发送,包含以下几个关键字段:
- type: 消息类型,如"text"表示文本消息,"file"表示文件消息
- content: 消息内容,对于文件消息,这是一个文件对象
- source: 消息来源信息,包含发送者等元数据
FastAPI实现方案
在FastAPI中接收这种表单数据,需要使用Form和UploadFile等工具。以下是完整的实现代码示例:
from fastapi import FastAPI, Form, UploadFile
from pydantic import BaseModel
from typing import Union, Optional
import json
app = FastAPI()
# 定义消息负载模型
class Payload(BaseModel):
type: str
content: Union[str, UploadFile] = None
source: Optional[str] = None
isMentioned: Optional[str] = None
isMsgFromSelf: Optional[str] = None
@app.post("/receive_msg")
async def receive_message(payload: Payload = Form()):
print(payload)
message_type = payload.type
if message_type == 'file':
# 获取文件名
filename = payload.content.filename
# 解析发送者信息
sender_info = json.loads(payload.source)
sender_name = sender_info['from']['payload']['name']
# 读取并保存文件
file_content = await payload.content.read()
with open(filename, 'wb') as f:
f.write(file_content)
return {"status": "success", "filename": filename}
关键点解析
-
表单数据处理:使用
Form()声明参数表示从表单中获取数据 -
文件上传处理:对于文件类型消息,content字段实际上是
UploadFile对象,提供了方便的接口处理文件上传 -
类型处理:使用Union类型注解表示content字段可能是字符串或文件对象
-
异步处理:使用async/await处理文件读取等IO操作,提高性能
实际应用建议
-
文件存储:在实际应用中,建议将上传的文件存储在专门的目录中,而不是项目根目录
-
文件名处理:考虑对文件名进行安全处理,防止路径遍历攻击
-
文件大小限制:可以配置FastAPI限制上传文件的最大大小
-
错误处理:添加适当的错误处理逻辑,处理文件读写异常等情况
通过以上实现,开发者可以轻松地在FastAPI应用中接收并处理微信机器人发送的各种类型消息,特别是图片和文件类型的消息。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



