I just had a bit of fun with Twitter and the Google charts API. You can now add an image to your blog, web site or wherever and show a picture of what kind of a twitter user you are. All you need to do is embed an image and give it the right source:
For example my user name is codepo8, which would be:
And the resulting image is:
For John Hicks for example it is:
And the resulting image is:
How it is done and how to “change stuff”
You can download the source code and have a play with this (I hope this will not spike my traffic :) so it might go offline if that is the case). There’s really not much magic to this:
First I get the user name and filter out nasties:
$user = $_GET[‘user’];
$isjs = “/^[a-z|A-Z|_|-|$|0-9|.]+$/”;
if(preg_match($isjs,$user)){
Then I set the content type to show the image and use cURL to get the information from the user’s twitter page.
header(‘Content-type:image/png’);
$info = array();
$cont = get(‘http://twitter.com/’.$user);
I get the information using regular expressions and put them in an associative array:
preg_match_all(‘/([^>]+)/msi’,$cont,$follow);
$info[‘follower’] = convert($follow[1][0]);
preg_match_all(‘/([^>]+)/msi’,$cont,$follower);
$info[‘followed’] = convert($follower[1][0]);
preg_match_all(‘/([^>]+)/msi’,$cont,$updates);
$info[‘updater’] = convert($updates[1][0]);
The convert function removes the comma punctuation added by twitter and makes sure the values are integers.
I then need to determine which of the three values is the highest and define a scaling factor as the Google API only allows values up to 100. I then check what the type of the user is by getting the right array key and change the values for displaying.
$max = max($info);
$convert = 100 / $max ;
foreach($info as $k=>$f){
if($f = $max){
$type = $k;
}
$disp[$k] = $f * $convert;
}
I check the type and assemble the display string accordingly:
if($type = ‘updater’){
$t = ’ is an ‘;
}
if($type = 'follower'){
$t = ' is a ';
}
if($type = ‘followed’){
$t = ’ is being ‘;
}
$title = $user . $t . $type;
I assemble the labels array and the values array and add all up to the correct Google charts
API url. I use cURL to get the image and echo it out.
$out = array();
foreach($info as $k=>$i){
$out[] = $k.’+(‘.$i.’)’;
}
$labels = join($out,’|’);
$values = join($disp,’,’);
$img = get(‘http://chart.apis.google.com/chart?cht=p3&chco=336699&’.
‘chtt=’.urlencode($title).’&chd=t:’.$values.
‘&chs=350×100&chl=’.$labels);
echo $img;
}
The rest are the cURL and convert helper functions.
function get($url){
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$feed = curl_exec($ch);
curl_close($ch);
return $feed;
}
function convert($x){
$x = str_replace(‘,’,’‘,$x);
$x = (int)$x;
return $x;
}
You like?
Faster version (one cURL, instead of two)
Instead of setting the PNG header and echoing out the image you can also just set a location header at the end and redirect the URL request to Google’s servers. I guess they have more bandwidth. :)