我已经拼命试图自己解决这个问题了,并且不想带着这个问题来解决这个问题,但是我的智慧结束了(不用了api / oauth docs)。
我正在使用PHP,我试图通过在Google_Client
方法上使用REST来避免使用AnalyticsService
和analytics.data.ga.get
类。
STEP #1: Create an API Project for a Web Application
我转到api console并使用分析服务创建项目并获取OAuth客户端ID和密钥。
我的印象是我可以为Installed Application或Web Application创建客户端ID,因为我正在手动进行初始令牌握手。如果我错了,请纠正我。
我为网络应用程序创建了一个客户端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
代码4/KModH0K_xxxxxxxxxxxxxxxxxxx9Iw.gikOaYRDWywTshQV0ieZDArCOX8XdwI
是我获得API令牌请求的权限。
STEP #3: Request First Token
由于我公司的IT问题,我被迫使用PHP 5.2.17并且我无法访问PHP cURL,所以我使用的是file_get_contents
和stream_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_token
和refresh_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_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);
此请求返回401 Unauthorized
错误。我认为这意味着我的请求已正确形成并与https://www.googleapis.com/analytics/v3/data/ga
建立连接。
此外,根据此文档Getting Full Quota,我可以像这样在网址中使用access_token
发出请求;
$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_Client
和AnalyticsService
类吗?我不认为是这种情况,但也许我错了。
QUESTION #3
我是否需要在请求中使用“密钥”?
&key=bbbbbbbbbbbbbbbb
QUESTION #4
使用PHP 5.2.17 am我遗漏了什么? (除了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)。
任何见解和想法将不胜感激答案 0 :(得分: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
正在授权我的personal@gmail.com帐户。我的STEP#4 API请求https://www.googleapis.com/analytics/v3/data/ga
正在我的personal@gmail.com帐户下查找分析配置文件。当然不存在。
我真的浪费了15个小时。这比尝试解决更新问题笨拙......并且忘记刷新缓存。
抱歉浪费你的时间。
编辑 REFRESH TOKENS
我再一次遇到这个API的问题,并发现如果有太多不同的客户使用令牌,GA将撤销刷新令牌的困难方式,至少我认为这是问题所在。
进一步阅读可以是found here。
答案 1 :(得分:10)
我今天收到了403并找到了原因:在get
功能中,我使用的是帐户ID而不是个人资料ID。切换到配置文件ID为我修复了它。
答案 2 :(得分:0)
这可能是CURL请求的问题。在GoogleAnalyticsAPI.class.php > class Http > function curl (around line 720)
中添加一个选项以阻止CURL验证对等方的证书:
<强> curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
强>