如何按执行顺序获取Twilio Studio Flow中的所有双向短信消息
嗨,我来帮你搞定这个按顺序收集短信的问题!你现在遇到的widgets对象顺序不对的情况很常见——因为Twilio Studio里的widgets集合是按widget的标识来组织的,并不是实际执行的先后顺序。下面给你两个靠谱的解决方案,你可以根据自己的场景选择:
方案一:通过Twilio API获取执行步骤序列(推荐复杂Flow使用)
这个方法的核心是利用Twilio Studio的Execution Steps API,它会返回整个Flow执行过程中所有步骤的时间顺序列表,完全符合你的需求。
步骤:
在Studio Flow里传递必要参数:
调用你的Twilio Function时,别再传widgets对象了,改成传递{{flow.executionSid}}和{{flow.sid}}这两个内置变量(这俩分别是当前Flow执行的ID和Flow本身的ID)。在Twilio Function里获取并处理步骤:
用Twilio Client调用API拿到执行步骤,筛选出短信相关的步骤,整理成有序的消息列表,再发给你的系统API。示例代码如下:
exports.handler = function(context, event, callback) { const twilioClient = context.getTwilioClient(); const { executionSid, flowSid } = event; // 获取当前Flow执行的所有步骤(按执行顺序排列) twilioClient.studio.v2.flows(flowSid) .executions(executionSid) .steps.list({ limit: 200 }) // 根据对话长度调整上限 .then(steps => { // 筛选出发送/接收短信的步骤 const messageSteps = steps.filter(step => step.type === 'send-message' || step.type === 'wait-for-message' ); // 整理成需要的JSON格式 const conversationHistory = messageSteps.map(step => { let msg = { timestamp: step.dateCreated }; if (step.type === 'send-message') { // 替换成你实际的发送消息widget名称,比如send_message_2 msg.direction = 'outbound'; msg.body = step.context['send_message_1'].body; } else if (step.type === 'wait-for-message') { msg.direction = 'inbound'; msg.body = step.context.inboundMessage.Body; } return msg; }); // 发送到你的系统API fetch('你的系统REST API地址', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ conversation: conversationHistory }) }) .then(res => res.json()) .then(apiRes => { console.log('对话历史已成功发送', apiRes); callback(null, { status: 'success' }); }) .catch(apiErr => { console.error('发送到系统API失败', apiErr); callback(apiErr); }); }) .catch(err => { console.error('获取执行步骤失败', err); callback(err); }); };
方案二:在Flow中实时维护有序消息数组(适合简单Flow)
如果不想额外调用Twilio API,可以在Flow里的每个短信操作后,把消息信息追加到一个数组变量里,最后直接把这个有序数组传给Function。
步骤:
初始化数组变量:
在Flow的起始位置,添加一个「Set Variables」widget,设置变量flow.conversationHistory的初始值为[](空数组)。发送消息后追加记录:
每用「Send Message」widget发完短信,就添加一个「Set Variables」widget,用如下表达式把消息信息追加到数组:{{flow.conversationHistory}} + [{"direction": "outbound", "body": "{{widgets.你的发送widget名称.body}}", "timestamp": "{{widgets.你的发送widget名称.dateCreated}}"}]把
你的发送widget名称替换成实际的widget标识(比如send_message_1)。接收消息后追加记录:
当「Wait for Message」widget收到用户短信后,同样添加「Set Variables」widget,用如下表达式追加:{{flow.conversationHistory}} + [{"direction": "inbound", "body": "{{widgets.你的接收widget名称.inboundMessage.Body}}", "timestamp": "{{widgets.你的接收widget名称.dateCreated}}"}]传递数组给Function:
最后调用你的Twilio Function时,传递{{flow.conversationHistory}}这个变量,Function里直接拿到的就是按执行顺序排列的消息数组,直接处理发给你的系统即可。
备注:内容来源于stack exchange,提问作者Mohammad

