我设法建立了一个PHP脚本来抓取我们的Google Analytics帐户中的数据,并且可以在浏览器中运行这个数据,但我很难弄清楚如何让它在cronjob脚本中运行。
这是我的代码:
<?php
// Load the Google API PHP Client Library.
require_once dirname(__FILE__) . '/analytics/google-api-php-client-2.2.0/vendor/autoload.php';
session_start();
$client = new Google_Client();
$client->setAuthConfig(dirname(__FILE__) . '/analytics/client_secrets.json');
$client->setAccessType("offline"); //offline access
$client->addScope(Google_Service_Analytics::ANALYTICS_READONLY);
if (isset($_SESSION['access_token']) && $_SESSION['access_token']) {
print "<br />start: ".date("H:i:s")."<br />";
// Set the access token on the client.
$client->setAccessToken($_SESSION['access_token']);
$sessionid = $_SESSION['access_token']['access_token'];
// Create an authorized analytics service object.
$analytics = new Google_Service_AnalyticsReporting($client);
$view_id = urlencode("ga:XXXXXX");
$start_date = "yesterday"; //can be words or dates in Y-m-d
$end_date = "yesterday"; //can be words or dates in Y-m-d
$metrics = urlencode("ga:transactions");
$dimensions = urlencode("ga:transactionId,ga:date,ga:orderCouponCode");
$sort = "ga:date"; //for DESC use -FIELD e.g. -ga:date
$sampling = "HIGHER_PRECISION"; //https://developers.google.com/analytics/devguides/reporting/core/v3/reference#samplingLevel
$limit = "10000";
$filters = urlencode("ga:orderCouponCode!=(not set)");
$params = "ids=$view_id&start-date=$start_date&end-date=$end_date&metrics=$metrics&dimensions=$dimensions&filters=$filters&sort=$sort&samplingLevel=$sampling&max-results=$limit&access_token=$sessionid";
$data = file_get_contents("https://www.googleapis.com/analytics/v3/data/ga?$params");
$json_data = json_decode($data);
print "<pre>";
print_r($json_data);
print "</pre>";
} else {
// Handle authorization flow from the server.
if (! isset($_GET['code'])) {
$auth_url = $client->createAuthUrl();
header('Location: ' . filter_var($auth_url, FILTER_SANITIZE_URL));
} else {
$client->authenticate($_GET['code']);
$_SESSION['access_token'] = $client->getAccessToken();
$redirect_uri = 'http://' . $_SERVER['HTTP_HOST'] . '/cronjobs/ga_coupon_codes.php';
header('Location: ' . filter_var($redirect_uri, FILTER_SANITIZE_URL));
}
}
print "<br />end: ".date("H:i:s")."<br />";
当我的cronjob运行时,服务器向我发送一封电子邮件,说它已经完成运行。我期待在响应中打印出“开始”和“结束”时间,以及JSON数据,但是在“结束”时间回来的唯一事情,让我相信它没有贯穿始终它的主要部分。
我知道它不起作用的主要原因是由于认证位。在cronjob中我不能使用标题('location:URL')但我无法弄清楚要改变它的内容以使其有效。
当我设置帐户时,它是作为服务帐户创建的,我可以在API控制台中看到我有服务帐户密钥。
我还有一个OAuth 2.0客户端ID(这是客户端screts JSON文件中的内容)。如果我在浏览器中运行此操作,即使在一小时后用完(获取新的访问令牌),我也可以使连接正常工作。
我已经搜索了很长一段时间,并发现添加“离线访问”应该会有所帮助,但显然我仍在使用header()函数。我找不到让我使用的例子,这对我来说是可以理解的,我真的很想让它在cronjob中工作。