【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でも作成するかな。最後まで読んでいただきありがとうございました!
本日のオススメ