goo.glも終わるしGoとGAEで短縮URLサービスをつくろう


goo.glは終わってしまうようなので、短縮URLサービスをみんな自分で作るといいと思います。QRコードも表示できるので、スマホにURLを送るときも簡単です。

ソースコード:juntaki/url-shortener
完成品:https://s.juntaki.com

前提

  • GAE
  • 短めのドメイン

つかいかた

reCAPTCHAを使うので、登録しておきましょう。Invisibleなやつを選んでおきます。
reCAPTCHA: Easy on Humans, Hard on Bots

ソースコードはここから入手してください。
juntaki/url-shortener

app.ymlを編集して、URLを自分のドメインに、SITE_KEYを先程取得したものに変更します。

env_variables:
  BASE_URL: "https://s.juntaki.com"
  RECAPTCHA_SITE_KEY: "6Lc48lAUAAAAAFehXaHNp0Ys-lS1iUfNtUXd_-eR"

secret.ymlのファイルを作ります。

env_variables:
    RECAPTCHA_SECRET: "<your-recaptcha-secret>"

あとは適当なプロジェクトにデプロイしたら完成です。

gcloud config set project <project-name>
gcloud app deploy

技術的な解説

短いURLをつくる方法

適当なハッシュ関数で〜と考えていましたが、ぶつからなくても、長くなっては意味がないです。単純ですが、既存のURLとぶつからなくなるまで、下記の文字から3つランダムで選びます。

var letters = []rune("23456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnpqrstuvwxyz")

文字は、Base58から数字の1と小文字のoの2文字を取り除いたBase56のセットになっています。発表スライドなどでパッと見せても見間違えにくいです。
56*56*56=17万通り近くあるので、そんなに枯渇することもないでしょう。

QRコードを作る

skip2/go-qrcode: QR Code encoder (Go)
これを使いました。Base64エンコードして、テンプレートに組み込んでしまえば、画像の配信を考えなくて良いので簡単です。

reCAPTCHAを使う

単に使ってみたかっただけですが、お手軽さとスパム対策を考えると、ちょうどよい選択肢でした。
button id='submit'とあるサンプルをコピペして使うと、そのまま使えないシンプルな罠が仕掛けてあったり、このサンプルは本当に使わせる気があるのだろうか・・・
Developer's Guide  |  reCAPTCHA  |  Google Developers
jquery - javascript submit() is not a function? - Stack Overflow

まとめ

GAEなので維持費0円でURL短縮サービスがつくれました。いいかんじの背景画像などをつけると、独自感が出てよいのではないでしょうか。
リダイレクトするときに、ログを取っておくとアクセス解析みたいなことも簡単にできると思います。