最近、TwitterがTinyURLを捨ててbit.lyを採用したらしい。そんなこともあって、URL短縮サービスに興味がわいたので、以前にGoogle App Engineで作成したTwitter送信機能付きメッセージボードで書き込んだURLをbit.lyで短縮して送信できるようにしてみた。今まではURLを含む投稿はTwitterに送信しないようにしていた。以下にbit.lyのAPIをPythonを使ってどのように利用すればよいか書いてみる。
まずは、bit.lyで無料アカウントを取得する。これでAPI Keyが貰えるので、bit.lyのAPIを利用できるようになる。次に、bit.ly APIの解説を参考にしながら、APIを使ってみる。URLの短縮も展開も簡単だ。JSONでもXMLでも利用できるが、今回はsimplejsonを使ってJSONを利用している。
詳しくは最後にソースコードを付けたのでそれを読んで欲しい。因みにソースコード中の赤字で示した部分がアカウント名とAPI Keyになる。コード中のアカウントはbit.lyのデモ用なので、自分のアカウントと置き換えて欲しい。使い方は、
bitly_test.py URL
とすればよい。URLが短縮URLなら展開され、通常のURLなら短縮URLが表示される。
また、Google App Engineで利用する場合は、simplejsonを
from django.utils import simplejson
として呼び出し、urllib2.urlopenをurlfetch.fetchに変更すればよい。
bitly_test.py
#!/usr/bin/env python import sys, os, re, urllib, urllib2 import simplejson apiurl = "http://api.bit.ly/%s?version=2.0.1&%s=%s&login=bitlyapidemo&apiKey=R_0da49e0a9118ff35f52f629d2d71bf07" api_index = { "shorten": "longUrl", "expand": "shortUrl" } info_index = { "shorten": "shortUrl", "expand": "longUrl" } def is_error(url, url_info): return url_info["statusCode"] != "OK" or (url_info["results"][url].has_key("statusCode") and url_info["results"][url]["statusCode"] != "OK") def bitly(url, api): url_data = urllib2.urlopen(apiurl % (api, api_index[api], urllib.quote(url))).read() url_info = simplejson.loads(url_data) if api == "expand": url = url.replace("http://bit.ly/", "") if is_error(url, url_info): return "" return url_info["results"][url][info_index[api]] def main(args): if len(args) < 2: print >>sys.stderr, "Usage: %s url" % os.path.basename(args[0]) sys.exit(1) url = args[1] if url.lower().split(":")[0] not in ("http", "https", "ftp"): url = "http://" + url bitly_url = "" if re.match(r"http://bit.ly/", url) and not re.search("[^a-z^A-Z^0-9]", url.replace("http://bit.ly/", "")): bitly_url = bitly(url, "expand") if not bitly_url: bitly_url = bitly(url, "shorten") print bitly_url if __name__ == "__main__": main(sys.argv)
まずは、bit.lyで無料アカウントを取得する。これでAPI Keyが貰えるので、bit.lyのAPIを利用できるようになる。次に、bit.ly APIの解説を参考にしながら、APIを使ってみる。URLの短縮も展開も簡単だ。JSONでもXMLでも利用できるが、今回はsimplejsonを使ってJSONを利用している。
詳しくは最後にソースコードを付けたのでそれを読んで欲しい。因みにソースコード中の赤字で示した部分がアカウント名とAPI Keyになる。コード中のアカウントはbit.lyのデモ用なので、自分のアカウントと置き換えて欲しい。使い方は、
bitly_test.py URL
とすればよい。URLが短縮URLなら展開され、通常のURLなら短縮URLが表示される。
また、Google App Engineで利用する場合は、simplejsonを
from django.utils import simplejson
として呼び出し、urllib2.urlopenをurlfetch.fetchに変更すればよい。
bitly_test.py
#!/usr/bin/env python import sys, os, re, urllib, urllib2 import simplejson apiurl = "http://api.bit.ly/%s?version=2.0.1&%s=%s&login=bitlyapidemo&apiKey=R_0da49e0a9118ff35f52f629d2d71bf07" api_index = { "shorten": "longUrl", "expand": "shortUrl" } info_index = { "shorten": "shortUrl", "expand": "longUrl" } def is_error(url, url_info): return url_info["statusCode"] != "OK" or (url_info["results"][url].has_key("statusCode") and url_info["results"][url]["statusCode"] != "OK") def bitly(url, api): url_data = urllib2.urlopen(apiurl % (api, api_index[api], urllib.quote(url))).read() url_info = simplejson.loads(url_data) if api == "expand": url = url.replace("http://bit.ly/", "") if is_error(url, url_info): return "" return url_info["results"][url][info_index[api]] def main(args): if len(args) < 2: print >>sys.stderr, "Usage: %s url" % os.path.basename(args[0]) sys.exit(1) url = args[1] if url.lower().split(":")[0] not in ("http", "https", "ftp"): url = "http://" + url bitly_url = "" if re.match(r"http://bit.ly/", url) and not re.search("[^a-z^A-Z^0-9]", url.replace("http://bit.ly/", "")): bitly_url = bitly(url, "expand") if not bitly_url: bitly_url = bitly(url, "shorten") print bitly_url if __name__ == "__main__": main(sys.argv)
コメント