users.watch(在 gmail google api 中)如何收听通知?
how does users.watch (in gmail google api) listen for notifications?
我很困惑应该如何实现 gmail API 中的监视功能以接收 node.js 脚本中的 push notificatons。我是否应该在无限循环或其他方式中调用该方法,以便它在调用后不会停止收听电子邮件通知?
这是我在 node.js 中编写的示例代码:
const getEmailNotification = () => {
return new Promise(async (resolve, reject) => {
try{
let auth = await authenticate();
const gmail = google.gmail({version: 'v1', auth});
await gmail.users.stop({
userId: '<email id>'
});
let watchResponse = await gmail.users.watch({
userId: '<email id>',
labelIds: ['INBOX'],
topicName: 'projects/<projectName>/topics/<topicName>'
})
return resolve(watchResponse);
} catch(err){
return reject(`Some error occurred`);
}
})
谢谢!
总结
要通过 PUB/SUB 接收推送通知,您需要创建一个 web-hook 来接收它们。这是什么意思?您需要一个 WEB 应用程序或任何类型的服务来公开 URL 可以接收通知的地方。
如推送中所述subscription documentation:
The Pub/Sub server sends each message as an HTTPS request to the subscriber application at a pre-configured endpoint.
The endpoint acknowledges the message by returning an HTTP success status code. A non-success response indicates that the message should be resent.
设置观看通知的渠道可以概括为以下步骤(the documentation 你指的是它们):
- Select/Create a project within the Google Cloud Console.
- 创建 new PUB/SUB topic
- 为该主题创建一个 subscription (PUSH)。
- 添加 necessary permissions,在本例中添加
gmail-api-push@system.gserviceaccount.com
作为 Pub/Sub Publisher
。
- 通过
Users.watch()
方法(这是您在脚本中所做的)指明您希望它收听的邮件类型。
例子
我给你一个使用 Apps 脚本的例子(这是一种简单的可视化方法,但是这可以通过任何类型的 WEB 应用程序来实现,因为你正在使用 Node.js 我想你已经熟悉了使用 Express.js 或相关框架)。
首先我创建了一个new Google Apps Script project, this will be my web-hook. Basically I want it to make a log of all HTTP/POST requests inside a Google Doc that I have previously created. For it I use the doPost()
equal to app.post()
in Express. If you want to know more about how Apps Script works, you can visit this link),但这不是主题
Code.gs
const doPost = (e) => {
const doc = DocumentApp.openById(<DOC_ID>)
doc.getBody().appendParagraph(JSON.stringify(e, null, 2))
}
后来我做了一个new implementation as a Web App,上面写着任何人都可以访问,我把URL记下来以备后用。这类似于将您的 Node.js 应用程序部署到互联网。
我select一个项目在Cloud Console, as indicated in the Prerequisites of Cloud Pub/Sub.
在这个项目中,我创建了一个 new topic that I call GmailAPIPush
. After, click in Add Main
(in the right bar of the Topics section ) and add gmail-api-push@system.gserviceaccount.com
with the Pub/Sub Publisher
role. This is a requirement 来授予 Gmail 发布通知的权限。
在同一个项目中,我创建了一个订阅。我告诉它是 Push 类型,并添加我之前创建的 Web App 的 URL。
这是最关键的部分,它决定了您希望应用程序如何工作。如果您想知道哪种类型的订阅最适合您的需求(PUSH 或 PULL),您有一个 detailed documentation 可以帮助您在这两种类型之间进行选择。
最后我们剩下最简单的部分,配置 Gmail 帐户以在邮箱上发送更新。我将从 Apps 脚本执行此操作,但它与 Node 完全相同。
const watchUserGmail = () => {
const request = {
'labelIds': ['INBOX'],
'topicName': 'projects/my_project_name/topics/GmailAPIPush'
}
Gmail.Users.watch(request, 'me')
}
函数执行后,我发送一条测试消息,瞧,通知出现在我的文档中。
回到你所揭露的案例,我将尝试用一个比喻来解释。想象一下,您有一个邮箱,正在等待一封非常重要的信件。由于你很紧张,你每 5 分钟去检查一次信件是否到达(类似于你用 setInterval
提出的建议),这使得大多数时候你去检查你的邮箱,没有什么新的.但是,每次邮递员来时,你都训练你的狗吠叫(推送通知),所以你只有在知道有新信件时才去检查你的邮箱。
我很困惑应该如何实现 gmail API 中的监视功能以接收 node.js 脚本中的 push notificatons。我是否应该在无限循环或其他方式中调用该方法,以便它在调用后不会停止收听电子邮件通知?
这是我在 node.js 中编写的示例代码:
const getEmailNotification = () => {
return new Promise(async (resolve, reject) => {
try{
let auth = await authenticate();
const gmail = google.gmail({version: 'v1', auth});
await gmail.users.stop({
userId: '<email id>'
});
let watchResponse = await gmail.users.watch({
userId: '<email id>',
labelIds: ['INBOX'],
topicName: 'projects/<projectName>/topics/<topicName>'
})
return resolve(watchResponse);
} catch(err){
return reject(`Some error occurred`);
}
})
谢谢!
总结
要通过 PUB/SUB 接收推送通知,您需要创建一个 web-hook 来接收它们。这是什么意思?您需要一个 WEB 应用程序或任何类型的服务来公开 URL 可以接收通知的地方。
如推送中所述subscription documentation:
The Pub/Sub server sends each message as an HTTPS request to the subscriber application at a pre-configured endpoint.
The endpoint acknowledges the message by returning an HTTP success status code. A non-success response indicates that the message should be resent.
设置观看通知的渠道可以概括为以下步骤(the documentation 你指的是它们):
- Select/Create a project within the Google Cloud Console.
- 创建 new PUB/SUB topic
- 为该主题创建一个 subscription (PUSH)。
- 添加 necessary permissions,在本例中添加
gmail-api-push@system.gserviceaccount.com
作为Pub/Sub Publisher
。 - 通过
Users.watch()
方法(这是您在脚本中所做的)指明您希望它收听的邮件类型。
例子
我给你一个使用 Apps 脚本的例子(这是一种简单的可视化方法,但是这可以通过任何类型的 WEB 应用程序来实现,因为你正在使用 Node.js 我想你已经熟悉了使用 Express.js 或相关框架)。
首先我创建了一个new Google Apps Script project, this will be my web-hook. Basically I want it to make a log of all HTTP/POST requests inside a Google Doc that I have previously created. For it I use the doPost()
equal to app.post()
in Express. If you want to know more about how Apps Script works, you can visit this link),但这不是主题
Code.gs
const doPost = (e) => {
const doc = DocumentApp.openById(<DOC_ID>)
doc.getBody().appendParagraph(JSON.stringify(e, null, 2))
}
后来我做了一个new implementation as a Web App,上面写着任何人都可以访问,我把URL记下来以备后用。这类似于将您的 Node.js 应用程序部署到互联网。
我select一个项目在Cloud Console, as indicated in the Prerequisites of Cloud Pub/Sub.
在这个项目中,我创建了一个 new topic that I call GmailAPIPush
. After, click in Add Main
(in the right bar of the Topics section ) and add gmail-api-push@system.gserviceaccount.com
with the Pub/Sub Publisher
role. This is a requirement 来授予 Gmail 发布通知的权限。
在同一个项目中,我创建了一个订阅。我告诉它是 Push 类型,并添加我之前创建的 Web App 的 URL。
这是最关键的部分,它决定了您希望应用程序如何工作。如果您想知道哪种类型的订阅最适合您的需求(PUSH 或 PULL),您有一个 detailed documentation 可以帮助您在这两种类型之间进行选择。
最后我们剩下最简单的部分,配置 Gmail 帐户以在邮箱上发送更新。我将从 Apps 脚本执行此操作,但它与 Node 完全相同。
const watchUserGmail = () => {
const request = {
'labelIds': ['INBOX'],
'topicName': 'projects/my_project_name/topics/GmailAPIPush'
}
Gmail.Users.watch(request, 'me')
}
函数执行后,我发送一条测试消息,瞧,通知出现在我的文档中。
回到你所揭露的案例,我将尝试用一个比喻来解释。想象一下,您有一个邮箱,正在等待一封非常重要的信件。由于你很紧张,你每 5 分钟去检查一次信件是否到达(类似于你用 setInterval
提出的建议),这使得大多数时候你去检查你的邮箱,没有什么新的.但是,每次邮递员来时,你都训练你的狗吠叫(推送通知),所以你只有在知道有新信件时才去检查你的邮箱。