Pythonでbit.lyの短いURLを作成するスクリプト

以前、こちらの記事で「PythonでTinyURLを作成するスクリプト」を作成したので、最近人気の「bit.ly」でも短いURLを作成するスクリプトを作成しました。

screenshot

TinyURL」から短いURLを手に入れる場合は、特定のURLにパラメータを付けるだけで良かったのですが、「bit.ly」の場合はAPIを使うためのアカウントとAPI Keyが必要なようです。

また、送信した後のデータ・フォーマットとしては、XML形式とJSON形式を選べまして、今回の例はXML形式を返すようにした場合のスクリプトになります。

#!/usr/bin/evn python
# coding: utf-8

import urllib2
import re

class Bitly:
    def __init__(self):
        self.re_node = re.compile('<nodeKeyVal>(.+?)</nodeKeyVal>', re.DOTALL)
        self.re_key = re.compile('<nodeKey>(.+?)</nodeKey>', re.DOTALL)
        self.re_url = re.compile('<shortUrl>(.+?)</shortUrl>', re.DOTALL)
        self.re_cdata = re.compile('<\!\[CDATA\[(.+?)\]\]', re.DOTALL)

    def get_short_url(self, url_list = []):
        api_url = 'http://api.bit.ly/shorten?version=2.0.1'
        api_url += '&format=' + 'xml' # xml or json
        for url in url_list:
            api_url += '&longUrl=' + url # original URL
        api_url += '&login=' + YOUR_LOGIN_NAME # your login name
        api_url += '&apiKey=' + YOUR_API_KEY # your api key
        #print 'API URL: %s' % (api_url)
        short_url_list = []
        result_xml = ''
        # access network
        try:
            result_xml = urllib2.urlopen(api_url).read()
        except urllib2.HTTPError, e:
            sys.stderr.write('%s: %s\n' % (e, api_url))
        except urllib2.URLError, e:
            sys.stderr.write('%s: %s\n' % (e, api_url))
        except:
            sys.stderr.write('Unexpected error: %s\n' % (sys.exc_info()[1]))
        for node in self.re_node.finditer(result_xml):
            # original url
            original_url = ''
            key_match = self.re_key.search(node.group())
            if None != key_match:
                cdata_match = self.re_cdata.search(key_match.group())
                if None != cdata_match:
                    original_url = cdata_match.group()[9:-2]
            # short url
            short_url = ''
            url_match = self.re_url.search(node.group())
            if None != url_match:
                short_url = url_match.group()[10:-11]
            if '' != original_url and '' != short_url:
                short_url_list.append((original_url, short_url))
        return short_url_list

if __name__ == '__main__':
    b = Bitly()
    short_url_list = b.get_short_url(['http://www.google.co.jp/',
                                      'http://www.yahoo.co.jp/'])
    print short_url_list

ちなみに、このAPIは一度に複数のURLを調べることができるようです。

今回のように正規表現を使うよりも、XMLパーサを使ったほうが、XMLを分解する上では良いと思いますが、取り急ぎ正規表現で分解してみました。

Pythonは2.6系でこのスクリプトを実行しています。

「bit.ly」のAPIに関しては、こちらのドキュメントが詳しいので、使う前は一度読んでおくと良いです。