使用Python requests调用Facebook Send API上传文件报#100附件上传失败错误
问题根因定位
- 文件格式与声明不匹配:代码下载的源文件是PGM二进制位图格式,仅修改文件后缀为
.jpg就作为图片上传,Facebook接口会校验文件头魔数,识别出文件内容不属于标准JPG/PNG等支持的图片类型,直接判定附件无效。 - JSON字段存在无效转义字符:代码里的
recipient和message字段直接复用了网页复制带来的HTML转义字符(比如"、<),没有还原为标准JSON语法,接口无法正常解析参数,会连带触发通用类的上传失败报错。 - recipient字段值存在多余空格:构造的用户ID值开头多了一个无效空格,会导致接收人身份解析失败,部分场景下会关联触发附件上传失败的通用提示。
- 文件MIME类型未显式声明:对应官方curl示例里
filedata=@/tmp/shirt.png;type=image/png的类型指定部分,requests构造请求时没有给文件字段传入对应的MIME类型,仅靠后缀猜测的类型和实际文件不匹配,会进一步提高校验失败概率。 - 文件句柄管理不规范:代码里直接以非上下文管理器的方式打开文件传入请求参数,容易出现文件内容未完全读取就发起网络请求的情况,导致上传的文件流不完整,被接口判定为文件损坏。
- 对应错误码2018047的触发逻辑完全匹配以上场景:该错误代表上传附件格式不支持、文件损坏、文件内容不完整、参数解析失败导致的附件校验异常。
修正后可正常运行的代码示例
import requests # 注意:上传前提前把待传文件转成接口支持的标准格式(比如PNG/JPG),不要直接改后缀 upload_file_path = "本地待上传文件路径.png" target_user_psid = "替换为真实的页面用户PSID" page_access_token = "替换为真实的页面访问令牌" # 构造multipart/form-data请求字段,完全对齐官方curl的参数结构 files = { # recipient字段:使用标准JSON语法,无多余空格、无无效转义字符 'recipient': (None, f'{{"id":"{target_user_psid}"}}'), # message字段:保持JSON格式合法 'message': (None, '{"attachment":{"type":"image", "payload":{"is_reusable":true}}}'), # filedata字段:按顺序传入文件名、打开的文件句柄、文件对应MIME类型,和curl的参数结构完全一致 'filedata': ( "upload_file.png", open(upload_file_path, 'rb'), 'image/png' ), } api_url = "https://graph.facebook.com/v9.0/me/messages" query_params = {"access_token": page_access_token} try: response = requests.post(url=api_url, params=query_params, files=files) print(response.json()) finally: # 请求完成后主动关闭所有打开的文件句柄,避免资源泄漏 for field_value in files.values(): if hasattr(field_value[1], 'close'): field_value[1].close()
上传前校验清单
- 确认PSID是当前关联页面下的有效用户ID,而非其他应用的用户标识
- 确认上传文件大小符合接口限制:图片类附件最大支持25MB,其他类型普通文件最大支持100MB
- 确认文件实际内容为接口支持的格式,没有出现后缀名和实际文件格式不匹配的情况
内容的提问来源于stack exchange,提问作者albinantony143
相关产品推荐
相关产品推荐

