Entry: ある意味、世界一のURL短縮サービスを作った
ある意味、世界一のURL短縮サービスを作った
[2009.09.30] Asiajinで取り上げていただきました。ありがとうございます。そして、同じネタがすでにあったと知りました。リサーチ不足。
長いURLの文字数を削減してくれるURL短縮サービスはたくさんあるけど、世界中のどの方式よりも文字数を短縮できる方法を発明しました。
サイト名ですでにネタばれですが、これは各URLに割り振るIDをマルチバイト文字の組み合わせにすることで、文字数的には短いでしょ、というネタです。ついったーなんかは完全に文字数に依存なので有効かも。
IDに使用する文字は日本の常用漢字1945字です。シーケンシャルに割り振り、使い切ったら繰り上がるので、最初の370万件は2桁に収まり、最初の73億件も3桁に収まります。
注意事項としては
- Firefox3.5, IE7, Chrome, iPhoneで正常動作を確認しました。逆に、Androidエミュレータ, DoCoMoやAUのブラウザ(フルブラウザ含む)は日本語ドメインに未対応のようです。
- IDはシーケンシャルに割り振られるので使用済みのIDは容易に推測できます。
- 「悪」などというイヤなIDが当たってしまったら
リロードして再割当してください。「縮AGAIN」ボタンを押してください。 - これはジョークサービスです。本サービスの利用に起因または関連する利用者の損害について管理者は何ら責任を負いません。
Entry: 縮.jpに待望の「縮AGAIN」ボタンを搭載
縮.jpに待望の「縮AGAIN」ボタンを搭載
縮.jp。7月に作って放置してたら10月になって話題になった。人生で一番集客した。そんな訳で、ネタを必要以上に膨らませるべく、システムを改修しました。見た目的にはあまり変化ありませんが、中身はほぼ丸々変わってます。特筆すべき変化は。。
待望の「縮AGAIN」ボタンを搭載
生成された短縮URLが気に入らなかった場合、このボタンを押すと別のURLを生成してくれます。なお、縮AGAINした場合、古いURLはしばらくして解放されます。
既設の短縮URLがあれば、短い順にご提案
今までは湯水のように新規作成してましたが、縮ボタンを押した際、まずは既設の短縮URLを提示するようになりました。縮AGEINすると短い順に既設URLが表示され、なくなれば新規作成されます。
転送時、末尾のゴミを可能な限り取り除く
Twitterでhttp://縮.jp/上これすげーみたいなつぶやきが多発していたので、こういう場合はhttp://縮.jp/上を検知して転送します。Perlでいうと、
$id =~ s/¥P{Han}.*//;
となっています。漢字を表す正規表現なんて初めて知りました。
ちなみに、ファイルベースからPostgresqlに移行
パフォーマンスいいかなと思って、1件1ファイルなどというデータ管理をしてたんですが、IDがシーケンシャルに固定されるとか、逆引きできないとか、色々問題あったのでPostgresqlにしました。なお、ファイルベースのキャッシュの仕組みを導入したので転送時のパフォーマンスは以前と変わらない。はず。
APIにも変更あり
offsetというパラメータが新設されました。これは前述の既設URLの再利用と関連するもので、任意の既設URLを取り出すためのパラメータです。offsetを十分に大きくすると自動的に新規作成されます。通常は指定しないでください。
既知の問題
- 元URLがbit.ly等ですでに短縮済みだった場合、iPhoneで転送されない。確かソフトバンクの仕様でiPhoneで多段リダイレクトできない。
- Twitter用のいくつかのGreaseMonkeyスクリプトやアドオンで縮.jpへ飛べない。FirefoxのJavascriptのバグっぽい挙動が原因と思われる。対処法はこちら
- Twitter周辺サービスで日本語ドメインが誤ってパーセントエンコードされているケースも見かけます。サーバサイドでの処理に問題があるのではないか(憶測)。
- iPhoneの多くのアプリで開けない。おそらくアプリからwebkitだかのAPI的なものに渡すURLをpunycode変換してないのではないか(憶測)。対処法はこちらの12月15日の記事くらいしか見当たらなかった。
今後の予定
任意のIDを指定可能に- 不人気文字を避ける仕組み
- 元URLがすでに短縮URLだった場合に展開してから短縮
- スパム対策
Entry: 縮 REST API
縮 REST API
「縮 REST API」は、URL短縮/転送サービス「縮.jp」の機能を、アプリケーションから利用するためのインターフェースを提供します。
全てのAPIは下記のURL以下で提供されます。
http://api.xn--jj0a.jp/
現在サポートされている操作は、短縮URLの生成(generate.jsonへのPOST)と短縮URLの展開(lookup.jsonへのGET)です。いずれもレスポンスとしてJSONを返します。また、クエリーとしてcallbackを渡すことでJSONPを受け取ることもできるかもしれません。
GENERATE
任意のURLを渡すことで、新規に短縮URLを生成します。
パラメータ
- fUrl(必須)
短縮対象のURL。http://かhttps://で始まる必要があります。 - customId(オプション)
任意の漢字の組み合わせで短縮URLの識別子を指定します。utf8でパーセントエンコードしてください。 - offset(オプション)
fUrlで指定したURLに対する既設の短縮URLがひとつ以上存在する場合、このパラメータに0以上の数値を指定することで任意の候補を選択することができます。既設URLは文字数の短い順に並んでいます。offsetが既設URLの数より大きいとき、新しいURLが生成されます。このパラメータは特殊な目的がない場合は指定しないでください。
リクエスト例
POST /generate.json
fUrl=http://example.com&id=%E4%B8%83
レスポンス例
{"result":{"fUrl":"http://example.com/","generated":"http://縮.jp/七"}}
LOOKUP
既存の短縮URLの識別子を受け取り、元のURLを返します。識別子はUTF-8でパーセントエンコードしてください。
パラメータ
- id(必須)
URLの識別子を指定します。 - hash
後方互換性のための、idの別名です。(廃止の予定)
リクエスト
GET /lookup.json?id=%E4%B8%83
レスポンス
{"result":{"fUrl":"http://example.com"}}
共通
HTTPレスポンスコード
正常/エラーに関わらず「200 OK」を返します。
エラー時のレスポンスボディ
下記の書式でJSONデータを返します。
{"error":"[エラーコード] [説明]"}
エラーコード一覧
- 400: generateの際、fUrlの書式が正しくない、customIdに不正な文字が含まれる、など。
- 409: generateの際、customIdがすでに使用されている、など。
- 404: lookupの際、指定のidが存在しない、など。
実装例
generate.jsonを利用して短縮URLを取得するPerlコードは以下のようになります。
use LWP::UserAgent; use JSON::XS; my $generated = _shuku('http://example.com'); sub _shuku { my $ua = LWP::UserAgent->new; my $res = $ua->post('http://api.xn--jj0a.jp/generate.json', {'fUrl' => $_[0]}); my $obj = decode_json $res->content(); my $decoded = $obj->{result}->{generated}; utf8::decode($decoded); return $decoded; }
Subscribe to my RSS feed