谷歌分析服务帐户OAuth访问类型=离线C#

11
我拥有访问Google Analytics的帐户凭据,想要利用Analytics核心报告API。http://code.google.com/apis/analytics/docs/gdata/home.html
我找到了一些使用用户名/密码调用setUserCredentials的示例,但看到评论说这种方法不太安全/请求受限(且在最新客户端中不存在)。
此外,我还看到了一些使用OAuth的示例,但需要用户交互,并授予用户的谷歌账户访问权限。
然而,我正在寻找一个无需任何用户交互,连接到预定义的Google帐户(与查看它的用户无关)的服务。
然后我可以将结果存储在数据库中,最终用户可以从数据库查询结果。
我已经看到了使用AccessType =离线的信息,在第一次登录时返回访问令牌和刷新令牌。 http://code.google.com/apis/accounts/docs/OAuth2WebServer.html#offline
然而,在我的示例中,最终用户永远不会登录应用程序。 我可以拥有一个单独的管理应用程序,该应用程序获取刷新令牌,并将刷新令牌存储在配置/查找表中吗? 然后主应用程序可以使用来自配置/查找表的刷新令牌进行拉取,获取访问令牌以能够查询Google Analytics帐户。
我正在寻找一个使用AccessType =离线、将获取刷新令牌和使用刷新令牌获取访问令牌用于查询Google Analytics帐户进行分离的C#示例。

你好,你能解决你的问题吗? - WhoAmI
4个回答

16

创建您的应用 https://code.google.com/apis/console/

对于您的应用程序,请打开对Google Analytics的访问权限,并为您的网站创建一个OAuth 2.0客户端ID。

浏览到:

https://accounts.google.com/o/oauth2/auth?response_type=code&client_id=YOUR_APP_ID.apps.googleusercontent.com&access_type=offline&scope=https://www.googleapis.com/auth/analytics.readonly&redirect_uri=HTTP://YOUR_CALL_BACK_URL

YOUR_APP_IDYOUR_CALL_BACK_URL 更改为相应的值。

重要的是包括 access_type=offline

点击授权访问按钮,将重定向到 HTTP://YOUR_CALL_BACK_URL?code=THIS_IS_YOUR_CODE。复制 URL 中的代码。

使用 CMD 提示符请求刷新令牌以获取代码。

curl -d "code=THIS_IS_YOUR_CODE&client_id=YOUR_APP_ID.apps.googleusercontent.com&client_secret=YOUR_APPS_SECRET_CODE&redirect_uri=HTTP://YOUR_CALL_BACK_URL&grant_type=authorization_code" https://accounts.google.com/o/oauth2/token
改变 THIS_IS_YOUR_CODE, YOUR_APP_ID, YOUR_APPS_SECRET_CODE, YOUR_CALL_BACK_URL 的值为相关值。
记录返回的refresh_token
下载最新版本的Core Reporting V3.0 .net库 http://code.google.com/p/google-api-dotnet-client/wiki/Downloads 当前版本Google.Apis.Analytics.v3.cs中存在一个错误,为了修复它,请将此文件中的代码复制到本地解决方案中(不要引用Google.Apis.Analytics.v3.bin) http://code.google.com/p/google-api-dotnet-client/source/browse/Services/Google.Apis.Analytics.v3.cs?repo=samples&name=20111123-1.1.4344-beta 并将属性Dimensions从 List<system.string> 更改为string
否则你会像我和这个人一样遇到一个错误 http://www.evolutiadesign.co.uk/blog/using-the-google-analytics-api-with-c-shar/ 然后使用您的Refresh Token,在没有用户交互的情况下生成Access Token,并使用Access Token针对Google Analytics运行报告。
using System;
using DotNetOpenAuth.OAuth2;
using Google.Apis.Authentication.OAuth2;
using AnalyticsService = Google.Apis.Analytics.v3.AnalyticsService;

