首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Google Analytics API V3 / OAuth 2

Google Analytics API V3 / OAuth 2
EN

Stack Overflow用户
提问于 2012-12-13 23:02:10
回答 3查看 12.1K关注 0票数 8

我拼命地试图自己解决这个问题,也不想用这个问题来解决这个问题,但我已经束手无策了(多亏了api / oauth文档)。

我在PHP中工作,我试图通过在analytics.data.ga.get方法上使用REST来避免使用Google_ClientAnalyticsService类。

STEP #1: Create an API Project for a Web Application

我转到api console并使用分析服务创建了一个项目,并获得了一个OAuth客户端ID和密码。

我的印象是我可以为Installed ApplicationWeb Application创建客户端ID,因为我将手动执行初始令牌握手。如果我说错了,请纠正我。

我为web应用程序创建了一个客户端ID,并获得了客户端ID xxxxxxxxxxxxxx.apps.googleusercontent.com、客户端密钥yyyyyyyyyyyyyyy和重定向URI http://localhost:9002

STEP #2: Request initial API access

我进入这个链接;https://accounts.google.com/o/oauth2/auth?response_type=code&client_id=xxxxxxxxxxxxxx.apps.googleusercontent.com&redirect_uri=http://localhost:9002&scope=https://www.googleapis.com/auth/analytics.readonly&access_type=offline

access_type=offline是因为我使用的是REST,不希望“用户”(我自己)在每次需要刷新令牌时都手动处理重定向/弹出窗口。

上述请求返回http://localhost:9002?code=4/KModH0K_xxxxxxxxxxxxxxxxxxx9Iw.gikOaYRDWywTshQV0ieZDArCOX8XdwI

Code 4/KModH0K_xxxxxxxxxxxxxxxxxxx9Iw.gikOaYRDWywTshQV0ieZDArCOX8XdwI是我请求接口Token的权限。

STEP #3: Request First Token

由于我的公司的IT问题,我被迫使用PHP5.2.17,我不能访问PHP,所以我使用file_get_contentsstream_context_create

第一个令牌是用PHP file_get_contents()请求的;

代码语言:javascript
运行
复制
$opts = array(
    'http' => array(
        'method' => 'POST',
        'header' => 'Content-Type: application/x-www-form-urlencoded',
        'content' => 'code=4/KModH0K_xxxxxxxxxxxxxxxxxxx9Iw.gikOaYRDWywTshQV0ieZDArCOX8XdwI&client_id=xxxxxxxxxxxxxx.apps.googleusercontent.com&client_secret=yyyyyyyyyyyyyyy&redirect_uri=http://localhost:9002&grant_type=authorization_code'
    )
);

$context = stream_context_create($opts);

$result = file_get_contents('https://accounts.google.com/o/oauth2/token', false, $context);
var_dump($result);

内容参数必须在一行中。

上面的代码返回json格式的access_tokenrefresh_token

string(195) "{ "access_token" : "ya29.AHES6wwwwwwwwwwwwwwwVEBXE6XRbC-Q-pP0wZWdoIm9H804ro", "token_type" : "Bearer", "expires_in" : 3600, "refresh_token" : "1/8tXvdUKcSEcaaxVqqqqqqqqqqqqqoYpj2KSS9qwWI" }"

我必须将刷新令牌存储在一个安全的地方,比如DB或受保护的txt文件,当我的access_token超时时会调用它。

STEP #4: Request Analytics Data

现在据我所知,我已经准备好了,应该能够使用我的access_tokenhttps://www.googleapis.com/analytics/v3/data/ga发出请求了。

我通过发送这个请求来做到这一点;

代码语言:javascript
运行
复制
$request = 'https://www.googleapis.com/analytics/v3/data/ga' .
    '?ids=ga%3Aaaaaaaaa' .
    '&start-date=2012-12-07' .
    '&end-date=2012-12-09' .
    '&metrics=ga%3Avisits';

$opts = array(
    'http' => array(
        'method' => 'GET',
        'header' => 'Content-Type: application/x-www-form-urlencoded\r\n' .
                    'Authorization: Bearer ya29.AHES6wwwwwwwwwwwwwwwVEBXE6XRbC-Q-pP0wZWdoIm9H804ro \r\n'
        )
);

