<?php
    
/**
     * LinkscapeAPI Class
     *
     * Wrapper for SEOMoz's Linkscape API: http://www.seomoz.org/api
     * Currently supports the only available method: mozRank, but will 
     * be updated to include future methods.
     *
     * Requires SEOMoz API login credentials, available with registration at http://www.seomoz.org/api
     *
     * @author    George Huger, Illuminati Karate Inc 
     *            Web: http://www.illuminatikarate.com
     *            Email: george@illuminatikarate.com
     *            Project Homepage: http://lab.illuminatikarate.com/linkscape_api/
     *
     * @version 1.0
     * @todo    Add semantic error checking and response
     * @copyright    2009 Illuminati Karate, Inc [http://www.illuminatikarate.com]
     * @license    http://www.opensource.org/licenses/mit-license.php The MIT License
     *
     * Usage Example:
     *  
     *    $ls = new LinkscapeApi($access_id, $secret_key);
     *    $mozRank = $ls->mozRank('www.nytimes.com');
     *    echo 'mozRank: ' . ($mozRank ? $mozRank : 0);
     *
    */
    
class LinkscapeAPI
    
{
        var 
$access_id false;
        var 
$secret_key false;
        var 
$appName "SEOMoz API User";

        
/**
         * LinkscapeAPI Constructor
         *
         * @param string $access_id
         * @param string $secret_key
        */
         
function __construct($access_id$secret_key$appName null)
        {
            
$this->access_id $access_id;
            
$this->secret_key $secret_key;
            if (isset(
$appName))
            {
                
$this->appName $appName;
            }
        }
        
        
/**
         * getUrl - Fetches the provided URL using cURL if possible, or file_get_contents() if not
         *
         * @param string $url
         * @returns mixed URL contents on success, false on failure
        */
        
function getUrl($url)
        {
            
// use cURL if possible
            
if (function_exists('curl_init'))
            {
                
$options = array(
                    
CURLOPT_RETURNTRANSFER => true,
                    
CURLOPT_HEADER         => false,
                    
CURLOPT_FOLLOWLOCATION => true,     // follow redirects
                    
CURLOPT_ENCODING       => "",       // any encoding
                    
CURLOPT_USERAGENT      => $this->appName// App name - set in the constructor
                    
CURLOPT_AUTOREFERER    => true,     // set referer on redirect
                    
CURLOPT_CONNECTTIMEOUT => 60,      // timeout on connect
                    
CURLOPT_TIMEOUT        => 60,      // timeout on response
                    
CURLOPT_MAXREDIRS      => 3,       // stop after 3 redirects
                
);
                
                
$ch curl_init$url );
                
curl_setopt_array($ch$options);
                
$content curl_exec($ch);
                
$errNumber curl_errno($ch);
                
$errMsg  curl_error($ch);
                
curl_close$ch );
                return 
intval($errNumber) == $content false;
            }
            
// cURL is not available, so use file_get_contents()
            
else
            {
                return 
file_get_contents($url);
            }
        }

        
/**
         * generateSignature - Builds the signature GET var needed to authenticate with the SEOMoz API
         *
         * @param int $timestamp
         * @returns string URL encoded Signature key/value pair
        */
        
function generateSignature($timestamp)
        {
            
$timestamp = isset($timestamp) ? $timestamp time() + 300// one minute into the future
            
$hash hash_hmac("sha1"$this->access_id "\n" $timestamp$this->secret_keytrue);
            return 
'&Signature=' urlencode(base64_encode($hash));
        }

        
/**
         * query - Queries the SEOMoz API
         *
         * @param string $apiName
         * @param string $targetUrl
         * @returns mixed URL contents on success, false on failure
        */
        
function query($apiName$targetUrl)
        {
            
$timestamp mktime() + 300// 5 minutes into the future
            
$targetUrl urlencode($targetUrl);
            
$requestUrl "http://lsapi.seomoz.com/linkscape/{$apiName}/{$targetUrl}?AccessID={$this->access_id}&Expires={$timestamp}$this->generateSignature($timestamp);
            
$resp $this->getUrl($requestUrl);
            return 
$resp json_decode($resp) : false;
        }

        
/**
         * mozRank - Returns the SEOMoz 'mozRank' for the given URL.
         *
         * @param string $targetUrl
         * @param bool $raw 
         * @returns mixed if $raw == true: returns "raw rank" (float in exponential notation)
         *                   if $raw == false: returns "pretty rank" (float between 0 and 10 inclusive)
        */
        
function mozRank($targetUrl$raw false)
        {
            
$resp $this->query('mozrank'$targetUrl);
            return (
$resp && isset($resp->umrr)) ? $raw $resp->umrr $resp->umrp false;
        }
    }
?>