在FastAPI中接收微信机器人发送的图片文件

在FastAPI中接收微信机器人发送的图片文件

微信机器人webhook项目提供了一个便捷的方式来接收微信机器人发送的各种消息类型,包括文本、图片、文件等。本文将重点介绍如何在FastAPI框架中正确处理微信机器人发送的图片文件。

消息接收基础

微信机器人webhook通过HTTP POST请求发送消息到开发者配置的回调地址。所有消息都以表单(form-data)格式发送,包含以下几个关键字段:

  • type: 消息类型,如"text"表示文本消息,"file"表示文件消息
  • content: 消息内容,对于文件消息,这是一个文件对象
  • source: 消息来源信息,包含发送者等元数据

FastAPI实现方案

在FastAPI中接收这种表单数据,需要使用FormUploadFile等工具。以下是完整的实现代码示例:

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}

关键点解析

  1. 表单数据处理:使用Form()声明参数表示从表单中获取数据

  2. 文件上传处理:对于文件类型消息,content字段实际上是UploadFile对象,提供了方便的接口处理文件上传

  3. 类型处理:使用Union类型注解表示content字段可能是字符串或文件对象

  4. 异步处理:使用async/await处理文件读取等IO操作,提高性能

实际应用建议

  1. 文件存储:在实际应用中,建议将上传的文件存储在专门的目录中,而不是项目根目录

  2. 文件名处理:考虑对文件名进行安全处理,防止路径遍历攻击

  3. 文件大小限制:可以配置FastAPI限制上传文件的最大大小

  4. 错误处理:添加适当的错误处理逻辑,处理文件读写异常等情况

通过以上实现,开发者可以轻松地在FastAPI应用中接收并处理微信机器人发送的各种类型消息,特别是图片和文件类型的消息。

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值