前回の続きです。

リンクの見た目をいい感じにするためにOGPのJSONのサーバーを作って、Data-Driven Contentで表示するようにしたよ、というのが前回の話です。

echoのサーバーに機能追加

すでに動かしているGoのサーバーに機能を追加しました。/ogp?url=http://xxxxxとリクエストすると欲しいサイトのOGPをJSONで返してくれるようにします。

依存ライブラリのインストール

Goはまだ触り始めたばかりでよくわからないんですが、元々参考にしてたコードがdepというもので依存ライブラリの管理をしていたので、そのまま踏襲して使いました。

Go製でOGPを取得できるライブラリって探して見つけた↓を使いました。

otiai10/opengraph: Golang Open Graph Parser

$ dep ensure -add github.com/otiai10/opengraph

で、↑だとリリースが少し古くてDescriptionがうまく取れないことがあったのでmasterを参照すべく、version = "1.0.0""の行を削除し、branch = "master"の行を追加し、再度 $ dep ensureしました。

[[constraint]]
  name = "github.com/otiai10/opengraph"
  branch = "master"

これで準備OKです。

ルーティングとハンドラ

↑と呼ぶのが適切かどうかはさておき、次はURLと対応する処理を書きました。

Go言語のechoについては以前ちょろっと書いたので省略しますが、とても簡単にかけました。

まずはURLとその処理関数を追加する部分。

 1// importに追加
 2import(
 3	...
 4	"github.com/otiai10/opengraph"
 5)
 6
 7func main() {
 8	...
 9	e := echo.New()
10	e.GET("/ogp", getOgp)
11	...
12}

処理の実装がこんな感じ。

 1func getOgp(ctx echo.Context) error {
 2	url := ctx.QueryParam("url")
 3	if len(url) == 0 {
 4		return ctx.String(http.StatusBadRequest, "Url is empty")
 5	}
 6
 7	og, err := opengraph.Fetch(url)
 8	if err != nil {
 9		return ctx.String(http.StatusInternalServerError, fmt.Sprintf("Error: %s", err.Error()))
10	}
11	og = og.ToAbsURL()
12	return ctx.JSON(http.StatusOK, og)
13}

クエリパラメータで渡ってくるurlを取り出して、先ほどのライブラリに渡してOGPの情報を得ます。それをJSONとして返すだけです。

例えばこちらの記事の情報を取得するには、サーバー/ogp?url=https://blog.piyo.tech/posts/2018-03-27-deploy-go/ とします。すると↓のようなJSONが得られます。

 1{
 2   "Title":"ブログのビルド用にGoのサーバーをVPS上で動かした話 - ぴよログ",
 3   "Type":"article",
 4   "URL":{
 5      "Source":"https://blog.piyo.tech/posts/2018-03-27-deploy-go/",
 6      "Scheme":"https",
 7      "Opaque":"",
 8      "User":null,
 9      "Host":"blog.piyo.tech",
10      "Path":"/posts/2018-03-27-deploy-go/",
11      "RawPath":"",
12      "ForceQuery":false,
13      "RawQuery":"",
14      "Fragment":""
15   },
16   "SiteName":"ぴよログ",
17   "Image":[
18      {
19         "URL":"https://goo.gl/NSXeuF",
20         "SURL":"",
21         "Type":"",
22         "Width":0,
23         "Height":0,
24         "Alt":""
25      }
26   ],
27   "Video":[
28
29   ],
30   "Audio":[
31
32   ],
33   "Description":"ブログのビルド用にGoのサーバーをVPS上で動かした話",
34   "Determiner":"",
35   "Locale":"",
36   "LocaleAlt":[
37
38   ],
39   "Favicon":"https://blog.piyo.tech/images/favicon-16x16.png"
40}

あとは前回の記事のとおり、Data-Driven ContentでこのJSONを使うだけですね。

簡単にAPIサーバーを作ることができたおかげで思ったとおりにブログいじりが進みました。