4

我想通过背景cron作业将数据从谷歌分析引入到自己的数据库中,而用户不必每次都进行身份验证。如何从服务器端后台服务访问Google AnalyticsAPI?

我知道how to get an Google Analytics OAuth Access Token with user interaction,正如我以前问。使用OAuth将不起作用,因为它需要用户交互。根据Google Analytics API Reference OAuth和访问令牌可用于访问每个会话基础的页面统计信息。不过,我正在寻找一种持久的方式来在后台服务中实现这一点。

如何在没有用户身份验证的情况下访问Google Analytics或获取无效访问令牌?

回答

4

假设有问题的帐户是您自己的,您可以使用service account。确保您将帐户级别的服务帐户电子邮件地址读取权限授予Google Analytics帐户,并且可以读取您的数据。

<?php 
session_start(); 
require_once 'Google/Client.php'; 
require_once 'Google/Service/Analytics.php'; 

/************************************************ 
    The following 3 values an befound in the setting 
    for the application you created on Google 
    Developers console. 
    The Key file should be placed in a location 
    that is not accessable from the web. outside of 
    web root. 

    In order to access your GA account you must 
    Add the Email address as a user at the 
    ACCOUNT Level in the GA admin. 
************************************************/ 
$client_id = '1046123799103-nk421gjc2v8mlr2qnmmqaak04ntb1dbp.apps.googleusercontent.com'; 
$Email_address = '[email protected]eaccount.com'; 
$key_file_location = '629751513db09cd21a941399389f33e5abd633c9-privatekey.p12'; 

$client = new Google_Client(); 
$client->setApplicationName("Client_Library_Examples"); 

$key = file_get_contents($key_file_location); 

// seproate additional scopes with a comma 
$scopes ="https://www.googleapis.com/auth/analytics.readonly"; 

$cred = new Google_Auth_AssertionCredentials(
    $Email_address, 
    array($scopes), 
    $key 
    ); 

$client->setAssertionCredentials($cred); 
if($client->getAuth()->isAccessTokenExpired()) { 
    $client->getAuth()->refreshTokenWithAssertion($cred); 
} 

$service = new Google_Service_Analytics($client); 
$accounts = $service->management_accountSummaries->listManagementAccountSummaries(); 

//calulating start date 
$date = new DateTime(date("Y-m-d")); 
$date->sub(new DateInterval('P10D')); 

//Adding Dimensions 
$params = array('dimensions' => 'ga:userType'); 
// requesting the data 
$data = $service->data_ga->get("ga:78110423", $date->format('Y-m-d'), date("Y-m-d"), "ga:users,ga:sessions", $params); 


?><html> 
<?php echo $date->format('Y-m-d') . " - ".date("Y-m-d"). "\n";?> 
<table> 
<tr> 
<?php 
//Printing column headers 
foreach($data->getColumnHeaders() as $header){ 
    print "<td>".$header['name']."</td>"; 
} 
?> 
</tr> 
<?php 
//printing each row. 
foreach ($data->getRows() as $row) {  
    print "<tr><td>".$row[0]."</td><td>".$row[1]."</td><td>".$row[2]."</td></tr>"; 
} 

//printing the total number of rows 
?> 
<tr><td colspan="2">Rows Returned <?php print $data->getTotalResults();?> </td></tr> 
</table> 
</html> 
<?php 

?> 

代码教程撕开Google Service Account with PHP

如果这不是您的帐户,然后就可以使用正常的oauth2方法要求使用你使用刷新令牌认证一次,那么你就能够访问数据。使用您之前问题的代码。

+0

'在D:\ xampp \ htdocs \ ga_api \ google-api-php中发生'未知的异常'Google_Auth_Exception'消息'错误刷新OAuth2令牌,消息:'{“error”:“invalid_grant”}“ -client-master \ src \ Google \ Auth \ OAuth2.php:358'你能告诉我什么是错的吗? – Sayed 2015-02-25 07:13:03

+0

检查您的计算机上的Google无效授权时间。在使用它之前,验证过期是错误的。 – DaImTo 2015-02-25 07:14:54

+0

如果您可以回答,我该如何与Google同步我的机器的时间? – Sayed 2015-02-25 07:33:38