You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Python调用WhatsApp Cloud API发图片遇400错误求助

如何通过Python调用WhatsApp Cloud API发送图片并解决400错误

问题概述

要通过WhatsApp Cloud API发送图片,流程分为两步:

  1. 将图片上传至Meta平台并获取媒体ID
  2. 使用该媒体ID发送图片

但执行发送代码时收到400响应,错误信息为:

{"error":{"message":"(#100) Param image must be a JSON object.","type":"OAuthException","code":100,"fbtrace_id":"A64oeOdpaY7e7WjoPChkcfz"}}

错误原因分析

发送请求时的核心问题:

  • 请求头已指定Content-type: application/json,但使用requests.post的data参数传递字典数据时,requests会默认将其编码为application/x-www-form-urlencoded格式,而非API要求的JSON格式,导致Meta服务器无法正确解析image字段。

另外还有两个潜在问题:

  1. 上传图片时,代码中指定的type为image/png,但实际上传的是filename.jpeg(MIME类型为image/jpeg),类型不匹配可能导致后续调用异常。
  2. 验证图片上传的代码中使用了POST请求获取媒体信息,正确的方式应该用GET请求。

修正后的代码

1. 图片上传代码(修正类型匹配问题)

import requests

url = f"https://graph.facebook.com/v15.0/{config_WA['PHONE_NUMBER_ID']}/media"
headers = {'Authorization': 'Bearer ' + config_WA['ACCESS_TOKEN']}
files = {
    'file': ('filename.jpeg', open('filename.jpeg', 'rb'), 'image/jpeg', {'Expires': '0'}),
}

# 上传时type与文件MIME类型保持一致
upload_media = requests.post(
    url, 
    data={
        'messaging_product': 'whatsapp', 
        'type': 'image/jpeg',  # 修正为jpeg类型
    },
    files=files,
    headers=headers
)

# 获取上传后的媒体ID
media_id = upload_media.json().get('id')

2. 验证图片上传的代码(修正请求方式)

# 获取媒体信息用GET请求
url = f'https://graph.facebook.com/v20.0/{media_id}/'
response = requests.get(url, headers=headers)
media_info = response.json()

# 获取图片二进制内容
image_response = requests.get(media_info['url'], headers=headers)
print(image_response.content)

3. 图片发送代码(修正JSON传递方式)

url = f"https://graph.facebook.com/v17.0/{config_WA['PHONE_NUMBER_ID']}/messages"
headers = {
    "Content-type": "application/json",
    'Authorization': 'Bearer ' + config_WA['ACCESS_TOKEN']
}

data = {
  "messaging_product": "whatsapp",
  "recipient_type": "individual",
  "to": "+5521972832146",
  "type": "image",
  "image": {
    "id": media_id,
    "caption": "The best succulent ever?"
  }
}

# 使用json参数传递数据,requests会自动序列化为JSON格式
send_media = requests.post(
    url, 
    json=data,  # 替换data=data为json=data
    headers=headers
)

# 打印响应信息排查问题
print(send_media.status_code)
print(send_media.text)

关键说明

  • 使用requests.post的json参数传递字典,会自动将其转为JSON字符串,并确保请求格式符合API要求。
  • 上传媒体时,type参数必须与上传文件的MIME类型完全匹配,否则可能导致媒体ID无法正常使用。
  • 获取媒体信息需使用GET请求,而非POST请求,否则无法正确获取媒体资源地址。

内容的提问来源于stack exchange,提问作者Fabio Castro

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 12:53:19