如何正确执行Twilio Studio对话流程?解决重复执行报错
问题分析与解决
错误原因
你遇到的问题核心是每次用户发消息,你的代码都会创建一个新的Studio Flow Execution,但Twilio不允许同一个联系人(用户)同时存在多个活跃的Execution,所以触发了报错。而且你调用.update(status='ended')会直接结束刚创建的Execution,导致用户只能收到第一条消息,后续回复又触发新的创建请求,陷入循环。
简单说:你的代码现在是"每次消息都开新会话",但Twilio要求一个用户只能有一个活跃会话,同时你还把刚开的会话直接关了,自然没法继续对话。
正确的处理逻辑
Twilio Studio的会话(Execution)是可以复用的:当用户和Flow交互时,如果已经有活跃的会话,用户的回复会自动被Twilio路由到这个会话继续执行流程,不需要手动创建新的。所以你的代码只需要在用户没有活跃会话时创建新的Execution,有活跃会话时直接让Twilio自动处理即可。
代码修改步骤
1. 添加查询活跃会话的函数
先写一个函数,用来检查当前用户是否有正在运行的Studio Flow会话:
def get_active_execution(phone_number): # 查询该用户对应的活跃Studio Flow Execution executions = twilio_client.studio.v2.flows(Config.TWILIO_STUDIO_FLOW_SID).executions.list( to=f'whatsapp:{phone_number}', status='active' ) # 返回第一个活跃会话,没有则返回None return executions[0] if executions else None
2. 修复Studio Flow创建函数
去掉多余的.update(status='ended'),不要刚创建就结束会话:
def twilio_studio_flow(phone_number: str): ''' 创建新的Studio Flow Execution(仅当没有活跃会话时调用) ''' twilio_client.studio \ .v2 \ .flows(Config.TWILIO_STUDIO_FLOW_SID) \ .executions \ .create( to=f'whatsapp:{phone_number}', from_=Config.TWILIO_PHONE_NUMBER, parameters={ "appointment_time": datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S"), } )
3. 修改消息接收逻辑
只在没有活跃会话时创建新的Execution,有活跃会话时直接交给Twilio处理:
def incoming_message() -> str: incoming_message = request.values.get('Body', '').lower() phone_number = request.values.get('From', None).replace('whatsapp:', '') resp = MessagingResponse() # 先验证手机号 if not validate_phone_number(phone_number): resp.message('Lo sentimos, no pudimos validar tu numero de telefono 😟') return str(resp) # 检查是否有活跃会话 active_execution = get_active_execution(phone_number) if active_execution: # 已有活跃会话,Twilio会自动把用户的回复路由到该会话,不需要额外操作 return str(resp) else: # 没有活跃会话,创建新的Execution twilio_studio_flow(phone_number) # 不要用resp.message包裹,Studio Flow会自动发送初始消息 return str(resp)
4. 修复端点函数的冗余代码
你的incoming_message_data函数里有重复的message键,修正一下:
@twilio.route('/incoming_message', methods=['GET', 'POST']) def incoming_message_data() -> str: if request.method == 'POST': message = incoming_message() if message and message != [{}]: response = { 'success': True, 'message': message, 'status_code': 200, 'error': None, 'code': '' } else: response = { 'success': False, 'message': 'Message could not be sent', 'status_code': 400, 'error': '', 'code': '' } # Twilio接收Webhook需要返回Twiml,所以直接返回message即可 return message return ''
额外注意事项
- 确保你的Studio Flow里使用了Send & Wait for Reply组件,这个组件会让Flow处于等待状态,Twilio会自动把用户的后续回复路由到当前活跃的Execution。
- 不要手动结束活跃Execution,除非你确实需要终止会话,否则Twilio会自动在流程结束后将Execution状态改为
completed。
内容的提问来源于stack exchange,提问作者Luis Cedillo Maldonado
相关产品推荐
相关产品推荐

