【问题标题】:GMail v1 API Users.messages results differ from Web UI on logical AND/ORGMail v1 API Users.messages 结果与逻辑 AND/OR 上的 Web UI 不同
【发布时间】:2016-12-21 23:14:56
【问题描述】:

我正在使用以下查询:

无人深空

与 API Explorer 和我的 C# 应用程序相比,我从 Web UI 获得的结果不同。

GMail 网页界面

注意,对话视图已禁用:

如果我启用对话视图,我会得到 9 个由 Web UI 返回的线程;使用线程 API,我得到 7 个线程。


API 资源管理器https://developers.google.com/gmail/api/v1/reference/users/messages/list:

{  
 "messages": [  
  {  
   "id": "15686dcf7989e60f"  
  },  
  {  
   "id": "1566bce4412a439d"  
  },  
  {  
   "id": "156327e51b979f48"  
  },  
  {  
   "id": "1560f0caf9297ab9"  
  },  
  {  
   "id": "155f01dba1c3ad77"  
  },  
  {  
   "id": "1538bce006a95a84"  
  },  
  {  
   "id": "15342e9d99b4d3f6"  
  }  
 ]  
}  

我在 C# 应用程序中看到了与 API Explorer 相同的结果。 API 和 Web UI 之间似乎存在脱节。 Web UI 返回 10 个结果,API 仅返回这 10 个结果中的 7 个(我已经手动验证它们是 10 个的子集)。

更新:

事实证明,API 将查询视为文字。用引号将 Web UI 中的查询括起来会得到与 API 相同的结果。

这确实留下了如何使用 API 复制原始搜索的问题;是否必须运行 3 个查询,然后只获取所有 3 个返回的结果?当您开始处理复杂的查询时,会变得有点解析工作。

更新 2

我尝试通过单独运行 3 个 AND 项,然后提取结果,其中消息 ID 是所有 3 个查询的结果集,我得到了与 API 调用相同的 7 个结果。

p>

用于测试的代码:

var service = GMailServiceManager.Instance.Service;
var resultsNo = GMailUtils.GetItems(service, null, "No", true);
var resultsMans = GMailUtils.GetItems(service, null, "Man's", true);

var resultsSky = GMailUtils.GetItems(service, null, "Sky", true);

var anded = from nos in resultsNo.Items
              from manses in resultsMans.Items
                from skys in resultsSky.Items
                where nos.Id == manses.Id && nos.Id == skys.Id
                select nos.Id;

GMailUtils.GetItems() 只是处理 API 请求的批处理和一些其他特定于应用程序的例程。它使用以下内容来检索批次中的每组项目:

UsersResource.MessagesResource.ListRequest request = service.Users.Messages.List("me");
request.Q = search;
request.Fields = "messages(id),nextPageToken";
request.PageToken = pageToken;
// Logging and batching here
...
  request.Execute();
...

我现在不知道 Web UI 是如何产生其他点击的;在两个实例中,点击突出显示在 www.no-mans-sky.com 上(它们在同一个线程中):

NoManSky 的其他点击分别在电子邮件中(注意不是 Man 的)。

更新 3

回到 Web UI,我决定对搜索词 Man's 进行一些测试。

在 Web UI 中,我获得了数百次点击:

对于"Man's",我获得了 11 次点击:

API 与引用的 Web UI 匹配:

{
 "messages": [
  {
   "id": "15686dcf7989e60f"
  },
  {
   "id": "1566bce4412a439d"
  },
  {
   "id": "156327e51b979f48"
  },
  {
   "id": "1560f0caf9297ab9"
  },
  {
   "id": "155f01dba1c3ad77"
  },
  {
   "id": "1538bce006a95a84"
  },
  {
   "id": "15342e9d99b4d3f6"
  },
  {
   "id": "13da4a6d7a4159b2"
  },
  {
   "id": "13da4a502eca7dff"
  },
  {
   "id": "12e70fbf3d655ac8"
  },
  {
   "id": "1278adc3ed72f6a8"
  }
 ]
}

基于此,API 的查询似乎被视为字符串文字,而不是 Web-UI 样式的查询。对我来说似乎是一个错误,因为我找不到使用 API 重现 Web UI 结果的方法。

【问题讨论】:

  • 您将在 UI 中获得线程,并在 listing messages 时分隔消息。如果您改为list threads,是否匹配?
  • 我在 UI 中关闭了线程,并且 UI 获得的结果比 API 多。
  • 我明白了。如果您要打开对话视图并列出线程,两种情况下的结果是否一样多?我不能 100% 确定它是如何工作的,但是 UI 可能会显示对话中的所有消息,而使用 API 列出消息则不会。
  • @Tholle 不,使用线程我仍然得到 7 个结果,Web UI 得到 9 个而不是 10 个。
  • 不幸的是,UI 中有 8 个项目被标记为收件箱,另外两个没有标签,这也是我的第一个想法。 includeSpamTrash=true 从 API 返回几十个结果。

标签: gmail-api


【解决方案1】:

我在自己的 Gmail 中尝试过,发现一些电子邮件是在一个线程中找到的。

这是我的例子:

我使用了 time tracker 这个词作为我的主题,Gmail 用户界面给了我 4 封电子邮件的结果。但如果你计算总结果,我总共有 12 个结果。 6 封来自 A,3 封来自 B,2 封来自 C,1 封来自 D。

所以如果我使用请求

GET https://www.googleapis.com/gmail/v1/users/example%40google.com/messages?q=subject%3A(time+tracker)&fields=messages(id%2CthreadId)&key={YOUR_API_KEY}

或 Gmail API 中的 Try it part

它会给我一个 12 个 ID 的结果,就像在 GMail UI 中一样。

查看上图,您会注意到属于同一线程的所有电子邮件都有相同的threadId

因此请尝试使用threadId 来确定在您的请求中找到的电子邮件数量。如果我误解了这个问题,请有人告诉我。

【讨论】:

  • 如问题中所述,我没有使用对话视图,这意味着 Web UI 中没有线程。此外,Web UI 正在返回 API 没有返回的命中(Man 而不是 Man'sMans。我也会从 cmets 添加有关线程测试的信息。
猜你喜欢
  • 1970-01-01
  • 2017-08-05
  • 1970-01-01
  • 2014-10-18
  • 1970-01-01
  • 1970-01-01
  • 2011-05-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多