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

如何通过HTTP Basic Auth访问Twilio媒体并转发WhatsApp图片

解决Twilio WhatsApp图片转发的媒体URL认证问题

Twilio在2023年7月实施媒体资源访问强制HTTP Basic Auth后,直接使用请求中获取的MediaUrl0转发图片会失败——因为这个URL不包含认证信息,Twilio服务器无法访问对应的媒体资源。你之前通过Client对象传入的账号凭证是用于你调用Twilio API的认证,和Twilio访问媒体资源的认证是两个独立流程,不会自动应用到media_url上。

修改方案

需要把Twilio Account SID和Auth Token以Basic认证格式嵌入到媒体URL中,让Twilio服务器能合法访问该资源。具体步骤:

  1. 导入urllib.parse模块编码Auth Token,避免特殊字符破坏URL结构
  2. 对获取到的MediaUrl0添加认证信息
  3. 使用修改后的带认证URL作为media_url参数

修改后的完整代码

from flask import Flask, request
from twilio.rest import Client
from twilio.twiml.messaging_response import MessagingResponse
import urllib.parse  # 新增导入

app = Flask(__name__)

# Twilio credentials
account_sid = 'redacted'
auth_token = 'redacted'
client = Client(account_sid, auth_token)

@app.route("/whatsapp", methods=['POST'])
def whatsapp():
    media_msg = request.values.get('NumMedia')

    if int(media_msg) > 0:
        media_url = request.values.get('MediaUrl0')
        # 编码Auth Token,处理特殊字符
        encoded_auth_token = urllib.parse.quote(auth_token)
        # 在媒体URL中嵌入Basic认证信息
        auth_media_url = media_url.replace("https://", f"https://{account_sid}:{encoded_auth_token}@")

        message = client.messages.create(
            body="test",
            from_='whatsapp:+19179949274',
            to=f'whatsapp:+16466737627',
            media_url=[auth_media_url],  # 使用带认证的URL
        )
        print("media message: ", message.sid)

    resp = MessagingResponse()
    msg = resp.message()

    return str(resp)

if __name__ == "__main__":
    app.run(debug=True, port=5001)

关键说明

  • 认证嵌入逻辑:将https://api.twilio.com/...格式的URL修改为https://{account_sid}:{encoded_auth_token}@api.twilio.com/...,Twilio服务器访问时会自动带上Basic认证信息。
  • URL编码:必须对Auth Token做URL编码,因为Token可能包含@、:等特殊字符,直接拼接会导致URL无效。

内容的提问来源于stack exchange,提问作者David A.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 13:55:17