部署在PythonAnywhere的Flask+Twilio WhatsApp机器人报11200错误
看起来你遇到的核心问题有两个:一是PythonAnywhere环境无法连接到Twilio API导致的ConnectionError,二是你错误地在client.messages.create()中添加了无效参数引发的TypeError。下面一步步帮你解决:
1. 先修复无效参数的错误
你在create()方法里加的AC84a8b5837227246efc0c6f9440b6e12c='83ce0b901ff353f9b9a77222e001d71d'完全没必要——因为你已经在初始化Client时传入了account_sid和auth_token,Twilio库会自动用这些信息做认证,额外传这个参数只会触发类型错误。把这行删掉,恢复原来的create调用即可。
2. 解决PythonAnywhere无法连接Twilio API的问题
从错误日志看,你的应用无法建立到api.twilio.com的HTTPS连接,这通常是环境配置或依赖版本的问题,按以下步骤排查:
步骤1:确保Flask路由返回响应
你的bot()函数没有返回任何内容,虽然Flask默认会返回200 OK,但Twilio的Webhook明确期望收到一个响应来确认请求已处理。显式返回一个响应能避免Twilio误判请求失败,也有助于调试:
@app.route('/post', methods=['POST']) def bot(): incoming_msg = request.values.get('Body', '').lower() phono = request.values.get('From', "") if incoming_msg == 'hi': mmsg(phono, 'hello!') return 'OK' # 必须添加这行
步骤2:更新Twilio和Requests依赖
旧版本的Twilio库或Requests库可能存在SSL连接或网络适配问题,在PythonAnywhere的控制台中激活你的虚拟环境并更新依赖:
workon my-virtualenv pip install --upgrade twilio requests
步骤3:确认账户信息正确
再次检查你的account_sid和auth_token是否完全正确——复制时不要带多余的空格或换行符,确保和Twilio控制台里的信息一致。
步骤4:验证PythonAnywhere的出站连接
PythonAnywhere免费账户允许连接大部分公共API(包括Twilio的),你可以在控制台用curl测试连接是否正常:
curl https://api.twilio.com/2010-04-01/Accounts.json
如果返回401 Unauthorized,说明连接是通的,只是认证问题(只要你的SID和token正确就没问题);如果连curl都无法连接,可能需要联系PythonAnywhere支持确认网络配置。
修正后的完整代码
from flask import Flask, request from twilio.rest import Client account_sid = 'xxxxx' # 替换为你的真实Account SID auth_token = 'xxxxx' # 替换为你的真实Auth Token client = Client(account_sid, auth_token) def mmsg(phono, body): try: message = client.messages.create( from_='whatsapp:+14155238886', body=body, to=phono, ) print(f"消息发送成功,SID: {message.sid}") # 调试用,可查看PythonAnywhere日志 except Exception as e: print(f"发送失败:{str(e)}") # 捕获异常方便排查 app = Flask(__name__) @app.route('/post', methods=['POST']) def bot(): incoming_msg = request.values.get('Body', '').lower() phono = request.values.get('From', "") if incoming_msg == 'hi': mmsg(phono, 'hello!') return 'OK' if __name__ == '__main__': app.run()
完成以上步骤后,重新部署你的应用到PythonAnywhere,应该就能正常接收和回复WhatsApp消息了。
内容的提问来源于stack exchange,提问作者user13804313

