8

我拼命地试图自己解决这个问题,并且不想带着这个问题来解决这个问题,但我束手无策(不感谢 api / oauth 文档)。

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

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

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

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

我为 Web 应用程序创建了一个 Client ID 并获取了我的 Client ID xxxxxxxxxxxxxx.apps.googleusercontent.com、 Client secret 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

代码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);

内容参数必须在一行中。

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

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

我必须将刷新令牌存储在安全的地方,例如数据库或受保护的 txt 文件,当我的 access_token 超时时调用它。

STEP #4: Request Analytics Data

现在,据我了解,我已经准备好滚动并且应该能够使用 myaccess_tokenhttps://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);

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

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

$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=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 '
        )
    )
);

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

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

3 回答 3

13

这是我愚蠢的错误,差点让我心脏病发作。

我通常在 Chrome 中进行开发工作。我的 Chrome 浏览器已登录到我的 gmail 帐户personal@gmail.com。但是,我的分析帐户work@gmail.com在 FireFox 中打开(尽量不要笑得太厉害)。

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

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

很抱歉浪费您的时间。

编辑刷新令牌

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

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

于 2012-12-14T22:03:00.857 回答
10

我今天收到了 403 并找到了原因:在get函数中我使用了帐户 ID 而不是配置文件 ID。切换到配置文件 ID 为我修复了它。

于 2013-04-03T13:51:52.053 回答
0

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

curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);

于 2015-06-23T06:25:50.180 回答