2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Go + Firebase で短縮URL生成ツールを作る

Last updated at Posted at 2019-02-14

息抜きに Go と Firebase を使って短縮URL生成ツールを作ってみました。
ところどころ雑な部分が目立ちますが、大目にみてください。
https://github.com/suhaya3317/short-url
では、早速解説にいってみたいと思います。

Firebaseプロジェクトを作る

https://console.firebase.com
でプロジェクトを作ります。

Dynamic Linksの設定

メニューの「拡大」のところに「Dynamic Links」があるのでクリックして開きます。
スクリーンショット 2019-02-14 10.52.02.png

そのまま「始める」を押すと、以下の画面になります。
サブドメインをカスタマイズできるので、自分のお好みに設定してください。
スクリーンショット 2019-02-14 10.52.19.png

無事、作成が完了すると以下の画面になります。
これでDynamic Linksの設定は完了です。
スクリーンショット 2019-02-14 10.53.10.png

Go

次に実際のコードを見ていきましょう。

  • エラーハンドリングはしてません。。

conifg.envの作成

ファイル内には

  • FirebaseのAPIキー
  • 上記で設定したドメイン

を書き込んでおきます。
FirebaseのAPIキーは、Firebaseプロジェクトの設定ページの「ウェブ API キー」です。

config.env
FIREBASE_KEY=*****************************
DOMAIN=https://example.page.link

.envファイルを読み込む

github.com/joho/godotenvというパッケージを使用しています。
https://godoc.org/github.com/joho/godotenv

$ go get github.com/joho/godotenv
main.go
err := godotenv.Load("config.env")
if err != nil {
	panic(err)
}

リクエスト先のURLを設定する

main.go
const dynamicLinksApiUrl = "https://firebasedynamiclinks.googleapis.com/v1/shortLinks?key="
url := dynamicLinksApiUrl + os.Getenv("FIREBASE_KEY")

短縮したいURLを取得する

コマンドラインパラメータから取得しています。

main.go
longLink := os.Args[1]

必要な情報を詰めていく

リクエストする際のjsonは以下のようなものです。

{
   "longDynamicLink": "https://example.page.link/?link=https://example.com/aaa/bbb/ccc/ddd/eee",
   "suffix": {
     "option": "SHORT"
   }
}

longDynamicLink設定したドメイン+/?link=+短縮したいURLとなっていて、
optionSHORTまたはUNGUESSABLEを入れることができます。
*
SHORT 👉 パスコンポーネントが4文字(https://example.page.link/WXYZ)
UNGUESSABLE 👉 パスコンポーネントが17文字(https://example.page.link/UVWXYZuvwxyz12345)

main.go
type RequestJson struct {
	LongDynamicLink string `json:"longDynamicLink"`
	Suffix          `json:"suffix"`
}

type Suffix struct {
	Option string `json:"option"`
}

// SHORTを指定しているため、パスコンポーネントは4文字になる
requestJson := &RequestJson{os.Getenv("DOMAIN") + "/?link=" + longLink, Suffix{"SHORT"}}
requestJsonByte, err := json.Marshal(requestJson)
if err != nil {
	panic(err)
}

// *Request(req)を作ります。
req, err := http.NewRequest("POST", url, bytes.NewReader(requestJsonByte))
if err != nil {
	panic(err)
}
// リクエストヘッダーをセットします。
req.Header.Set("Content-Type", "application/json")

リクエストする

main.go
client := &http.Client{}
res, err := client.Do(req)
if err != nil {
	panic(err)
}

レスポンスをパースする

レスポンスのjsonは以下のようなものです。

{
	"shortLink": "https://examle.page.link/****",
	"previewLink": "https://examle.page.link/****?d=1"
}
main.go
body, err := ioutil.ReadAll(res.Body)
if err != nil {
	panic(err)
}
defer res.Body.Close()

type ResponseJson struct {
	ShortLink   string
	PreviewLink string
}

var responseJson ResponseJson
err = json.Unmarshal(body, &responseJson)
if err != nil {
	panic(err)
}

出力する

main.go
fmt.Print(responseJson.ShortLink)

ビルドする

$ go build main.go

実行する

$ ./main 短縮したいURL

参考文献

https://firebase.google.com/docs/dynamic-links/rest?hl=ja
https://qiita.com/ryo_hisano/items/ffbba33d4737664626e8

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?