$context = stream_context_create($opts);

$result = file_get_contents($request, FALSE, $context);
var_dump($result);

此请求返回401 Unauthorized错误。我认为这意味着我的请求格式正确,并与https://www.googleapis.com/analytics/v3/data/ga建立了连接。

另外,根据这个文档Getting Full Quota,我可以像这样用URL中的access_token发出请求;

代码语言:javascript
运行
复制
$request = 'https://www.googleapis.com/analytics/v3/data/ga' .
    '?ids=ga%3A48564799' .
    '&access_token=ya29.AHES6wwwwwwwwwwwwwwwVEBXE6XRbC-Q-pP0wZWdoIm9H804ro' .
    '&start-date=2012-12-07' .
    '&end-date=2012-12-09' .
    '&metrics=ga%3Avisits';

$result = file_get_contents($request, FALSE);

$result = json_decode($result);

var_dump($result);

这一次我收到了403 error,其中google包含了响应User does not have sufficient permissions for this profile

QUESTION #1

我是不是在API控制台或令牌获取过程中遗漏了什么?我假设我不是,因为我最终将获得access_token=ya29和刷新标记。

QUESTION #2也许我假设我可以用简单的https请求来做这件事,这是完全错误的?我必须使用Google_ClientAnalyticsService类吗?我不认为是这样的,但也许我错了。

QUESTION #3我需要在我的请求中使用‘key’吗?&key=bbbbbbbbbbbbbbbb

QUESTION #4

通过使用PHP 5.2.17,我是否遗漏了什么?(除了5.3或5.4本身)

例如,在某些版本的PHP中,在stream_context_create中,头文件应该在数组中,而不是字符串中,如下所示;

代码语言:javascript
运行
复制
$opts = array(
    'http' => array(
        'method' => 'GET',
        'header' => array(
            'Content-Type: application/x-www-form-urlencoded',
            'Authorization: Bearer ya29.AHES6wwwwwwwwwwwwwwwVEBXE6XRbC-Q-pP0wZWdoIm9H804ro '
        )
    )
);

但我不认为这对我来说是个问题。我只是好奇这些HTTP请求是否需要以不同的方式形成(不使用curl)。

如有任何见解和想法,我们将不胜感激。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-12-15 06:03:01

这是我犯的愚蠢的错误,几乎让我心脏病发作。

我通常使用Chrome进行开发工作。我的Chrome浏览器登录到了我的gmail账户personal@gmail.com。然而,我的分析账户,在我的work@gmail.com下,是在FireFox中打开的(尽量不要笑得很难看)。

我不能百分之百确定这是正确的,但我认为这是一般的流程。当我做STEP #2: Request initial API access的时候,我在我的Chrome浏览器中做了这件事。终结点https://accounts.google.com/o/oauth2/auth正在授权我的personal@gmail.com帐户。我的第四步应用编程接口请求https://www.googleapis.com/analytics/v3/data/ga在我的personal@gmail.com账户下寻找一个分析配置文件。当然这并不存在。

我真的在这上面浪费了15个小时。这比尝试对更新…进行故障排除更愚蠢并且忘记刷新高速缓存。

很抱歉浪费了你的时间。

编辑刷新标记

我再次遇到了这个API的问题,并发现如果太多不同的客户端使用令牌,GA将以一种艰难的方式撤销刷新令牌,至少我认为这就是问题所在。

进一步的阅读可以是found here

票数 13
EN

Stack Overflow用户

发布于 2013-04-03 21:51:52

我今天得到了一个403,并找到了原因:在get函数中,我使用了账号ID而不是个人资料ID,切换到个人资料ID为我解决了这个问题。

票数 10
EN

Stack Overflow用户

发布于 2015-06-23 14:25:50

这可能是CURL请求存在问题。在GoogleAnalyticsAPI.class.php > class Http > function curl (around line 720)中再添加一个选项,以阻止CURL验证对等方的证书:

curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13862589

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档