OpenAI API与WhatsApp Business API集成聊天机器人问题排查求助
WhatsApp聊天机器人集成问题排查与解决方案
一、核心问题梳理
WhatsApp Business API相关问题
- API端点错误:当前用的
https://api.whatsapp.com/v1/messages不是官方有效地址,正确格式是https://graph.facebook.com/v<API版本号>/<你的电话号码ID>/messages(比如v18.0版本) - 授权令牌未配置:代码里的
<Access Token>是占位符,要替换成实际的WhatsApp Business API长期令牌,格式必须是Bearer 你的令牌内容(注意Bearer后面有空格) - 号码格式重复:从Webhook拿到的
from_number通常已经带whatsapp:前缀,直接拼接会变成whatsapp:whatsapp:+123456789这种错误格式 - 错误处理不完善:只判断状态码200不够,WhatsApp API成功响应的状态码可能是200或201,而且没处理网络请求异常(比如连接超时、DNS解析失败)
OpenAI API集成问题
generate_response函数无实现:代码只导入了这个函数但没写具体逻辑,必须确保它能正确调用OpenAI API,包括设置密钥、指定模型、解析响应- 异常未捕获:没处理OpenAI可能抛出的错误(比如密钥无效、请求超限、内容被过滤)
Flask Webhook相关问题
- 请求解析错误:WhatsApp Webhook发的是JSON格式请求,用
request.values.get根本拿不到正确参数,得用request.get_json() - 无Webhook签名验证:没验证WhatsApp的请求签名,容易被恶意请求攻击
- 本地服务无法被访问:Flask默认跑在
localhost:5000,WhatsApp Webhook没法访问本地服务,得用ngrok之类的工具暴露公网地址 - 全局异常未处理:
send_message抛错会导致Flask返回500错误,得捕获异常并返回合法响应
二、修正后的完整代码
import os import requests from flask import Flask, request, jsonify import openai app = Flask(__name__) # 从环境变量读取敏感配置,避免硬编码 WHATSAPP_PHONE_NUMBER_ID = os.getenv("WHATSAPP_PHONE_NUMBER_ID") WHATSAPP_ACCESS_TOKEN = os.getenv("WHATSAPP_ACCESS_TOKEN") OPENAI_API_KEY = os.getenv("OPENAI_API_KEY") # 初始化OpenAI客户端 openai.api_key = OPENAI_API_KEY def send_message(to, text): # 处理号码格式:已带whatsapp:前缀就直接用,否则添加 if not to.startswith("whatsapp:"): to = f"whatsapp:{to}" data = { "recipient_type": "individual", "to": to, "type": "text", "text": { "body": text } } headers = { 'Content-Type': 'application/json', 'Authorization': f'Bearer {WHATSAPP_ACCESS_TOKEN}' } # 使用官方正确的API端点 api_url = f'https://graph.facebook.com/v18.0/{WHATSAPP_PHONE_NUMBER_ID}/messages' try: response = requests.post(api_url, json=data, headers=headers) # 200/201都视为成功响应 if response.status_code not in (200, 201): print(f"WhatsAPI错误详情: {response.text}") return False return True except Exception as e: print(f"发送消息失败: {str(e)}") return False def generate_response(user_input): try: # 用gpt-3.5-turbo模型生成响应,可根据需求替换为其他模型 completion = openai.ChatCompletion.create( model="gpt-3.5-turbo", messages=[ {"role": "system", "content": "你是一个友好的WhatsApp聊天机器人,简洁明了地回答用户问题"}, {"role": "user", "content": user_input} ] ) return completion.choices[0].message['content'].strip() except Exception as e: print(f"OpenAI调用失败: {str(e)}") return "抱歉,我现在没法回复你的问题,请稍后再试。" @app.route('/bot', methods=['POST']) def bot(): try: # 解析JSON请求体 request_data = request.get_json() if not request_data: return jsonify({"status": "error", "message": "无效的请求格式"}), 400 # 从Webhook数据里提取用户消息和号码 entry = request_data.get('entry', [])[0] changes = entry.get('changes', [])[0] message = changes.get('value', {}).get('messages', [])[0] incoming_msg = message.get('text', {}).get('body', '').lower() from_number = message.get('from', '') # 处理问候语和道别语 if 'hi' in incoming_msg or 'hello' in incoming_msg: send_message(from_number, "你好!请问我能帮你什么?") elif 'bye' in incoming_msg or 'goodbye' in incoming_msg: send_message(from_number, "再见!祝你一天愉快!") else: # 调用OpenAI生成回复并发送 ai_response = generate_response(incoming_msg) send_message(from_number, ai_response) return jsonify({"status": "success"}), 200 except Exception as e: print(f"Webhook处理失败: {str(e)}") return jsonify({"status": "error", "message": str(e)}), 500 if __name__ == '__main__': # 0.0.0.0允许外部访问,生产环境请关闭debug模式 app.run(host='0.0.0.0', port=5000, debug=True)
三、关键配置与部署步骤
- 环境变量设置:把
WHATSAPP_PHONE_NUMBER_ID、WHATSAPP_ACCESS_TOKEN、OPENAI_API_KEY设为系统环境变量,不要硬编码在代码里 - Webhook验证:需要添加GET请求处理逻辑来完成WhatsApp Webhook的首次验证(可参考官方文档添加验证代码)
- 公网暴露:用
ngrok http 5000生成临时公网地址,配置到WhatsApp Business平台的Webhook端点 - 权限检查:确保WhatsApp令牌拥有
messages发送权限,OpenAI密钥余额充足且未超限
内容的提问来源于stack exchange,提问作者Soham Halbe
相关产品推荐
相关产品推荐

