短縮URL用に数字の短縮化をPythonで書いた
我が社が提供するサービス「ChanTo.me」に、エントリーした内容をtwitterにtweetする機能を付けました。
といっても、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を作りたかったからです。
あまりきれいなコードではありませんが、参考まで。何か問題やご意見があればお待ちしています。