diff --git a/plugins/BitlyUrl/BitlyUrlPlugin.php b/plugins/BitlyUrl/BitlyUrlPlugin.php index 10d99b3588..ceabeb29cd 100644 --- a/plugins/BitlyUrl/BitlyUrlPlugin.php +++ b/plugins/BitlyUrl/BitlyUrlPlugin.php @@ -2,7 +2,7 @@ /** * StatusNet, the distributed open-source microblogging tool * - * Plugin to push RSS/Atom updates to a PubSubHubBub hub + * Plugin to use bit.ly URL shortening services. * * PHP version 5 * @@ -22,7 +22,9 @@ * @category Plugin * @package StatusNet * @author Craig Andrews + * @author Brion Vibber * @copyright 2009 Free Software Foundation, Inc http://www.fsf.org + * @copyright 2010 StatusNet, Inc http://status.net/ * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 * @link http://status.net/ */ @@ -35,26 +37,98 @@ require_once INSTALLDIR.'/plugins/UrlShortener/UrlShortenerPlugin.php'; class BitlyUrlPlugin extends UrlShortenerPlugin { - public $serviceUrl; + public $shortenerName = 'bit.ly'; + public $serviceUrl = 'http://bit.ly/api?method=shorten&version=2.0.1&longUrl=%s'; + public $login; + public $apiKey; function onInitializePlugin(){ parent::onInitializePlugin(); if(!isset($this->serviceUrl)){ - throw new Exception(_m("You must specify a serviceUrl.")); + throw new Exception(_m("You must specify a serviceUrl for bit.ly shortening.")); + } + if(!isset($this->login)){ + throw new Exception(_m("You must specify a login name for bit.ly shortening.")); + } + if(!isset($this->login)){ + throw new Exception(_m("You must specify an API key for bit.ly shortening.")); } } + /** + * Short a URL + * @param url + * @return string shortened version of the url, or null if URL shortening failed + */ protected function shorten($url) { - $response = $this->http_get($url); - if(!$response) return; - return current(json_decode($response)->results)->hashUrl; + $response = $this->query($url); + if ($this->isOk($url, $response)) { + return $this->decode($url, $response->getBody()); + } else { + return null; + } + } + + /** + * Inject API key into query before sending out... + * + * @param string $url + * @return HTTPResponse + */ + protected function query($url) + { + // http://code.google.com/p/bitly-api/wiki/ApiDocumentation#/shorten + $params = http_build_query(array( + 'login' => $this->login, + 'apiKey' => $this->apiKey), '', '&'); + $serviceUrl = sprintf($this->serviceUrl, $url) . '&' . $params; + + $request = HTTPClient::start(); + return $request->get($serviceUrl); + } + + /** + * JSON decode for API result + */ + protected function decode($url, $body) + { + $json = json_decode($body, true); + return $json['results'][$url]['shortUrl']; + } + + /** + * JSON decode for API result + */ + protected function isOk($url, $response) + { + $code = 'unknown'; + $msg = ''; + if ($response->isOk()) { + $body = $response->getBody(); + common_log(LOG_INFO, $body); + $json = json_decode($body, true); + if ($json['statusCode'] == 'OK') { + $data = $json['results'][$url]; + if (isset($data['shortUrl'])) { + return true; + } else if (isset($data['statusCode']) && $data['statusCode'] == 'ERROR') { + $code = $data['errorCode']; + $msg = $data['errorMessage']; + } + } else if ($json['statusCode'] == 'ERROR') { + $code = $json['errorCode']; + $msg = $json['errorMessage']; + } + common_log(LOG_ERR, "bit.ly returned error $code $msg for $url"); + } + return false; } function onPluginVersion(&$versions) { $versions[] = array('name' => sprintf('BitlyUrl (%s)', $this->shortenerName), 'version' => STATUSNET_VERSION, - 'author' => 'Craig Andrews', + 'author' => 'Craig Andrews, Brion Vibber', 'homepage' => 'http://status.net/wiki/Plugin:BitlyUrl', 'rawdescription' => sprintf(_m('Uses %1$s URL-shortener service.'),