如何在Node.js Webhook中获取Google Actions请求的项目ID或调用URL?
如何在Google Actions SDK的Node.js Webhook中区分不同Action
我来帮你解决这个问题,其实有两种可靠的方式来实现你的需求:
1. 获取Webhook调用的URL路径
因为你的Cloud Function是基于Express的functions.https.onRequest,所以可以直接捕获请求的URL路径,再把这个信息传递给Actions SDK的处理逻辑。
举个具体的代码示例:
const { actionssdk } = require('actions-on-google'); const functions = require('firebase-functions'); // 初始化Actions SDK实例 const app = actionssdk({ verification: 'nodejs-cloud-test-project-1234' }); // 处理主Intent,根据路径返回不同响应 app.intent('actions.intent.MAIN', (conv) => { const actionPath = conv.data.actionPath; if (actionPath === '/action1') { conv.ask('这是Action 1的响应'); } else if (actionPath === '/action2') { conv.ask('这是Action 2的响应'); } else { conv.ask('未知的Action请求'); } }); // 封装请求处理函数,先捕获路径再传给Actions SDK exports.funcname = functions.https.onRequest((req, res) => { // 获取当前请求的路径(比如"/action1") const requestPath = req.path; // 添加中间件,把路径注入到conv的data中 app.use((conv, next) => { conv.data.actionPath = requestPath; next(); }); // 交给Actions SDK处理请求 app(req, res); });
这样配置后,当不同的Action调用不同路径的Webhook时,你就能在Intent处理逻辑里拿到对应的路径,从而返回自定义响应。
2. 直接获取Actions项目ID(更推荐)
其实你不需要依赖URL路径,Actions SDK的conv对象已经内置了发起请求的Actions项目ID,你可以直接通过conv.projectId获取到这个值,这是更可靠的方式——因为项目ID是Google Actions请求中自带的,而且经过了你配置的verification验证,不会被伪造。
代码示例:
const { actionssdk } = require('actions-on-google'); const functions = require('firebase-functions'); const app = actionssdk({ verification: 'nodejs-cloud-test-project-1234' }); app.intent('actions.intent.MAIN', (conv) => { const projectId = conv.projectId; // 根据不同的项目ID返回不同响应 switch(projectId) { case 'nodejs-cloud-test-project-1234': conv.ask('来自项目A的请求'); break; case 'my-second-action-project-5678': conv.ask('来自项目B的请求'); break; default: conv.ask('未知项目的请求'); } }); exports.funcname = functions.https.onRequest(app);
这种方式不需要修改URL路径,同一个Webhook URL就能处理多个Actions项目的请求,只需要根据项目ID区分即可,维护起来更简单。
小提示
- 如果你选择用URL路径区分,记得在Google Actions控制台的Fulfilment设置里,给每个Action配置对应的完整URL(比如
https://your-cloud-function-url/action1)。 - 开启verification后,
conv.projectId是完全可信的,不用担心被篡改,这比依赖URL路径更安全。
内容的提问来源于stack exchange,提问作者RmR
相关产品推荐
相关产品推荐

