2016-01-31 11 views
0

Google通訊錄API返回我發送給我的電子郵件地址列表,但不包括我的聯繫人列表中的電子郵件地址列表?谷歌聯繫人API返回我發送給我的電子郵件地址列表,但沒有列入我的聯繫人列表中?

我使用的是谷歌聯繫人API,並嘗試獲取我的Gmail聯繫人中的電子郵件列表。谷歌聯繫方式爲https://contacts.google.com/u/0/preview/all

下面是我使用的代碼:

public List<GMail> GetContacts(GooglePlusAccessToken serStatus) 
{ 
    List<GMail> ret = new List<GMail>(); 

    string google_client_id = _ClientId; 
    string google_client_sceret = _ClientSeceret; 

    string refreshToken = serStatus.refresh_token; 
    string accessToken = serStatus.access_token; 
    string scopes = "https://www.google.com/m8/feeds/contacts/default/full/"; 
    OAuth2Parameters oAuthparameters = new OAuth2Parameters() 
    { 
     ClientId = google_client_id, 
     ClientSecret = google_client_sceret, 
     RedirectUri = GetRedirectUrl(), 
     Scope = scopes, 
     AccessToken = accessToken, 
     RefreshToken = refreshToken 
    }; 

    RequestSettings settings = new RequestSettings("<var>Invite GMail Friends</var>", oAuthparameters); 
    ContactsRequest cr = new ContactsRequest(settings); 
    ContactsQuery query = new ContactsQuery(ContactsQuery.CreateContactsUri("default")); 
    query.NumberToRetrieve = _NumberToRetrieve; 
    Feed<Contact> feed = cr.Get<Contact>(query); 

    foreach (Contact entry in feed.Entries) 
    { 
     foreach (EMail email in entry.Emails) 
     { 
      GMail g = new GMail(email.Address); 
      ret.Add(g); 
     } 
    } 

    return ret; 
} 

但由於種種原因,該代碼返回,我發過去的電子郵件地址列表中,但不是在我的聯繫人列表中的電子郵件。它是否正確?有人知道爲什麼

感謝

**感謝艾倫的答案,這裏是我的代碼,它的偉大工程!聯繫人組實際上是:SystemGroup:[email protected]**

public List<GMail> GetContacts_2(GooglePlusAccessToken serStatus) 
{ 
    List<GMail> ret = new List<GMail>(); 

    string google_client_id = _ClientId; 
    string google_client_sceret = _ClientSeceret; 
    /*Get Google Contacts From Access Token and Refresh Token*/ 
    string refreshToken = serStatus.refresh_token; 
    string accessToken = serStatus.access_token; 
    string scopes = "https://www.google.com/m8/feeds/groups/default/full/?v=3.0"; 

    OAuth2Parameters oAuthparameters = new OAuth2Parameters() 
    { 
     ClientId = google_client_id, 
     ClientSecret = google_client_sceret, 
     RedirectUri = GetRedirectUrl(), 
     Scope = scopes, 
     AccessToken = accessToken, 
     RefreshToken = refreshToken 
    }; 


    RequestSettings settings = new RequestSettings("<var>Invite GMail Friends</var>", oAuthparameters); 
    ContactsRequest cr = new ContactsRequest(settings); 
    GroupsQuery query = new GroupsQuery(GroupsQuery.CreateGroupsUri("default")); 
    query.NumberToRetrieve = 1000; // _NumberToRetrieve; // 100;// 5000; 
    //Feed feed = cr.Get(query); 
    Feed<Group> feed = cr.Get<Group>(query); 
    string gpId = string.Empty; 
    foreach (Group gp in feed.Entries) 
    { 
     if (gp.Title.Contains("Contacts")) 
     { 
      gpId = gp.Id; 
      //break; 
     } 

     //// for testing 
     //GMail g = new GMail(gp.Title.Replace(" ", "") + "@gmail.com"); 
     //ret.Add(g); 
    } 

    if (gpId.Length > 0) 
    { 
     scopes = "https://www.google.com/m8/feeds/contacts/default/full/?v=3.0"; 

     oAuthparameters = new OAuth2Parameters() 
     { 
      ClientId = google_client_id, 
      ClientSecret = google_client_sceret, 
      RedirectUri = GetRedirectUrl(), 
      Scope = scopes, 
      AccessToken = accessToken, 
      RefreshToken = refreshToken 
     }; 

     settings = new RequestSettings("<var>Invite GMail Friends</var>", oAuthparameters); 
     //ContactsRequest cr = new ContactsRequest(settings); 
     cr = new ContactsRequest(settings); 
     ContactsQuery query2 = new ContactsQuery(ContactsQuery.CreateContactsUri("default")); 
     query2.NumberToRetrieve = _NumberToRetrieve; // 100;// 5000; 
     query2.OrderBy = ContactsQuery.OrderByLastModified; 
     query2.SortOrder = ContactsQuery.SortOrderDescending; 
     query2.Group = gpId; 
     Feed<Contact> feed2 = cr.Get<Contact>(query2); 

     foreach (Contact entry in feed2.Entries) 
     { 
      foreach (EMail email in entry.Emails) 
      { 
       GMail g = new GMail(email.Address); 
       ret.Add(g); 
      } 
     } 

     //if (ret.Count <= 0) 
     //{ 
     // GMail g = new GMail("[email protected]"); 
     // ret.Add(g); 
     //} 

    } 
    //else 
    //{ 
    // // for testing 
    // GMail g = new GMail("[email protected]"); 
    // ret.Add(g); 
    //} 

    return ret; 
} 

回答

1

首先,我感到你的痛苦。 Google的API是最差的。期。

我周圍得到的方式(不做事的一種有效的方法,但是這是我能找到的最好的。否則谷歌將返回所有都曾經與賬戶持有人溝通的虛假接觸的電子郵件,可能是幾千個這樣的條目在一個典型的Gmail帳戶))是這個(其VB.net代碼,但你可以得到一個要點,輕鬆地轉換)

首先檢索聯繫人組,並查找標題「聯繫人」

Dim settings As New RequestSettings("MyApp", RefreshOAuthToken()) 
Dim cr As New ContactsRequest(settings) 
    'retrieve Contacts group (this is to retrieve only real contacts) 
Dim groupquery As New GroupsQuery(GroupsQuery.CreateGroupsUri("default")) 
Dim fgrp As Feed(Of Group) = cr.Get(Of Group)(groupquery) 
Dim GroupAtomId As String = "" 
For Each gr In fgrp.Entries 
    If gr.Title.Contains("Contacts") Then 
     GroupAtomId = gr.Id 
      Exit For 
    End If 
Next 

然後使用聯繫人的聯繫人編號

Dim query As New ContactsQuery(ContactsQuery.CreateContactsUri("default")) 
query.NumberToRetrieve = 2000 
query.OrderBy = ContactsQuery.OrderByLastModified 
query.SortOrder = ContactsQuery.SortOrderDescending 
query.Group = GroupAtomId 

Dim f As Feed(Of Contact) = cr.Get(Of Contact)(query) 

For Each entry As Contact In f.Entries 
'Do something with the data, these are real contacts in GMail 
Next 

所以這裏的重點是首先獲取組ID並將其用於聯繫人搜索。我相信這就是你的代碼缺失。

+0

謝謝。這樣可行!組名實際上是:SystemGroup:[email protected]。我將更新C#代碼示例的原始問題。 – urlreader

相關問題