Facebook Messenger对话启动时机及用户数据获取(NodeJS SDK)
问题1:基于NodeJS SDK,Facebook平台上的对话何时算作已启动?
在Facebook Messenger平台结合Node.js SDK的场景下,对话被认定为“已启动”主要有以下几种核心场景:
- 用户主动发起互动:比如发送文本、图片、视频等内容,点击按钮、快速回复选项、菜单入口,扫描Messenger专属二维码,或是点击带有Messenger跳转链接的广告、网页插件进入对话。这是最常见的触发点,此时SDK会同步触发对应事件(比如
message)来标记对话开启。 - 商家合规发起定向消息:当超过与用户的24小时标准对话窗口后,若你使用Facebook允许的消息标签(比如
CONFIRMED_EVENT_UPDATE、POST_PURCHASE_UPDATE等)向用户发送消息,也会启动一个合规的新对话。不过这种方式必须严格遵守平台政策,不能滥用标签。 - 用户重新激活对话:如果用户在之前的对话窗口关闭后,再次主动向bot发送消息,这会直接重新启动一个新的对话周期。
简单来说,判断对话是否启动的核心逻辑是:要么是用户主动触发的互动行为,要么是商家在合规范围内通过消息标签发起的定向消息,这两种情况都会被Facebook视为对话已启动。
问题2:当Facebook Messenger用户发起对话时,我需获取其姓名、头像等数据并发送至自有API,但不确定执行时机,是否应在bot.on('conversationUpdate', (session) => { // 此处执行? })中处理?
这两个事件都可以用来处理,但要根据你的业务场景选择更合适的:
1. 关于conversationUpdate事件
这个事件会在用户首次加入对话(比如第一次点击和你的bot聊天)、有成员加入/离开群组时触发。如果想覆盖“用户只进入对话界面但没发消息”的场景,这个事件是合适的。不过要注意,此时session.user可能没有完全填充用户资料,更稳妥的方式是拿到用户ID后调用Facebook Graph API获取详细信息:
bot.on('conversationUpdate', (session) => { // 排除bot自身被添加的情况,只处理用户加入 const userAdded = session.membersAdded.find(member => member.id !== bot.id); if (userAdded) { bot.getUserProfile(userAdded.id) .then(profile => { // 将用户姓名、头像等数据发送到自有API fetch('你的自有API地址', { method: 'POST', body: JSON.stringify({ name: profile.name, profilePic: profile.profile_pic, userId: profile.id }), headers: { 'Content-Type': 'application/json' } }); }) .catch(err => console.error('获取用户资料失败:', err)); } });
2. 关于message事件
这个事件是用户主动发送消息(文本、图片等)时触发的,此时session.user里已经包含了用户的姓名、头像链接等完整资料,不需要额外调用Graph API,处理起来更直接:
bot.on('message', (session) => { const userProfile = { name: session.user.name, profilePic: session.user.profilePic, userId: session.user.id }; // 发送到自有API fetch('你的自有API地址', { method: 'POST', body: JSON.stringify(userProfile), headers: { 'Content-Type': 'application/json' } }); // 这里可以继续编写回复用户消息的逻辑 });
总结
- 如果你想捕获所有用户首次接触的场景(包括只进入对话没发消息的情况),选择
conversationUpdate事件; - 如果你只关注用户真正发起消息互动的场景,
message事件更省心可靠,不需要额外的API调用。
内容的提问来源于stack exchange,提问作者Odirlei Borgert
相关产品推荐
相关产品推荐

