短縮URL用に数字の短縮化をPythonで書いた

我が社が提供するサービス「ChanTo.me」に、エントリーした内容をtwittertweetする機能を付けました。

といっても、APIを使って自動で書き込むのではなく、tweetの記入枠に自動的にエントリーした内容等を書き込むだけです。

どうやっているかというと、
http://twitter.com/home?status=tweetしたい内容をURLエンコードしたもの」
へのリンクを作るだけです。


そして、tweetに、エントリーのページへのリンクを追加しようと思ったのですが、
エントリーのページのURLはこのように長いものになっています。
http://www.chanto.me/kumoma/cp-6004/20100204/
つまり
http://www.chanto.me/[ユーザID]/cp-[チェックポイントID]/[日付]/
となっています。

これだと長すぎるので、短縮URLを作る事にしました。
実は、必要なのは[チェックポイントID]と[日付]だけなのです。
したがって、この数字部分を短縮する処理と元に戻す処理を作成しました。


数字を短縮する処理
言語はPythonで、下記のnumが短縮したい数字です。

chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'
length = 62

result = ""
while num >= length:
    a = num % length
    b = (num - a) / length
    num = b
    result += chars[a]

result += chars[num]
return result

短縮された文字列を数字に戻す処理
言語はPythonで、下記のshortが短縮された文字列です。

chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'
length = 62

x = 1
short_len = len(short)
result = 0
for i in range(0,short_len):
    result += chars.find(short[i])*x
    x = x * length
return result

これらの処理を使って短縮しています。


本当は、ホスト名も、chanto.me だけにしたいのですが、Google App Engineでは、ドメインの前に何もないというのは、残念ながらできません。
また、pathの部分も、短縮した値だけにしたいのですが、URLマッチングの関係で、それもできません。

そのため、別サーバで上げている、http://chanto.me/ 用のapacheでRedirectMatchをして、
次のようにRedirectするようにしています。

http://chanto.me/[チェックポイントIDの短縮]/[日付の短縮] 
  ↓
http://www.chanto.me/s/[チェックポイントIDの短縮]/[日付の短縮]
    ↓
http://www.chanto.me/[ユーザID]/cp-[チェックポイントID]/[日付]/

ということで、こんな感じで短くできました。
http://chanto.me/0Ib/08uwb


しかし、日付部分は決まった数字しかこないので、日付用の短縮処理を作ればさらに短くできたんですよねえ。


ところで、bit.lyなどを使わなかったのは、すべてのエントリーに短縮URLを作りたかったからです。


あまりきれいなコードではありませんが、参考まで。何か問題やご意見があればお待ちしています。