Source code for client

# client.py
#  - Python client for yourls
#
# Copyright 2011, Red Hat, Inc.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License along
# with this program; if not, write to the Free Software Foundation, Inc.,
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
#
# Author:
#       Tim Flink <tflink@redhat.com>

"""
.. module:: yourls.client
   :synopsis: A simple client for the YOURLS URL shortener

.. moduleauthor:: Tim Flink <tflink@redhat.com>
"""

import sys
import urllib
import urllib2
import json
import re

[docs]class YourlsKeywordError(Exception): """Used when there are keyword conflicts in requested custom URLs""" def __init__(self, url, message): self.url = url self.message = message def __str__(self): return repr('Error shortening url %s - %s' % (self.url, self.message))
class YourlsClient(): def __init__(self, apiurl, username=None, password=None): if apiurl is None: print "api url is required" sys.exit(2) else: self.apiurl = apiurl if username is None or password is None: print "username and password are required" sys.exit(2) else: self.username = username self.password = password self.data_format = 'json' self.std_args = {'username':self.username, 'password':self.password, 'format':self.data_format} def _send_request(self, args): urlargs = urllib.urlencode(self._make_args(args)) req = urllib2.Request(self.apiurl) req.add_data(urlargs) r = urllib2.urlopen(req) data = r.read() return data def _make_args(self, new_args): return dict(self.std_args.items() + new_args.items()) def shorten(self, url, custom = None): """Request a shortened URL from YOURLS with an optional keyword request :param url: The URL to shorten :type url: str :param custom: The custom keyword to request :type custom: str :returns: str -- The short URL :raises: YourlsKeywordError """ args = {'action':'shorturl','url':url} if custom is not None: args['keyword'] = custom raw_data = json.loads(self._send_request(args)) if raw_data['status'] == 'fail': if re.search('Short URL [a-zA-Z0-9\\-]+ already exists in database', raw_data['message']) is not None: raise YourlsKeywordError(url, raw_data['message']) return raw_data['shorturl'] def get_stats(self, shorturl): raise NotImplementedError('get_stats has not yet been implemented') def expand(self, shorturl): raise NotImplementedError('expand has not yet been implemented')