C# Google Contacts API返回我发送到的电子邮件地址列表,但不返回我联系人列表中的电子邮件地址?

C# Google Contacts API返回我发送到的电子邮件地址列表,但不返回我联系人列表中的电子邮件地址?,c#,google-api,google-contacts-api,C#,Google Api,Google Contacts Api,Google Contacts API返回我发送到的电子邮件地址列表,但不返回我联系人列表中的电子邮件地址 我正在使用谷歌联系人api,并尝试在我的gmail联系人中获取电子邮件列表。谷歌联系人位于 下面是我使用的代码: public List<GMail> GetContacts(GooglePlusAccessToken serStatus) { List<GMail> ret = new List<GMail>(); string go

Google Contacts API返回我发送到的电子邮件地址列表,但不返回我联系人列表中的电子邮件地址

我正在使用谷歌联系人api,并尝试在我的gmail联系人中获取电子邮件列表。谷歌联系人位于

下面是我使用的代码:

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;
}
public List GetContacts(GooglePlusAccessToken serStatus)
{
List ret=新列表();
字符串google\u client\u id=\u ClientId;
字符串google\u client\u sceret=\u ClientSeceret;
字符串refreshttoken=serStatus.refresh\u token;
字符串accessToken=serStatus.access\u token;
字符串范围=”https://www.google.com/m8/feeds/contacts/default/full/";
OAuth2Parameters OAuth2Parameters=新的OAuth2Parameters()
{
ClientId=google\u client\u id,
ClientSecret=google\u client\u sceret,
RedirectUri=GetRedirectUrl(),
范围=范围,
AccessToken=AccessToken,
RefreshToken=RefreshToken
};
RequestSettings=newRequestSettings(“邀请GMail好友”,oAuthparameters);
ContactsRequest cr=新的ContactsRequest(设置);
ContactsQuery query=newcontactSquery(ContactsQuery.CreateContactsUri(“默认”));
query.numbertorRetrieve=\u numbertorRetrieve;
Feed=cr.Get(查询);
foreach(feed.Entries中的联系人条目)
{
foreach(条目中的电子邮件。电子邮件)
{
GMail g=新的GMail(email.Address);
再加上(g);
}
}
返回ret;
}
但是由于某些原因,代码返回我过去发送到的电子邮件地址列表,而不是我联系人列表中的电子邮件。这是正确的吗?有人知道为什么吗

谢谢

**谢谢Allen的回答,这是我的代码,非常好用!联络小组实际上是:系统小组:MyContacts@gmail.com**

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("NoContact@gmail.com");
        //    ret.Add(g);
        //}

    }
    //else
    //{
    //    // for testing
    //    GMail g = new GMail("NoGroup@gmail.com");
    //    ret.Add(g);
    //}

    return ret;
}
public List GetContacts_2(GooglePlusAccessToken serStatus)
{
List ret=新列表();
字符串google\u client\u id=\u ClientId;
字符串google\u client\u sceret=\u ClientSeceret;
/*从访问令牌和刷新令牌获取Google联系人*/
字符串refreshttoken=serStatus.refresh\u token;
字符串accessToken=serStatus.access\u token;
字符串范围=”https://www.google.com/m8/feeds/groups/default/full/?v=3.0";
OAuth2Parameters OAuth2Parameters=新的OAuth2Parameters()
{
ClientId=google\u client\u id,
ClientSecret=google\u client\u sceret,
RedirectUri=GetRedirectUrl(),
范围=范围,
AccessToken=AccessToken,
RefreshToken=RefreshToken
};
RequestSettings=newRequestSettings(“邀请GMail好友”,oAuthparameters);
ContactsRequest cr=新的ContactsRequest(设置);
GroupsQuery query=newgroupsquery(GroupsQuery.CreateGroupsUri(“默认”));
query.numbertorretrieve=1000;//\u numbertorretrieve;//100;//5000;
//Feed=cr.Get(查询);
Feed=cr.Get(查询);
string gpId=string.Empty;
foreach(提要条目中的组gp)
{
如果(总标题包含(“联系人”))
{
gpId=gp.Id;
//中断;
}
////用于测试
//GMail g=新的GMail(gp.Title.Replace(“,”)+“@GMail.com”);
//再加上(g);
}
如果(gpId.Length>0)
{
作用域=”https://www.google.com/m8/feeds/contacts/default/full/?v=3.0";
oAuthparameters=新的OAuth2Parameters()
{
ClientId=google\u client\u id,
ClientSecret=google\u client\u sceret,
RedirectUri=GetRedirectUrl(),
范围=范围,
AccessToken=AccessToken,
RefreshToken=RefreshToken
};
设置=新请求设置(“邀请GMail好友”,oAuthparameters);
//ContactsRequest cr=新的ContactsRequest(设置);
cr=新联系人请求(设置);
ContactsQuery query2=新的ContactsQuery(ContactsQuery.CreateContactsUri(“默认”));
query2.numbertorRetrieve=\u numbertorRetrieve;//100;//5000;
query2.OrderBy=ContactsQuery.OrderByLastModified;
query2.SortOrder=ContactsQuery.SortOrderDescending;
query2.Group=gpId;
Feed feed2=cr.Get(查询2);
foreach(feed2.条目中的联系人条目)
{
foreach(条目中的电子邮件。电子邮件)
{
GMail g=新的GMail(email.Address);
再加上(g);
}
}

//如果(ret.Count首先,我感觉到了你的痛苦。谷歌的API是最糟糕的

我绕过它的方式(不是一种有效的做事方式,但这是我能找到的最好的方式。否则谷歌会返回所有与账户持有人交流过的虚假联系电子邮件,在一个典型的GMail账户中可能有数千个这样的条目)是这样的(它的VB.net代码,但你可以很容易地获得要点并转换)

首先检索联系人组并查找标题“联系人”

然后使用联系人组的ID在联系人中搜索

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并在联系人搜索中使用它。我相信这就是您的代码缺少的部分。

首先,我感受到了您的痛苦。谷歌的API是最糟糕的

我绕过它的方式(不是一种有效的做事方式,但这是我能找到的最好的方式。否则谷歌会返回所有与账户持有人交流过的虚假联系电子邮件,在一个典型的GMail账户中可能有数千个这样的条目)是这样的(它的VB.net代码,但你可以很容易地获得要点并转换)

首先检索联系人组并查找标题“联系人”

然后使用联系人组的ID在联系人中搜索

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并在联系人搜索中使用它。我相信这就是您的代码所缺少的。

谢谢。这很有效!组名实际上是:SystemGroup:MyContacts@gmail.com.我将更新C#代码示例的原始问题