从Google帐户获取所有联系人使用.Net api排除其他联系人

时间:2014-10-24 09:27:46

标签: .net google-contacts

我正在尝试使用.Net API从Google帐户中获取所有联系人。

案例1:

var cr = new ContactsRequest(settings);
var feed = cr.GetContacts();

当我执行类似前一代码段的操作时,它会为我提供所有联系人,但它也为同一用户带来了其他联系人。就性能而言,这可能是非常昂贵的。然后我在本地过滤联系人 并且只保留我感兴趣的那些,但损坏已经完成。

案例2:

var cr = new ContactsRequest(settings);
var groupFeed = cr.GetGroups();
foreach (var group in groupFeed.Entries.ToList()) {
    var query = new ContactsQuery(ContactsQuery.CreateContactsUri("default")) {Group = group.Id};
    var contactFeed = cr.Get<Contact>(query);
    contactsList.AddRange(contactFeed.Entries.ToList());
}

在这种情况下,遍历帐户中的组并获取每个组的联系人。其他联系人不是一个群体,所以我设法逃脱它们。默认情况下,当用户在任何组中创建联系人时,联系人将添加到此组并添加到“我的联系人”的“主组”。因此,联系人可以是一个联系人(我的联系人 - 如果在那里创建)或更多组(如果在其他地方创建联系人)。 但是,用户可以手动从“我的联系人”中删除该联系人,并将其仅保留在另一个组中。

  1. 如果我遍历所有组然后在本地过滤,我将获取所有联系人,但最多可能是一次以上=&gt;表现不佳。
  2. 如果我从“我的联系人”中获得所有联系人,我可能会错过其中一些联系人。
  3. 因此,上述的最佳解决方案是获取除其他联系人之外的所有联系人。有人可以提出一个解决方案(可能会在ContactsQuery或其他东西中添加一些参数)吗?

    参考:Google Contacts API v3.0

1 个答案:

答案 0 :(得分:0)

如果您只想要自己的联系人,我建议您使用Google People API,这与Google Contacts API不同。这是Nuget包。 Google People API目前不允许您获取&#34;其他联系人&#34;,因此他们的正常GET方法只能检索联系人中的条目。这是一个例子:

// Setup authentication
var credential = new UserCredential(flow, "<LOGGED IN USER's EMAIL ADDRESS>", token);
var service = new PeopleService(new BaseClientService.Initializer()
        {
            HttpClientInitializer = credential,
            ApplicationName = _applicationName,
        });

var connectionsRequest = service.People.Connections.List("people/me");

// Assign what properties you want filled in. Fewer properties will be more performant.
connectionsRequest.RequestMaskIncludeField = "person.names,person.emailAddresses,person.photos";

do
{
    var connectionsResponse = connectionsRequest.Execute();
    var connections = connectionsResponse.Connections;

    foreach (var connection in connections)
    {
        // TODO: Handle each record as you need
    }

    // This API pages results and you manually need to retrieve the next set
    connectionsRequest.PageToken = connectionsResponse.NextPageToken;
} while (!string.IsNullOrEmpty(connectionsRequest.PageToken));