Christian Heilmann

⚡️Show the world your Twitter type (using PHP and Google Charts)

Sunday, November 23rd, 2008 at 1:00 pm

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:

<img src="http://icant.co.uk/twittertype/?user={YOUR TWITTER USER NAME}">

For example my user name is codepo8, which would be:

<img src="http://icant.co.uk/twittertype/?user=codepo8">

And the resulting image is:

For John Hicks for example it is:

<img src="http://icant.co.uk/twittertype/?user=hicksdesign">

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('/<span id="following_count" class="stats_count numeric">([^>]+)<\/span>/msi',$cont,$follow);
  $info['follower'] = convert($follow[1][0]);
  preg_match_all('/<span id="follower_count" class="stats_count numeric">([^>]+)<\/span>/msi',$cont,$follower);
  $info['followed'] = convert($follower[1][0]);
  preg_match_all('/<span id="update_count" class="stats_count numeric">([^>]+)<\/span>/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=350x100&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. :)

Tags: , , , , , ,

Share on Twitter