Google Pub/Sub webhook 调用服务器后无法检索消息内容
Posted
技术标签:
【中文标题】Google Pub/Sub webhook 调用服务器后无法检索消息内容【英文标题】:Unable to retrieve message content after Google Pub/Sub webhook call to server 【发布时间】:2017-09-12 08:15:54 【问题描述】:我订阅了 Google Cloud Pub/Sub,创建了一个主题并使用指向我服务器上的 URL 的 webhook 创建了订阅。然后,我使用 Gmail API 在我在我的 Gmail 帐户中创建的特定标签上调用 watch 并将其与我创建的主题相关联。
当我的邮件到达我的 Gmail 帐户中的标签时,webhook 会触发对我服务器上 URL 的 POST 请求。但无论邮件内容是什么,POST 正文总是这样:
"message":
"attributes": ,
"data": "eyJlbWFpbEFkZHJlc3MiOiJteWVtYWlsQG15ZG9tYWluLmNvbSIsImhpc3RvcnlJZCI6MTIzNDU2N30K",
"messageId": "12345678900000", # only relevant to Pub/Sub
"message_id": "12345678900000",
"publishTime": "2017-04-16T15:42:08.968Z",
"publish_time": "2017-04-16T15:42:08.968Z"
,
"subscription": "projects/proj-name/subscriptions/sub-name"
data
字段采用 Base64 编码,在本例中为:
"emailAddress":"myemail@mydomain.com","historyId":1234567
无论电子邮件内容是什么,我每次都会得到这样的结果。但是,如果从 google 开发者控制台运行发布测试,data
字段中的 base64 编码值是我指定的实际消息字符串。
我尝试使用来自 base64 解码的 data
值的 historyId 使用 Gmail API 对 history.list 进行后续调用,但我得到的只是这样的响应:
"historyId": "1234567"
我想如何获取电子邮件内容?
【问题讨论】:
似乎不知何故,发送的请求默认使用metadata
/minimal
format
。我没有深入研究 Google Pub/Sub,但可能只是缺少一个参数。
如果是这样,我想知道您应该如何指定推送请求的格式。 watch
请求本身并没有为此提供参数,我也没有看到控制台推送请求的任何配置。
【参考方案1】:
有点晚了,但其他人可能会感兴趣。答案是here。 基本上你会从 watch 调用中得到一个 historyId。存储它。 然后当您收到来自 Gmail 的通知时:
跟踪historyId 使用存储的 historyId(来自 watch 调用)获取历史列表 (gmail.users.history.list) 从历史记录中导入所有需要的消息 完成后,将当前的 historyId 替换为通知中的历史 ID。希望对你有帮助。
【讨论】:
如何获取初始消息? @squixy 初始消息是指如何获取您的第一个 historyId?如果是这样,您可以通过调用watch 端点来获取它。 第一个historyId
允许我以后从该点获取消息,因此它无法获取第一条消息(导致 webhook 的消息)。
@squixy 我不确定是否理解。您使用 watch 订阅(为您提供 historyId)。然后在您的 webhook 上的通知中,您 list 您从手表获得的 historyId 的历史记录。列出历史记录后,您将当前的 historyId 替换为您刚刚获取的历史记录列表的最后一个。或者我可能误解了你的问题。以上是关于Google Pub/Sub webhook 调用服务器后无法检索消息内容的主要内容,如果未能解决你的问题,请参考以下文章
Google Cloud - Pub Sub Push Subscription 调用云函数重试
使用 Pub/Sub 触发器的 Google Cloud Function 可扩展性限制
Google Pub/Sub 如何在 Pull 上设置读取超时
Gmail API 无法向 Pub/Sub 平台发布任何消息