URL 短縮サービスの API 使ってみたよ

こんばんは。 現在相互リンクさせていただいている @i_center さんになんと私のロゴを作成していただいております。

以前 Twitter で私がロゴを何とかしたいとか言っていたらしく、それじゃということで作っていただけることになりました。 楽しみですね。 ちなみに現行ロゴ

yosida95_logo

さて本題ですが、 Python の勉強がてら有名な URL 短縮サービスの API を使って URL の短縮及び展開を行うスクリプトを書いてみました。

多分 Python で書いた過去最長のソースコードです。

# -*- encoding: UTF-8 -*-

import httplib, urllib2, json, re

class GoogleUrlShortener:
    def __init__(self):
        self.api_key = u'[your api key]'
        self.request_url = u'https://www.googleapis.com/urlshortener/v1/url'

    def shorten(self, longUrl):
        data = json.dumps({'longUrl':longUrl, 'key':self.api_key})
        header = {'Content-Type':'application/json'}
        request = urllib2.Request(self.request_url, data, header)
        try:
            result = urllib2.urlopen(request)
            result = json.loads(result.read())
            return result['id']
            pass
        except urllib2.HTTPError:
            return u'Error'
            pass

    def expand(self, shortUrl):
        request = u"%s?shortUrl=%s&key=%s" % (self.request_url, shortUrl, self.api_key)
        result = urllib2.urlopen(request)
        result = json.loads(result.read())
        try:
            if result['error']:
                return u'Error'
                pass
        except KeyError:
            return result['longUrl']
            pass

class bitly:
    def __init__(self):
        self.api_key = u'[your api key]'
        self.login_name = u'[your name]'
        self.request_url = u'http://api.bit.ly/v3/'

    def shorten(self, longUrl):
        request = u"%s/shorten?login=%s&apiKey=%s&longUrl=%s" % (
            self.request_url, self.login_name, self.api_key, longUrl)
        result = urllib2.urlopen(request)
        result = json.loads(result.read())
        if result['status_code'] == 200:
            return result['data']['url']
        else:
            return u'Error'

    def expand(self, shortUrl):
        request = u"%s/expand?login=%s&apiKey=%s&shortUrl=%s&format=json" % (
            self.request_url, self.login_name, self.api_key, shortUrl)
        result = urllib2.urlopen(request)
        result = json.loads(result.read())
        try:
            return result['data']['expand'][0]['long_url']
            pass
        except KeyError:
            return u'Error';
            pass

class jmp:
    def __init__(self):
        self.api_key = u'[your api key]'
        self.login_name = u'[your name]'
        self.request_url = u'http://api.j.mp/v3'

    def shorten(self, longUrl):
        request = u"%s/shorten?login=%s&apiKey=%s&longUrl=%s" % (
            self.request_url, self.login_name, self.api_key, longUrl)
        result = urllib2.urlopen(request)
        result = json.loads(result.read())
        if result['status_code'] == 200:
            return result['data']['url']
        else:
            return u'Error'

    def expand(self, shortUrl):
        request = u"%s/expand?login=%s&apiKey=%s&shortUrl=%s&format=json" % (
            self.request_url, self.login_name, self.api_key, shortUrl)
        result = urllib2.urlopen(request)
        result = json.loads(result.read())
        try:
            return result['data']['expand'][0]['long_url']
            pass
        except KeyError:
            return u'Error';
            pass

class uxnu:
    def __init__(self):
        self.request_url = u'http://ux.nu'

    def shorten(self, longUrl):
        request = u"%s/api/short?url=%s&format=json" % (self.request_url, longUrl)
        try:
            result = urllib2.urlopen(request)
            result = json.loads(result.read())
            return result['data']['url']
            pass
        except urllib2.HTTPError:
            return u'Error'
            pass

    def expand(self, shortUrl):
        par = re.compile('^http://ux.nu/(\w+)$').match(shortUrl)
        if par is None:
            return u'Error'
        request = httplib.HTTPConnection('ux.nu')
        request.request('HEAD', "/%s" % (par.group(1)))
        result = request.getresponse().getheader('Location')
        request.close()
        if result != '':
            return result
        else:
            return u'Error'

こんな感じです。 これで何が大変だったかって、それぞれのサービスの API の使い方を調べることでした。

bit.lyj.mp なんか運営元一緒で、 request\_url の違いだけで後の処理は全く一緒ですがお気になさらずにw

ux.nu では大抵の他社 URL 短縮サービスを展開してくれるらしいので、展開は ux.nu に任せきりでもなんとかなりますよな。 (今回のスクリプトでは対応していません)

まぁ、今回の本質は API 使ってみたよ、なのでそれぞれのサービスの短縮・展開が利用出来ればヨシなんです。