Google AdSense API Refresh Token not working

From here: Google AdSense API asking for log in each time

I tried and this worked the first time, but the next day, the script ran and got an error: Uncaught exception 'Google_Auth_Exception' with message 'The OAuth 2.0 access token has expired, and a refresh token is not available. Refresh tokens are not returned for responses that were auto-approved.' in /home/mathcelebrity/public_html/Google/Auth/OAuth2.php:227

So I found this thread and tried reply #5 and get the error above: How to refresh token with Google API client?

All I want this thing to do is run nightly with no approval needed. In the background.

<?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;
}

?>

Don't try using a service account - normally the right choice but they wont work with AdSense.

Try changing this line so that the path is absolute define('TOKEN_FILENAME', '/real/path/here/tokens.dat', true);

make sure that when you hit it once by hand, the file appears and has data (You can open it - should be json)

链接地址: http://www.djcxy.com/p/80060.html

上一篇: 如何在谷歌应用程序引擎中调用REST API

下一篇: Google AdSense API刷新令牌无法使用