1. alt
Changes in body
Source | HTML | Preview
@@ -1,72 +1,72 @@
goo.glは終わってしまうようなので、短縮URLサービスをみんな自分で作るといいと思います。QRコードも表示できるので、スマホにURLを送るときも簡単です。
ソースコード:[juntaki/url-shortener](https://github.com/juntaki/url-shortener)
完成品:[https://s.juntaki.com](https://s.juntaki.com)
![38465564-40d7b79e-3b58-11e8-978f-304193d4f5c3.gif](https://qiita-image-store.s3.amazonaws.com/0/69350/10984965-7cf8-dc3b-0dac-b099b3bd8e2b.gif)
## 前提
* GAE
* 短めのドメイン
## つかいかた
reCAPTCHAを使うので、登録しておきましょう。Invisibleなやつを選んでおきます。
[reCAPTCHA: Easy on Humans, Hard on Bots](https://www.google.com/recaptcha/intro/android.html)
ソースコードはここから入手してください。
[juntaki/url-shortener](https://github.com/juntaki/url-shortener)
app.ymlを編集して、URLを自分のドメインに、SITE_KEYを先程取得したものに変更します。
-~~~
+~~~yaml
env_variables:
BASE_URL: "https://s.juntaki.com"
RECAPTCHA_SITE_KEY: "6Lc48lAUAAAAAFehXaHNp0Ys-lS1iUfNtUXd_-eR"
~~~
secret.ymlのファイルを作ります。
-~~~
+~~~yaml
env_variables:
RECAPTCHA_SECRET: "<your-recaptcha-secret>"
~~~
あとは適当なプロジェクトにデプロイしたら完成です。
~~~
gcloud config set project <project-name>
gcloud app deploy
~~~
## 技術的な解説
### 短いURLをつくる方法
適当なハッシュ関数で〜と考えていましたが、ぶつからなくても、長くなっては意味がないです。単純ですが、既存のURLとぶつからなくなるまで、下記の文字から3つランダムで選びます。
-~~~
+~~~go
var letters = []rune("23456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnpqrstuvwxyz")
~~~
文字は、[Base56](https://ja.wikipedia.org/wiki/Base58)のセットになっています。発表スライドなどでパッと見せても見間違えにくいです。
56*56*56=17万通り近くあるので、そんなに枯渇することもないでしょう。
### QRコードを作る
[skip2/go-qrcode: QR Code encoder (Go)](https://github.com/skip2/go-qrcode)
これを使いました。Base64エンコードして、テンプレートに組み込んでしまえば、画像の配信を考えなくて良いので簡単です。
### reCAPTCHAを使う
単に使ってみたかっただけですが、お手軽さとスパム対策を考えると、ちょうどよい選択肢でした。
`button id='submit'`とあるサンプルをコピペして使うと、そのまま使えないシンプルな罠が仕掛けてあったり、このサンプルは本当に使わせる気があるのだろうか・・・
[Developer's Guide  |  reCAPTCHA  |  Google Developers](https://developers.google.com/recaptcha/intro)
[jquery - javascript submit() is not a function? - Stack Overflow](https://stackoverflow.com/questions/6525790/javascript-submit-is-not-a-function)
## まとめ
GAEなので維持費0円でURL短縮サービスがつくれました。いいかんじの背景画像などをつけると、独自感が出てよいのではないでしょうか。
リダイレクトするときに、ログを取っておくとアクセス解析みたいなことも簡単にできると思います。