Пытаюсь сохранить токен для AdSense API

Мне удалось подключиться к AdSense API и создать отчет. Тем не менее, он требует входа в систему каждый раз, когда я его запускаю, поэтому он не будет работать как задание cron.

Я нашел несколько других вопросов, связанных с этим. Одни советуют сервисный аккаунт, другие отмечают, что сервисный аккаунт не работает с AdSense. Предлагаемое решение состоит в том, чтобы хранить токен на моем сервере, но я изо всех сил пытался заставить его работать. Вот мой код на данный момент (который работает, но требует ручного входа):

$scriptUri = "http://".$_SERVER["HTTP_HOST"].$_SERVER['PHP_SELF'];

$client = new Google_Client();
$client->addScope('https://www.googleapis.com/auth/adsense.readonly');
$client->setAccessType('offline');
$client->setApplicationName('My Application name');
$client->setClientId(' MY ID ');
$client->setClientSecret(' MY SECRET ');
$client->setRedirectUri($scriptUri);
$client->setDeveloperKey(' MY KEY '); // API key

$accountId = " MY ACCOUNT " ;
$adClientId = " MY CLIENT " ;


// $service implements the client interface, has to be set before auth call
$service = new Google_Service_AdSense($client);

if (isset($_GET['logout'])) { // logout: destroy token
    unset($_SESSION['token']);
    die('Logged out.');
}

if (isset($_GET['code'])) { // we received the positive auth callback, get the token and store it in session
    $client->authenticate($_GET['code']);
    $_SESSION['token'] = $client->getAccessToken();
}

if (isset($_SESSION['token'])) { // extract token from session and configure client
    $token = $_SESSION['token'];
    $client->setAccessToken($token);
}

if (!$client->getAccessToken()) { // auth call to google
    $authUrl = $client->createAuthUrl();
    header("Location: ".$authUrl);
    die;
}

$startDate = '2015-11-01';
$endDate = 'today';
$optParams = array(
  'metric' => array(
    'EARNINGS'),
  'dimension' => array('DATE'),
  'sort' => '+DATE',
  'filter' => array(
    'CUSTOM_CHANNEL_NAME==Mega Seating Plan'
  )
);
// Run report.
$report = $service->accounts_reports->generate($accountId, $startDate,
    $endDate, $optParams);
if (isset($report) && isset($report['rows'])) {


  // Get results.
  foreach($report['rows'] as $row) {

    $date = $row[0] ;
    $earnings[$date] = $row[1] ;  


  }
} else {
  print "No rows returned.\n";
}

Может ли кто-нибудь дать мне какие-либо указания о том, как я могу включить хранилище токенов в приведенный выше код, пожалуйста?


person Rob    schedule 25.05.2017    source источник
comment
Взгляните на мой ответ здесь - stackoverflow.com/questions/35591224/ - вы правы, токен не будет работать на cron, так как он действителен только в течение часа. Вместо этого сохраните токен обновления где-нибудь (БД, файл, жесткий код) и используйте его для подключения в своем задании cron.   -  person jkns.co    schedule 30.05.2017
comment
@ jkns.co Спасибо, ваш предыдущий ответ мне очень помог.   -  person Rob    schedule 05.06.2017


Ответы (1)


Спасибо @jkns.co за предыдущий ответ здесь, который помог мне заставить его работать.

Вот мой окончательный код:

$scriptUri = "I HAD TO PUT MY ABSOLUTE URL HERE, OTHERWISE THE CRON JOB WOULD LOOK IN THE WRONG PLACE" ;

$client = new Google_Client();
$client->addScope('https://www.googleapis.com/auth/adsense.readonly');
$client->setAccessType('offline');
$client->setApprovalPrompt ("force");  // This line had to be added to force the approval prompt and request a new token
$client->setApplicationName('My Application name');
$client->setClientId('BLAH');
$client->setClientSecret('BLAH');
$client->setRedirectUri($scriptUri);
$client->setDeveloperKey('BLAH'); // API key

$accountId = "BLAH" ;
$adClientId = "BLAH" ;


// $service implements the client interface, has to be set before auth call
$service = new Google_Service_AdSense($client);

if (isset($_GET['logout'])) { // logout: destroy token
    unset($_SESSION['token']);
    die('Logged out.');
}

if (isset($_GET['code'])) { // we received the positive auth callback, get the token and store it in session
    $client->authenticate($_GET['code']);
    $_SESSION['token'] = $client->getAccessToken();

    // If it successfully authenticates, I request the refresh token
    $refreshToken = $client->getRefreshToken();

    storeRefreshToken($refreshToken) ;  // This function stores the token in MySQL
}

else {      // Otherwise it loads the refresh token from MySQL


    $refreshToken = getRefreshToken() ;



    $client->refreshToken($refreshToken);
    $_SESSION['token'] = $client->getAccessToken();

}

if (isset($_SESSION['token'])) { // extract token from session and configure client
    $token = $_SESSION['token'];
    $client->setAccessToken($token);


}

if (!$client->getAccessToken()) { // auth call to google
    $authUrl = $client->createAuthUrl();
    header("Location: ".$authUrl);
    die;
}
person Rob    schedule 05.06.2017