class Program
    {
        public static void Main()
        {
            var client = new WebServerClient(GoogleAuthenticationServer.Description, "YOUR_APP_ID.apps.googleusercontent.com", "YOUR_APPS_SECRET_CODE");
            var auth = new OAuth2Authenticator<WebServerClient>(client, Authenticate);
            var asv = new AnalyticsService(auth);
            var request = asv.Report.Get("2012-02-20", "2012-01-01", "ga:visitors", "ga:YOUR_GOOGLE_ANALYTICS_ACCOUNT_ID");
            request.Dimensions = "ga:pagePath";
            request.Sort = "-ga:visitors";
            request.MaxResults = 5;
            var report =  request.Fetch();
            Console.ReadLine();
        }

        private static IAuthorizationState Authenticate(WebServerClient client)
        {
            IAuthorizationState state = new AuthorizationState(new string[]{}) { RefreshToken = "REFRESH_TOKEN" };

            client.RefreshToken(state);
            return state;
        }
    }

1
我正在尝试使用您编写的代码,但是当我尝试编译时,它失败了。 它给了我以下错误: 错误2 参数1:无法将“Google.Apis.Authentication.OAuth2.OAuth2Authenticator<DotNetOpenAuth.OAuth2.WebServerClient>”转换为“Google.Apis.Services.BaseClientService.Initializer” H:\ vs12 \ ManagementAPI \ ManagementAPI \ Models \ Value.cs 27 44 ManagementAPI - Edo Post
1
它在以下行上失败: var asv = new AnalyticsService(auth);auth 是这个: var auth = new OAuth2Authenticator<WebServerClient>(client, Authenticate);在第一个语句之前调用(如上面的代码)。 - Edo Post
1
这段代码是有效的:var auth = new OAuth2Authenticator<WebServerClient>(client, Authenticate); var initialzr = new Google.Apis.Services.BaseClientService.Initializer(); initialzr.Authenticator = auth; var asv = new Google.Apis.Analytics.v3.AnalyticsService(initialzr); - Matan L
1
你也可以使用 https://developers.google.com/oauthplayground/ 来获取刷新令牌。 - LeZuse
你好!谢谢你的解释。我遇到了同样的问题,但我不确定你代码的哪一部分与修复此问题有关。我在这里发布了我的问题:http://stackoverflow.com/questions/22144085/error-could-not-load-type-google-apis-authentication-iauthenticator-from-asse 谢谢。 - WhoAmI
显示剩余2条评论

4
伊恩的回答很好,对我比其他任何网上找到的回答都更有帮助,让我朝着正确方向前进。AnalyticsService对象中一定有些变化,因为这行代码:
var request = asv.Report.Get("2012-02-20", "2012-01-01", "ga:visitors", "ga:YOUR_GOOGLE_ANALYTICS_ACCOUNT_ID");

对我没有起作用,我不得不使用以下方法:

var request = asv.Data.Ga.Get("ga:YOUR_GOOGLE_ANALYTICS_ACCOUNT_ID", "2012-01-01", "2012-02-20", "ga:visitors");

希望这篇文章能够像你的回答那样帮助其他人。谢谢!

1
Ian的回答对我很有帮助,但我在运行curl命令时一直出错。经过一些研究,发现获取访问代码和刷新令牌的步骤可以通过转到https://code.google.com/oauthplayground/并检查您的oAuth配置设置来更轻松地完成。页面右上角有一个设置按钮。选择“使用您自己的OAuth凭据”。您可以从这里获取访问代码并请求刷新令牌。
希望这会有所帮助。

0

您可以从OAuth Playground手动获取刷新令牌。

如果您需要一个服务帐户的刷新令牌,确保您:
  1. 点击右侧的设置。
  2. 勾选使用您自己的OAuth凭据
  3. 填写您的客户端ID和密钥
  4. 关闭设置
  5. 点击步骤2中的刷新按钮
  6. 然后保存刷新令牌以供应用程序使用

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接