Google Calendar API观看频道不会停止

时间:2017-04-13 19:15:57

标签: google-calendar-api

即使在允许一夜之间传播之后,停止观看频道也无效,但它没有响应错误。我仍然收到一个日历更改的5个通知。有时6.有时3.它是零星的。我们还会在8秒后收到第二轮相同操作的通知。有时6秒。有时是第三组随机计数。也是零星的。通过网络浏览器创建的单个日历共收到10条唯一消息。

3 个答案:

答案 0 :(得分:1)

您可以在特定日历资源上执行无限量的观看请求,Google将始终为同一日历返回相同的日历资源ID,但您在请求中生成的uuid将有所不同,因此,您将收到您已制作的每个观看请求的多个通知。阻止来自特定日历资源的所有通知的一种方法是收听通知,拔出" x-goog-channel-id"和" x-goog-resource-id"来自通知标题,并在Channels.stop请求中使用它们。

{
  "id": string,
  "resourceId": string
}

每次执行观看请求时,都应该保留响应中的数据,并检查uuid或资源ID是否已经存在,如果是,则不再对该资源ID执行观看请求(如果您不是#39;想要收到多个通知。)

e.g。

app.post("/calendar/listen", async function (req, res) {
    var pushNotification = req.headers;
    res.writeHead(200, {
        'Content-Type': 'text/html'
    });
    res.end("Post recieved");
    var userData = await dynamoDB.getSignInData(pushNotification["x-goog-channel-token"]).catch(function (err) {
        console.log("Promise rejected: " + err);
    });
    if (!userData) {
        console.log("User data not found in the database");
    } else {
        if (!userData.calendar) {
            console.log("Calendar token not found in the user data object, can't perform Calendar API calls");
        } else {
            oauth2client.credentials = userData.calendar;
            await calendarManager.stopWatching(oauth2client, pushNotification["x-goog-channel-id"], pushNotification["x-goog-resource-id"]) 
        } 
    } 
};

calendarManager.js

module.exports.stopWatching = function (oauth2client, channelId, resourceId) {
    return new Promise(function (resolve, reject) {
        calendar.channels.stop({
            auth: oauth2client,
            resource: {
                id: channelId,
                resourceId: resourceId
            }
        }, async function (err, response) {
            if (err) {
                console.log('The API returned an error: ' + err);
                return reject(err);
            } else {
                console.log("Stopped watching channel " + channelId);
                await dynamoDB.deleteWatchData(channelId)
                resolve(response);
            }
        })
    })
}

答案 1 :(得分:0)

使用文档中提到的Channels.stop。在您的请求正文中提供以下数据:

{
  "id": string,
  "resourceId": string
}
{p> id是您created your watch request时的频道ID。资源ID也是如此。

请阅读此SO threadthis github forum以获取更多参考资料。

答案 2 :(得分:0)

不是Google专家,但我最近在应用程序中实现了它, 我正在尝试为将来的读者回答您的一些问题:


  

这是零星的

是因为您已经创建了多个频道来观看赛事。

  

8秒后,我们还将收到第二轮针对同一操作的通知

Google没有透露有关发送推送通知的最大延迟时间。

建议:

创建: 创建新频道时,请始终将channel_id和channel_resource保存在数据库中。

删除: 要删除频道时,只需将stop API endpoint与保存在数据库中的频道数据一起使用

更新: 如您所知,通道确实会过期,因此您需要不时更新它们。为此,请在您的服务器中创建一个老太婆,该老太婆将停止所有先前的频道,并且它将创建一个新的。

评论:每当出现问题时,请阅读Google API日历发送的错误消息。在大多数情况下,它会告诉您哪里出了问题。