users.watch(在 gmail google api 中)如何监听通知?

问题描述 投票:0回答:2

我很困惑应该如何实现 gmail API 中的监视功能以接收 Node.js 脚本内的推送通知。我是否应该在无限循环内调用该方法或其他方法,以便在调用后它不会停止侦听电子邮件通知?

这是我在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`);
    }
})

谢谢!

node.js google-api gmail gmail-api
2个回答
11
投票
总结

要通过 PUB/SUB 接收推送通知,您需要创建一个网络挂钩来接收它们。这是什么意思?您需要一个 WEB 应用程序或任何类型的服务来公开可以接收通知的 URL。

如推送订阅文档中所述

  1. Pub/Sub 服务器将每条消息作为 HTTPS 请求发送到预配置端点处的订阅者应用程序。

  2. 端点通过返回 HTTP 成功状态代码来确认消息。不成功响应表示应重新发送消息。

设置观看通知的通道可以概括为以下步骤(您参考的文档指出了这些步骤):

  1. Google Cloud Console 中选择/创建项目。
  2. 创建新的 PUB/SUB 主题
  3. 为该主题创建订阅(推送)
  4. 添加 必要的权限,在本例中将
    [email protected]
    添加为
    Pub/Sub Publisher
  5. 指示您希望它通过
    Users.watch()
    方法侦听什么类型的邮件(这就是您在脚本中所做的事情)。

示例

我给你一个使用 Apps 脚本的示例(这是一种可视化它的简单方法,但这可以通过任何类型的 WEB 应用程序来实现,因为你正在使用 Node.js 我想你熟悉 Express.js 或相关的框架)。

首先我创建了一个新的 Google Apps 脚本项目,这将是我的网络钩子。基本上我希望它记录我之前创建的 Google 文档中的所有 HTTP/POST 请求。为此,我使用等于 Express 中的

doPost()
app.post()
。如果您想了解更多关于 Apps Script 的工作原理,可以访问此链接),但这不是主要主题。

Code.gs
const doPost = (e) => {
  const doc = DocumentApp.openById(<DOC_ID>)
  doc.getBody().appendParagraph(JSON.stringify(e, null, 2))
}

后来我做了一个新的Web应用程序实现,我说任何人都可以访问它,我记下URL供以后使用。这类似于将 Node.js 应用程序部署到互联网。

我在 Cloud Console 中选择一个项目,如 Cloud Pub/Sub 的先决条件中所示。

在这个项目中,我创建了一个新主题,我称之为

GmailAPIPush
。之后,单击
Add Main
(在主题部分的右侧栏中)并添加
[email protected]
Pub/Sub Publisher
角色。这是授予 Gmail 发布通知权限的要求

在同一个项目中,我创建了一个订阅。我告诉它是 Push 类型,并添加我之前创建的 Web 应用程序的 URL。

这是最关键的部分,它决定了您希望应用程序如何工作。如果您想知道哪种订阅类型最适合您的需求(推式或拉式),您可以使用详细文档来帮助您在这两种类型之间进行选择。

最后我们剩下最简单的部分,配置 Gmail 帐户以在邮箱上发送更新。我将通过 Apps 脚本执行此操作,但它与 Node 完全相同。

const watchUserGmail = () => {
  const request = {
    'labelIds': ['INBOX'],
    'topicName': 'projects/my_project_name/topics/GmailAPIPush'
  }
  Gmail.Users.watch(request, 'me')
}

函数执行后,我发送一条测试消息,瞧,通知出现在我的文档中。

回到你揭露的案例,我尝试用一个比喻来解释一下。想象一下您有一个邮箱,并且正在等待一封非常重要的信件。由于紧张,你会每隔 5 分钟检查一下信是否到达(类似于你提出的

setInterval
),这使得大多数时候你去查看邮箱时,都没有什么新鲜事。然而,你训练你的狗每次邮递员到来时都会吠叫(推送通知),所以你只有在知道有新信件时才去检查你的邮箱。


0
投票

很高兴得到您的答复。有同样的东西,但还有一个问题:

如果我需要为多个账户实现多个订阅怎么办?在这种情况下它对我有用吗?

© www.soinside.com 2019 - 2024. All rights reserved.