从这里:Google AdSense API 每次都要求登录
我尝试了,这第一次有效,但第二天,脚本运行并出现错误:未捕获的异常"Google_Auth_Exception",消息为"OAuth 2.0 访问令牌已过期,刷新令牌不可用。对于自动批准的响应,不会返回刷新令牌。 在/home/mathcelebrity/public_html/Google/Auth/OAuth2.php:227
所以我找到了这个线程并尝试回复 #5 并得到上面的错误:如何使用谷歌API客户端刷新令牌?
我想要做的一切就是每晚运行,无需批准。 在后台。
<?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;
}
?>
不要尝试使用服务帐号 - 通常是正确的选择,但它们不适用于 AdSense。
尝试更改此行,使路径是绝对路径define('TOKEN_FILENAME', '/real/path/here/tokens.dat', true);
确保当你用手点击它一次时,文件出现并有数据(你可以打开它 - 应该是 json)