C# 应用程序 - 阅读 Google 通讯录

Posted

技术标签:

【中文标题】C# 应用程序 - 阅读 Google 通讯录【英文标题】:C# application - Read Google Contacts 【发布时间】:2016-01-26 13:31:51 【问题描述】:

由于 Google 停止支持他们的旧 Auth,现在我们必须使用 oAuth 2,我们的简单桌面应用程序无法再从我的 google 帐户中读取联系人。

很好 - 我明白这一点,但是这个新的 oAuth 2 非常复杂......而且我不是从开发人员的角度谈论的。根据我在网上阅读的内容。我们现在必须让我们的客户跳过许多障碍,以便我们的简单应用程序能够读取存储在他们的 Google 邮件/联系人中的联系人。

我的 iPhone 似乎能够使用我大约一年前输入的典型电子邮件和密码来同步联系人。他们如何让它发挥作用?然而,对于我的简单桌面应用程序,客户端必须在谷歌开发者网站和 API 设置等中翻找。我是一名开发人员,我很困惑! - 你能想象我的客户会经历什么吗...不可能这么复杂。

有没有人可以给我简单的 1,2,3 来让 C# 桌面应用程序启动并从特定的 Gmail 帐户获取联系人(只读)... 最少 摆弄的数量(对于 Gmail 帐户的所有者)。

我会在应用程序中完成所有艰苦的工作 - 我只是不希望客户不得不花费一个小时来授权和创建 API 并在开发人员站点中四处点击(他/她不是开发人员)。

【问题讨论】:

您明白他们必须对您的应用程序进行身份验证吗? github.com/google/google-gdata/blob/… 我完全理解必须有一些“勾选”或“启用”或客户必须做的事情 - 我完全明白这一点。但从我现在所看到的......有很多“停止”行动的方式,我的客户只会放弃而不打扰。他们会责怪我们让事情变得复杂。 他们所要做的就是接受一次。一旦他们这样做了,您将获得一个刷新令牌,您可以将其存储在某个地方,然后他们就不需要再这样做了。只要他们不撤销身份验证,您的应用程序就应该可以访问那里的数据。 你有什么类型的应用程序? 【参考方案1】:

这里的主要问题是联系人是旧的 Gdata API。可以将 Oauth2 与 Gdata 库一起使用,但不是 pretty。就个人而言,我喜欢破解一些东西。我将 Current .net 客户端库与旧的 Gdata 客户端库一起使用。

用于身份验证的 Nuget 新客户端库:

不是 100% 确定这是您唯一需要的,如果它不起作用,请告诉我,我们可以找到它。你基本上需要Google.apis.auth.oauth2google apis.util.store

安装包 Google.Apis.Auth

用于联系人的 Nuget 旧客户端库:

安装包 Google.GData.Contacts

代码

 using Google.Apis.Auth.OAuth2;
using Google.Apis.Util.Store;
using Google.Contacts;
using Google.GData.Client;
using System;
using System.Threading;

public static void auth()


    string clientId = "xxxxxx.apps.googleusercontent.com";
    string clientSecret = "xxxxx";


    string[] scopes = new string[]  "https://www.googleapis.com/auth/contacts.readonly" ;     // view your basic profile info.
    try
    
        // Use the current Google .net client library to get the Oauth2 stuff.
        UserCredential credential = GoogleWebAuthorizationBroker.AuthorizeAsync(new ClientSecrets  ClientId = clientId, ClientSecret = clientSecret 
                                                                                     , scopes
                                                                                     , "test"
                                                                                     , CancellationToken.None
                                                                                     , new FileDataStore("test")).Result;

        // Translate the Oauth permissions to something the old client libray can read
        OAuth2Parameters parameters = new OAuth2Parameters();
        parameters.AccessToken = credential.Token.AccessToken;
        parameters.RefreshToken = credential.Token.RefreshToken;
        RunContactsSample(parameters);
        Console.ReadLine();
    
    catch (Exception ex)
    

        Console.ReadLine();

    
    Console.ReadLine();




/// <summary> 
/// Send authorized queries to a Request-based library 
/// </summary> 
/// <param name="service"></param> 
private static void RunContactsSample(OAuth2Parameters parameters)

    try
    
        RequestSettings settings = new RequestSettings("Google contacts tutorial", parameters);
        ContactsRequest cr = new ContactsRequest(settings);
        Feed<Contact> f = cr.GetContacts();
        foreach (Contact c in f.Entries)
        
            Console.WriteLine(c.Name.FullName);
        
    
    catch (Exception a)
    
        Console.WriteLine("A Google Apps error occurred.");
        Console.WriteLine();
    

教程可以找到here

Google 开发者控制台

所有访问 google api 的应用程序都必须在 Google developers console 上注册。运行代码的注册用户是访问谷歌的应用程序,不需要执行此步骤。作为开发人员,您必须注册它。

您可以从中获得上面代码中使用的客户端 ID 和客户端密码。

【讨论】:

是的,这一切都非常好,而且我见过一堆这样的代码......但是clientId和secret是什么?我必须进入开发人员部分才能生成的一些东西。我要重复一遍……我的客户不是开发人员!还是我完全误解了这一点? 作为开发人员,您需要创建客户端 ID 和客户端密码。这不是您的用户需要做的事情。它是特定于应用程序的。此步骤无法绕过所有访问 google api 的应用程序必须在 Google 开发人员控制台上注册。这可能会有所帮助daimto.com/registering-a-project-with-google 所以我在 Google API 中创建了一个项目并获取了 clientid 等。我们作为开发人员曾经这样做过。伟大的。现在我的客户来了,他在哪里指定他的详细信息,我们如何获得他的联系人而不是其他人的联系人? 应用程序第一次运行时会弹出同意画面。他们批准它。 filedatastore 将在机器上为您存储用户身份验证信息。如果不止一个用户要在同一台机器上运行您的代码,您将需要更改“test”变量以区分用户。 成功!!感谢您的帮助,我们现在可以正常工作了。令人困惑的部分是,通常你登录到谷歌是因为你刚刚设置了 API 的东西——所以当然测试代码并不要求提供凭据。提示... 去设置 API,获取客户端 ID 等,然后退出 GOOGLE... 否则会令人困惑,因为您会看到 oAuth 同意页面(直接进入或选择帐户),所以你得到你的访问令牌,因此只有你自己的联系人。【参考方案2】:

我已经这样做了,但就像你说的那样,它有点模糊,很多摆弄。

我认为您可以在谷歌开发者控制台中注册并设置一个项目并生成一个服务帐户。然后客户端需要以谷歌应用管理员身份登录HERE,并在clientID字段中填写开发者控制台生成的服务帐户名称和您需要访问的API范围。

最后,我只是以客户身份登录到他们的管理面板并为他们进行了设置。如果客户没有聘请谷歌应用转售商提供帮助,就没有简单的方法。作为一名开发人员,我通过大量的谷歌搜索设法弄清楚了这一点。

【讨论】:

以上是关于C# 应用程序 - 阅读 Google 通讯录的主要内容,如果未能解决你的问题,请参考以下文章

谷歌通讯录同步服务安装失败 原因和解决方法

Google 通讯录数据 API 401 错误

使用 ASP.NET C# 上传到 YouTube - 避免出现“Google 登录”屏幕

iPad Gmail 帐户时事通讯中的空白间隙

中兴通讯应用之星“阅读吧”測试邀请函 邀请你的參与

单片机入门应用层软件开发的单片机学习之路-----UART串口通讯和c#交互...