如何通过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服务器能合法访问该资源。具体步骤:
- 导入
urllib.parse模块编码Auth Token,避免特殊字符破坏URL结构 - 对获取到的
MediaUrl0添加认证信息 - 使用修改后的带认证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.
相关产品推荐
相关产品推荐

