URL 短縮サービスの API 使ってみたよ
こんばんは。 現在相互リンクさせていただいている @i_center さんになんと私のロゴを作成していただいております。
以前 Twitter で私がロゴを何とかしたいとか言っていたらしく、それじゃということで作っていただけることになりました。 楽しみですね。 ちなみに現行ロゴ
さて本題ですが、 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.ly と j.mp なんか運営元一緒で、 request\_url の違いだけで後の処理は全く一緒ですがお気になさらずにw
ux.nu では大抵の他社 URL 短縮サービスを展開してくれるらしいので、展開は ux.nu に任せきりでもなんとかなりますよな。 (今回のスクリプトでは対応していません)
まぁ、今回の本質は API 使ってみたよ、なのでそれぞれのサービスの短縮・展開が利用出来ればヨシなんです。