Google AnalyticsAPI V3/OAuth 2

bmo*_*ate 8 google-analytics google-analytics-api

我已经拼命想要自己解决这个问题,并且不想带着这个问题来解决这个问题,但是我的智慧结束了(不是因为api/oauth docs).

我正在使用PHP,我试图通过在方法上使用REST 来避免使用Google_ClientAnalyticsServiceanalytics.data.ga.get.

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

我转到api控制台并使用分析服务创建一个项目并获取OAuth客户端ID和密钥.

我的印象是我可以为已安装的应用程序Web应用程序创建客户端ID,因为我正在手动进行初始令牌握手.如果我错了,请纠正我.

我为Web应用程序创建了一个客户端ID,并获取了我的客户端ID xxxxxxxxxxxxxx.apps.googleusercontent.com,客户端密码yyyyyyyyyyyyyyy和我的重定向URIhttp://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

代码4/KModH0K_xxxxxxxxxxxxxxxxxxx9Iw.gikOaYRDWywTshQV0ieZDArCOX8XdwI是我的许可,可以请求API令牌.

STEP #3: Request First Token

由于我公司的IT问题,我被迫使用PHP 5.2.17并且我无法访问PHP cURL,因此我正在使用file_get_contentsstream_context_create.

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

$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);
Run Code Online (Sandbox Code Playgroud)

内容参数必须在一行中.

上面的代码返回我access_tokenrefresh_tokenjson格式

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_token请求https://www.googleapis.com/analytics/v3/data/ga.

我通过发送此请求来执行此操作;

$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);
Run Code Online (Sandbox Code Playgroud)

此请求返回401 Unauthorized错误.我认为这意味着我的请求已正确形成并建立连接https://www.googleapis.com/analytics/v3/data/ga.

此外,根据此文档获取完整配额,我可以使用access_tokenURL中的请求,这样做;

$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);
Run Code Online (Sandbox Code Playgroud)

这次我收到403 error了谷歌包含的回复User does not have sufficient permissions for this profile.

QUESTION #1

我是否遗漏了API控制台或令牌获取过程中的某些内容?我假设我不是,因为我最终获得access_token=ya29并刷新令牌.

QUESTION #2 也许我完全不在假设我可以用简单的https要求做到这一点?我必须使用Google_ClientAnalyticsService类吗?我不认为是这种情况,但也许我错了.

QUESTION #3 我是否需要在请求中使用"密钥"? &key=bbbbbbbbbbbbbbbb

QUESTION #4

通过使用PHP 5.2.17我错过了什么?(除了5.3或5.4本身)

例如,在PHP的某些版本中stream_context_create,标题应该在数组中而不是字符串,就像这样;

$opts = array(
    'http' => array(
        'method' => 'GET',
        'header' => array(
            'Content-Type: application/x-www-form-urlencoded',
            'Authorization: Bearer ya29.AHES6wwwwwwwwwwwwwwwVEBXE6XRbC-Q-pP0wZWdoIm9H804ro '
        )
    )
);
Run Code Online (Sandbox Code Playgroud)

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

任何见解和想法将不胜感激

bmo*_*ate 13

这是我昏暗的错误,几乎让我心脏病发作.

我通常在Chrome中进行开发工作.我的Chrome浏览器已登录到我的Gmail帐户personal@gmail.com.但是,我的分析帐户,在我的work@gmail.comFireFox中是开放的(尽量不要笑到很难).

我不是100%确定这是正确的,但我认为这是一般的流程.当我这样做时STEP #2: Request initial API access,我在Chrome浏览器中执行了此操作.端点https://accounts.google.com/o/oauth2/auth正在授权我的personal@gmail.com帐户.我的STEP#4 API请求https://www.googleapis.com/analytics/v3/data/ga正在我的personal@gmail.com帐户下查找分析配置文件.这当然不存在.

我真的浪费了15个小时.这比尝试解决更新问题笨拙......并且忘记刷新缓存.

抱歉浪费你的时间.

编辑 REFRESH TOKENS

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

进一步阅读可以在这里找到.


Spi*_*nal 10

我今天得到了403并找到了原因:在get我使用帐户ID而不是配置文件ID的功能中.切换到个人资料ID为我修复了它.

  • 是的,这是正确的,它始终是"个人资料ID",而不是帐户或属性ID(看起来像"UA-xxx").配置文件ID用于特定的Web属性,可以在Admin-> Profiles-> Profile Settings选项卡中找到,它是一个没有破折号的整数. (4认同)