设置Google Reporting API以在cronjob中工作

时间:2017-07-25 13:42:20

标签: php google-analytics-api

我设法建立了一个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中工作。

0 个答案:

没有答案