2015-01-15 11 views
1

Отсюда: Google AdSense API asking for log in each timeGoogle AdSense API токен обновления не работает

Я попробовал и это сработало в первый раз, но на следующий день, сценарий побежал и получил ошибку: Uncaught исключение «Google_Auth_Exception» с сообщением ' Ток доступа OAuth 2.0 истек, и токен обновления недоступен. Обновленные токены не возвращаются для ответов, которые были автоматически одобрены. ' в /home/mathcelebrity/public_html/Google/Auth/OAuth2.php:227

Так что я нашел эту тему и попытался Ответ # 5 и получить ошибку выше: How to refresh token with Google API client?

Все, что я хочу эту вещь, чтобы сделать ведется ночно без разрешения. На заднем фоне.

<?php 
require_once 'templates/base.php'; 
session_start(); 
include('config.php'); 

set_include_path('/path/to/clientlib' . PATH_SEPARATOR . get_include_path()); 
set_include_path('/path/to/clientlib' . PATH_SEPARATOR . get_include_path()); 
require_once 'Google/Client.php'; 
require_once 'Google/Service/AdSense.php'; 
require_once 'Google/Service/AdSense.php'; 
// Autoload example classes. 

include 'examples/GetAllAccounts.php'; 
include 'examples/GetAccountTree.php'; 
include 'examples/GetAllAdClients.php'; 
include 'examples/GetAllAdUnits.php'; 
include 'examples/GetAllCustomChannelsForAdUnit.php'; 

include 'examples/GetAllCustomChannels.php'; 
include 'examples/GetAllAdUnitsForCustomChannel.php'; 
include 'examples/GetAllUrlChannels.php';//GetAllUrlChannels 
include 'examples/GenerateReport.php';//GenerateReport 
include 'examples/GenerateReportWithPaging.php';//GenerateReportWithPaging 
include 'examples/FillMissingDatesInReport.php';//FillMissingDatesInReport 
include 'examples/CollateReportData.php';//CollateReportData 
include 'examples/GetAllSavedReports.php';//GetAllSavedReports 
include 'examples/GenerateSavedReport.php';//GenerateSavedReport 
include 'examples/GetAllSavedAdStyles.php';//GetAllSavedAdStyles 
include 'examples/GetAllAlerts.php';//GetAllAlerts 
include 'examples/GetAllDimensions.php';//GetAllDimensions 
include 'examples/GetAllMetrics.php';//GetAllMetrics 
// Max results per page. 
define('MAX_LIST_PAGE_SIZE', 50, true); 
define('MAX_REPORT_PAGE_SIZE', 50, true); 
// Configure token storage on disk. 
// If you want to store refresh tokens in a local disk file, set this to true. 
define('STORE_ON_DISK', true, true); 
define('TOKEN_FILENAME', 'tokens.dat', true); 
// Set up authentication. 
$client = new Google_Client(); 
$client->addScope('https://www.googleapis.com/auth/adsense.readonly'); 
$client->setAccessType('offline'); 
// Be sure to replace the contents of client_secrets.json with your developer 
// credentials. 
$client->setAuthConfigFile('client_secrets.json'); 
// Create service. 
$service = new Google_Service_AdSense($client); 
// If we're logging out we just need to clear our local access token. 
// Note that this only logs you out of the session. If STORE_ON_DISK is 
// enabled and you want to remove stored data, delete the file. 

