Get adsense stats from PHP
I am a statistics freak. I can’t say anything else ![]()
But I guess that most of you, my fellow webmasters love to check your adsense stats every now and then every every day, and probably every hour also…
Why not let your own script fetch the statistics directly from google adsense reporting site? It’s always much easier to have the data locally in your own database, and then create scripts to display the stats in the way you are interested in.
I will now – totally free, no strings attached- give you the code that collects the present stats from adsense, for any channel you specify. Because I also love to work with databases, we will store the results in mysql.
The basics behind the script is that you choose what channels you want to fetch stats for, and then you let your script do that as often as you which. You can schedule this script with crontab or something similar as often you which. Don’t do it more often than every 15 minutes, because I have heared something from google that you are not allowed to script things mroe often against adsense…
Well,no more talking … lets get to work!
Here’s what to do:
- Login to adsense and click on “advanced reports”. Create channels if you don’t have any yet, because this script shows stats for separate channels.
- This part might be the most complicated, but still very easy. “View source” for the page and search for select name=”reportId”. Scroll further out on that row in the source and look for your channel names. You will find something similar to this Cholesterol-week . Write down the number and the name on a paper or somewhere. Do this for every channel you want to track.
- Create a database and assign a user with a password for that.
- Run this sql code: CREATE TABLE `adsense` (
`id` int(11) NOT NULL auto_increment,
`channel` varchar(50) NOT NULL,
`reportedWhen` datetime NOT NULL,
`impressions` int(11) NOT NULL,
`clicks` int(11) NOT NULL,
`rate` decimal(10,3) NOT NULL,
`cpm` decimal(10,3) NOT NULL,
`earnings` decimal(10,3) NOT NULL,
PRIMARY KEY (`id`)
) - Save the file you see in the blue box below as adsense.php or similar. Look at the first lines where you need to fill in your details. Both for your adsense account and your db details.
- In the file you need to enter all channelId’s and channelNames in the array. Just increase that array if you have more channels!
I have not created any script to display the stats yet, but that might come in the future
For now, enjoy the script and let me know if you like it!
Here is the script:
<?php
// Change things from here!!!
$adsenseUsername = "yourname@yourcompany.se";
$adsensePassword = "yourpassword";
$dbHostname = "localhost";
$dbUsername = "dbUsername";
$dbPassword = "dbPasswd";
$dbName = "theDbName";
$reports = Array("1234" => "channel1",
"56215" => "channel4",
"35507" => "channel3");
// Stop changing things here!!!
$adsenseCookie = "adsenseCookie.txt";
// Google time
putenv('TZ=US/Pacific');
$now = date("Y-m-d H:i:s");
$dbLink = mysql_pconnect($dbHostname, $dbUsername, $dbPassword) or die('Could not connect to database: '.$dbHostname);
mysql_select_db($dbName, $dbLink) or die('Could not find database: '.$dbName);
// Handle every report separately
foreach($reports as $id => $name)
{
$result = getAdsenseReport($id);
logChannel($name, $result, $now);
}
// Only functions below, to do all the magic.
// This function takes care of the sql part, that stores channel information.
function logChannel($channelName, $data, $time)
{
global $dbLink;
$sql = "INSERT INTO adsense( id,
channel,
reportedWhen,
impressions,
clicks,
rate,
cpm,
earnings)
VALUES ( NULL,
'$channelName',
'$time',
'$data[impressions]',
'$data[clicks]',
'$data[rate]',
'$data[cpm]',
'$data[earnings]')";
mysql_query($sql, $dbLink);
}
// Gets the report for one channel (reportId).
// Formatting the respons in a pretty way, so we can work with it easily.
function getAdsenseReport($reportId)
{
$reportUrl = "/adsense/report/view-custom.do?reportId=";
$result = getAdsenseInfo($reportUrl . $reportId);
// the next two rows must be on one row!!!
preg_match('/\<tr class\="totals"\>.*\<td.*\>.*\<\/td\>.*\<td.*\>(.*)\<\/td\>.*\<td.*\>(.*)\<\/td\>
.*\<td.*\>(.*)\<\/td\>.*\<td.*\>(.*)\<\/td\>.*\<td.*\>(.*)\<\/td\>.*<\/tr>/simU', $result, $array);
foreach ($array as $key => $value)
{
$array[$key] = str_replace(Array("USD", "%", "."), "", $value);
$array[$key] = str_replace(",", ".", $array[$key]);
}
$info = Array( "impressions" => $array["1"],
"clicks" => $array["2"],
"rate" => $array["3"],
"cpm" => $array["4"],
"earnings" => $array["5"]);
return $info;
}
// Accesses adsense to get the information.
// This is where all the magic happens, login and requesting the asked report.
function getAdsenseInfo($destination)
{
global $adsenseUsername, $adsensePassword, $adsenseCookie;
// Add login information to the url
$postdata = "destination=" . urlencode($destination) . "&username=" . urlencode($adsenseUsername) . "&password=" . urlencode($adsensePassword) . "&null=Login";
$ch = curl_init();
curl_setopt ($ch, CURLOPT_URL,"https://www.google.com/adsense/login.do");
curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt ($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)");
curl_setopt ($ch, CURLOPT_TIMEOUT, 20);
curl_setopt ($ch, CURLOPT_FOLLOWLOCATION,1);
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt ($ch, CURLOPT_COOKIEJAR, $cookie);
curl_setopt ($ch, CURLOPT_COOKIEFILE, $cookie);
curl_setopt ($ch, CURLOPT_POSTFIELDS, $postdata);
curl_setopt ($ch, CURLOPT_POST, 1);
$result = curl_exec ($ch);
curl_close($ch);
return $result;
}
?>
That’s all for today… Let me know if you find it useful, because I love the result
If people are interested I will consider to create a function that displays the stats also?!?

May 15th, 2009 at 2:29 pm
Brilliant post, thanks a lot for the information – I dont really ever write comments but found the post as a mistake. Keep posting more like this!, I added you to my favorites!
May 17th, 2009 at 10:19 am
Thanks for the comment! We will soon start writing a lot new tutorials with high quality, so stay tuned!
June 13th, 2009 at 3:39 pm
I was just about to write this to put in a wordpress plugin that I’m writing. Thanks a bunch for saving me the trouble.
June 14th, 2009 at 2:35 pm
Dont work.
July 8th, 2009 at 2:42 am
Think google has changed the way the handle logins unfortunately. Will see if we can find a new way to handle this.
November 2nd, 2009 at 3:51 pm
[...] 36)Get adsense stats from php Most of us webmasters use adsense for our websites. Haven’t you just like me wanted to get the stats via PHP directly into your own script? Here is how to get channel data with a script ready to use [...]
January 4th, 2010 at 5:14 pm
Any update on how Google has changed the login for this script? This script currently appears to be broken.