【Golang】LINE Messaging API と API Gateway + Lambdaでおうむ返しBotを作成する

どもども、最近多忙すぎで更新できずにいました。落ち着いたとは言っていない。


本日は、API Gateway と Lambda、LINE Massaging API を用いておうむ返しBotを作成してみようと思います。


使用言語はGolangです。それでは、やっていきましょう。

事前準備

今回の記事では主にLambdaにデプロイするコード内容を紹介する予定です。事前に下記の準備を済ませておいてください。

・Messaging API を使用できるようにしておいてください
https://developers.line.biz/ja/docs/messaging-api/getting-started/
CHANNEL_SECRET, CHANNEL_TOKEN, USER_IDを取得しておいてください!

・API Gateway と Lambda の準備
今回AWSインフラ構築周りの解説はしません、事前に準備をお願いします
https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/services-apigateway.html

・API Gateway のエンドポイントURLをMessaging API のweb hookに登録しておいてください
https://developers.line.biz/ja/docs/messaging-api/building-bot/#set-up-bot-on-line-developers-console:~:text=%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E3%83%88%E3%83%BC%E3%82%AF%E3%83%B3-,%23,-Webhook%20URL%E3%82%92

・Lambdaをデプロイする方法を用意しておいてください。
API Gateway と含めてSAMで作成してしまっても問題ないですし、Lambrollなどでファイルのみデプロイしてしまってもいいでしょう。(僕の推しツール、非常に手軽です!)
https://github.com/fujiwara/lambroll

上記準備が整っていましたら、いよいよコードを書いていきます。

メッセージ内容を受け取る

LINEで送信されたメッセージを受け取ってみます。まずは取得済みのCHANNEL_SECRET, CHANNEL_TOKEN, USER_IDを.envファイルに入力しておきます。後ほどgodotenvを使用して呼び出します。
https://github.com/joho/godotenv
Githubなどで管理する際は、こちらの.envファイルを.gitignoreに含めておいてください。

CHANNEL_SECRET= "xxxxxxxxxxxxxxxxxxxxxxxx"
CHANNEL_TOKEN= "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
USER_ID= "xxxxxxxxxxxxxxxxxxxxxxxx"

LINE Messagin API webhookからAPI GatewayへのリクエストはPOSTメソッドです。今回はリクエストボディのEventsから必要な要素を受け取る構造体を作成します。受け取るパラメータはたくさんありますが、今回はtextの内容と送信元ユーザさえ分かればいいので、下記のような構造体を定義しました。

// リクエストボディを受け取る構造体
type Response struct {
	RequestBody string `json:"RequestBody"`
}

// リクエストボディから特定のパラメータを受け取る構造体
type Event struct {
	Events []struct {
		Message struct {
			Text string `json:"text"`
		} `json:"message"`
		Source struct {
			UserID string `json:"userId"`
		} `json:"source"`
}

余談ですが、JsonからGo構造体への変換は下記のサイトがおすすめです
https://mholt.github.io/json-to-go/

次にMassaging API からAPI Gateway に渡されたリクエストボディがjsonなのでjson.Unmarshalを使用して構造体にし、パラメータを使用できるようにしておきます。

func handler(request events.APIGatewayProxyRequest) {
  // 先ほど定義した構造体
	var event Event

  // リクエストボディを受け取る
	body := request.Body
	res := Response{
		RequestBody: body,
	}

	json.Unmarshal([]byte(res.RequestBody), &event)

  // 送信元userIDとテキスト内容を変数に代入
	userid := fmt.Sprintf("%v", event.Events[0].Source.UserID)
	text := fmt.Sprintf("%v", event.Events[0].Message.Text)

  // 送信元ユーザにメッセージを返信する関数(次に実装します)
	postLineMessage(userid, text)
}

次にメッセージを送信したユーザに対し、送られた内容をそのまま返す関数を実装します。ここでgodotenvを使用し、.envから接続情報を取得します。

func postLineMessage(userid string, text string) {
	godotenv.Load(".env")

	bot, err := linebot.New(os.Getenv("CHANNEL_SECRET"), os.Getenv("CHANNEL_TOKEN"))
	if err != nil {
		fmt.Println(err)
	}

	if _, err := bot.PushMessage(userid, linebot.NewTextMessage(text)).Do(); err != nil {
		fmt.Println(err)
	}
}

あとはlambdaで実行できるようにしておけば完成です。

func main() {
	lambda.Start(handler)
}

実際にLINEでメッセージを送信すると、そのまま同じ文章のメッセージが返ってくると思います。

あとは煮るなり焼くなり好きに使えます。

まとめ

今回はLINE Messagin API とLambda、API Gatewayを使用しておうむ返しBotを作成してみました。


一度作成しておけばいろいろなパターンで使い回すことができて便利です。


お天気Botでも作成するかな。最後まで読んでいただきありがとうございました!


本日のオススメ

AWS,Golang

Posted by CY