if (isset($_REQUEST['logout'])) { 
    unset($_SESSION['access_token']); 
} 
// If we have a code back from the OAuth 2.0 flow, we need to exchange that 
// with the authenticate() function. We store the resultant access token 
// bundle in the session (and disk, if enabled), and redirect to this page. 
if (isset($_GET['code'])) { 
    $client->authenticate($_GET['code']); 
// Note that "getAccessToken" actually retrieves both the access and refresh 
// tokens, assuming both are available. 
    $google_token = json_decode($_SESSION['access_token']); 
    $client->refreshToken($google_token->refresh_token); 
    $_SESSION['access_token'] = $client->getAccessToken(); 
    if (STORE_ON_DISK) { 
     file_put_contents(TOKEN_FILENAME, $_SESSION['access_token']); 
    } 
    $redirect = 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF']; 
    header('Location: ' . filter_var($redirect, FILTER_SANITIZE_URL)); 
    exit; 
} 
// If we have an access token, we can make requests, else we generate an 
// authentication URL. 
if (isset($_SESSION['access_token']) && $_SESSION['access_token']) { 
    $client->setAccessToken($_SESSION['access_token']); 
} else if (STORE_ON_DISK && file_exists(TOKEN_FILENAME) && 
    filesize(TOKEN_FILENAME) > 0) { 
// Note that "setAccessToken" actually sets both the access and refresh token, 
// assuming both were saved. 
    $client->setAccessToken(file_get_contents(TOKEN_FILENAME)); 
    $_SESSION['access_token'] = $client->getAccessToken(); 
} else { 
// If we're doing disk storage, generate a URL that forces user approval. 
// This is the only way to guarantee we get back a refresh token. 
    if (STORE_ON_DISK) { 
     $client->setApprovalPrompt('force'); 
    } 
    $authUrl = $client->createAuthUrl(); 
} 
//echo pageHeader('Get Final Report'); 
//echo "stre on disk = " . STORE_ON_DISK . "<br />"; 
echo '<div><div class="request">'; 
if (isset($authUrl)) { 
    echo '<a class="login" href="' . $authUrl . '">Login !</a>'; 
} else { 
    echo '<a class="logout" href="?logout">Logout</a>'; 
}; 
echo '</div>'; 
if ($client->getAccessToken()) { 
    echo '<pre class="result">'; 
// Now we're signed in, we can make our requests. 
    $adsense = makeRequests($service); 
    /* Note that we re-store the access_token bundle, just in case anything 
    changed during the request - the main thing that might happen here is the 
    access token itself is refreshed if the application has offline access. */ 
    $_SESSION['access_token'] = $client->getAccessToken(); 
    echo '</pre>'; 
} 
echo '</div>'; 
echo pageFooter(__FILE__); 
// Makes all the API requests. 
function makeRequests($service) { 
    print "\n"; 
    $accounts = GetAllAccounts::run($service, MAX_LIST_PAGE_SIZE); 
    echo '<div class="Account">Account No. '.$accounts[0]["id"].' Details</div>'; 

    if (isset($accounts) && !empty($accounts)) { 
// Get an example account ID, so we can run the following sample. 
     $exampleAccountId = $accounts[0]['id']; 
     GetAccountTree::run($service, $exampleAccountId); 
     $adClients = 
      GetAllAdClients::run($service, $exampleAccountId, MAX_LIST_PAGE_SIZE); 
     ; 

     ?> 
     <table id="myTable" class="tablesorter" border="1px solid"> 
      <thead> 
      <tr> 
       <th>AdClient ID</th> 
       <th>AdClient Code</th> 
      </tr> 
      </thead> 
      <tbody> 
      <?php 
      foreach($adClients as $adClients){ 

       ?> 
       <tr><td><?php echo $adClients['id']; ?></td><td><?php echo $adClients['productCode']; ?></td></tr> 

      <?php 
      } 
      ?> 
      </tbody> 
     </table> 
     <?php 

     if (isset($adClients) && !empty($adClients)) { 
// Get an ad client ID, so we can run the rest of the samples. 
      $exampleAdClient = end($adClients); 

      $exampleAdClientId = $adClients['id']; 

      $adUnits = GetAllAdUnits::run($service, $exampleAccountId, 
       $exampleAdClientId, MAX_LIST_PAGE_SIZE); 


      ?> 
      <table id="myTable_1" class="tablesorter" border="1px solid"> 
       <thead> 
       <tr> 
        <th>AdUnit name</th> 
        <th>AdUnit Code</th> 
        <th>AdUnit ID</th> 
        <th>Status</th> 
        <th>Detail</th> 

       </tr> 
       </thead> 
       <tbody> 
       <?php 
       foreach($adUnits as $adUnits){ 

        if($adUnits['status']=='ACTIVE' ||$adUnits['status']=='NEW'){ ?> 
         <tr> 
          <td><?php echo $adUnits['name']; ?></td> 
          <td><?php echo $adUnits['code']; ?></td> 
          <td><?php echo $adUnits['id']; ?></td> 
          <td><?php echo $adUnits['status']; ?></td> 
          <td class="link"><a href="<?php echo $redirect.'?ad_name='.$adUnits['name'];?>">Get detail</a></td> 
         </tr> 
        <?php 
        } 
       } 
       ?> 
       </tbody> 
      </table> 
      <?php 
      if (isset($_REQUEST['ad_name'])) { 
       //die('function shoul be calle dhere '); 

       $Get_reports=GenerateReport::run($service, $exampleAccountId, $exampleAdClientId,$_REQUEST['ad_name']); 
      } 
      else { 
       $Get_reports=GenerateReport::run($service, $exampleAccountId, $exampleAdClientId); 
      } 
      //print_r($Get_reports); 

      ?> 
      <table id="myTable_2" class="tablesorter" border="1px solid"> 
       <thead> 
       <tr> 
        <?php foreach($Get_reports['headers'] as $headers){ 
         ?> 
         <th><?php printf('%25s', $headers['name']); ?></th> 
        <?php 
        } 
        ?> 
       </tr> 
       </thead> 
       <?php 

       foreach($Get_reports['rows'] as $rows) { 
        ?> 
        <tr> 
         <?php 
         foreach($rows as $col) { 
          ?> 
          <td><?php echo $col; $adsense = $col; ?></td> 

         <?php 

         } ?> 
        </tr> 
       <?php 
       } 
       ?> 

      </table> 

      <table id="myTable_3" class="tablesorter" border="1px solid"> 
       <thead> 
       <tr> 
        <?php 
        foreach($Get_reports['headers'] as $headers){ 
         ?> 
         <th><?php echo 'Total '.$headers['name']; ?></th> 
        <?php 
        } 
        ?> 
       </tr> 
       </thead> 
       <tbody> 
       <tr> 
        <?php 
        foreach($Get_reports['totals'] as $totals){ 

         ?> 
         <td><?php echo $totals; ?></td> 
        <?php 
        } 
        ?> 
       </tr> 
       </tbody> 
      </table> 
      <?php 
      //die('Report Generated For Last 7 Days'); 


     } 
    } 
    //echo "adsense = " . $adsense . "<br />"; 
    return $adsense; 
} 

?> 
+0

Рассматривали ли вы с помощью учетной записи службы? Я не пробовал, но вы, кажется, можете добавить пользователя, чтобы он работал. вот учебник по использованию Google Analytics с учетной записью службы, пока у меня не будет времени проверить этот http://www.daimto.com/google-oauth2-php/ – DaImTo

+0

. Я пытаюсь следовать стандартным API AdSense, поскольку любые отклонение от этого привело к катастрофе для меня. Я действительно очень близка к тому, чтобы заставить это делать то, что мне нужно. Это обновление токенов - последняя головная боль для меня. –

ответ

1

Не пытайтесь использовать учетную запись службы - обычно это правильный выбор, но они не будут работать с AdSense.

Попробуйте изменить эту линию так, чтобы путь был абсолютным define ('TOKEN_FILENAME','/real/path/here/tokens.dat ', true);

убедитесь, что, когда вы ударил его один раз вручную, файл появляется и имеет данные (Вы можете открыть его, - должны быть в формате JSON)

+0

Я использую GoDaddy, поэтому я могу использовать chdir в php. –

 Смежные вопросы

  • Нет связанных вопросов^_^