183 lines
3.8 KiB
PHP
183 lines
3.8 KiB
PHP
<?php
|
|
|
|
/**
|
|
* <pre>
|
|
* Invision Power Services
|
|
* IP.Board v3.3.4
|
|
* URL Shortener
|
|
* Owner: Matt Mecham
|
|
* Last Updated: $Date: 2012-06-12 10:14:49 -0400 (Tue, 12 Jun 2012) $
|
|
* </pre>
|
|
*
|
|
* @author Matt Mecham
|
|
* @copyright (c) 2001 - 2009 Invision Power Services, Inc.
|
|
* @license http://www.invisionpower.com/company/standards.php#license
|
|
* @package IP.Board
|
|
* @link http://www.invisionpower.com
|
|
* @since 24th November 2009
|
|
* @version $Revision: 10914 $
|
|
*/
|
|
|
|
/*
|
|
# Example: Shorten URL
|
|
# require_once( IPS_ROOT_PATH . 'sources/classes/url/shorten.php' );/*noLibHook*/
|
|
# $shorten = new urlShorten();
|
|
# $data = $shorten->shorten( 'http://www.invisionpower.com', 'bitly' );
|
|
#
|
|
# print $data['url'];
|
|
#
|
|
# Example: List available shorteners
|
|
# require_once( IPS_ROOT_PATH . 'sources/classes/url/shorten.php' );/*noLibHook*/
|
|
# $shorten = new urlShorten();
|
|
#
|
|
# print_r( $shorten->fetchAvailableApis() );
|
|
#
|
|
|
|
class urlShorten
|
|
{
|
|
/**
|
|
* Main API classes directory
|
|
*
|
|
* @var $_mainDir
|
|
*/
|
|
protected $_mainDir;
|
|
|
|
/**
|
|
* API object
|
|
*
|
|
* @var $_api
|
|
*/
|
|
protected $_api;
|
|
|
|
/**
|
|
* Array of additional error messages
|
|
*
|
|
* @var $errors
|
|
*/
|
|
public $errors = array();
|
|
|
|
/**
|
|
* Method constructor
|
|
*
|
|
* @return @e void
|
|
*
|
|
* @throws Exception
|
|
* @li NO_METHOD (API class could not be found)
|
|
*/
|
|
public function __construct()
|
|
{
|
|
$this->_mainDir = IPS_ROOT_PATH . 'sources/classes/url/apis';
|
|
}
|
|
|
|
/**
|
|
* Shorten URL
|
|
*
|
|
* @param string $url URL to shorten
|
|
* @param string $apiKey Method key to use (If left blank, we'll just grab the first one)
|
|
* @return @e array Shortened url data
|
|
*
|
|
* @throws Exception
|
|
* @li NO_METHOD (API class could not be found)
|
|
* @li BAD_FORMAT (URL is not in the correct format)
|
|
* @li FAILED (URL shorten failed)
|
|
*/
|
|
public function shorten( $url, $apiKey )
|
|
{
|
|
/* Check URL */
|
|
if ( ! strstr( $url, 'http://' ) AND ! strstr( $url, 'https://' ) )
|
|
{
|
|
throw new Exception( 'BAD_FORMAT' );
|
|
}
|
|
|
|
if ( $apiKey )
|
|
{
|
|
$_thisDir = $this->_mainDir . '/' . $apiKey;
|
|
|
|
if ( @is_file( $_thisDir . '/api.php' ) )
|
|
{
|
|
$this->_setMethod( $apiKey );
|
|
}
|
|
}
|
|
else
|
|
{
|
|
/* We don't care */
|
|
$apis = $this->fetchAvailableApis();
|
|
|
|
if ( is_array( $apis ) AND count( $apis ) )
|
|
{
|
|
$apiKey = array_shift( $apis );
|
|
|
|
if ( $apiKey )
|
|
{
|
|
$this->_setMethod( $apiKey );
|
|
}
|
|
}
|
|
}
|
|
|
|
if ( ! is_object( $this->_api ) )
|
|
{
|
|
throw new Exception( 'NO_METHOD' );
|
|
}
|
|
|
|
/* still here? */
|
|
$data = $this->_api->apiShorten( $url );
|
|
|
|
if ( $data['status'] == 'ok' )
|
|
{
|
|
return $data;
|
|
}
|
|
else
|
|
{
|
|
/* could do something more useful here */
|
|
throw new Exception( 'FAILED' );
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Set method
|
|
* Assumes that the folder and files exist
|
|
*
|
|
* @param string $apiKey API key
|
|
* @return @e void
|
|
*/
|
|
protected function _setMethod( $apiKey )
|
|
{
|
|
$config = array();
|
|
|
|
if ( is_file( $this->_mainDir . '/' . $apiKey . '/conf.php' ) )
|
|
{
|
|
require( $this->_mainDir . '/' . $apiKey . '/conf.php' );/*noLibHook*/
|
|
}
|
|
|
|
$classToLoad = IPSLib::loadLibrary( $this->_mainDir . '/' . $apiKey . '/api.php', $apiKey );
|
|
$this->_api = new $classToLoad( $config );
|
|
}
|
|
|
|
/**
|
|
* Fetch all available APIs
|
|
*
|
|
* @return @e array Available APIs
|
|
*/
|
|
public function fetchAvailableApis()
|
|
{
|
|
$apis = array();
|
|
|
|
try
|
|
{
|
|
foreach( new DirectoryIterator( $this->_mainDir ) as $file )
|
|
{
|
|
if ( ! $file->isDot() AND $file->isDir() )
|
|
{
|
|
$_name = $file->getFileName();
|
|
|
|
if ( substr( $_name, 0, 1 ) != '.' )
|
|
{
|
|
$apis[] = $_name;
|
|
}
|
|
}
|
|
}
|
|
} catch ( Exception $e ) {}
|
|
|
|
return $apis;
|
|
}
|
|
} |