LINE BOTで彼女botを作りたい

# はじめに
寂しい時にメッセージ返してくれる**彼女風LINE BOT**を作りました。

[![Image from Gyazo](https://i.gyazo.com/15fc3c4478ec6a72eba279cff0f8cb9e.png)](https://gyazo.com/15fc3c4478ec6a72eba279cff0f8cb9e)

#### QRコード

[![Image from Gyazo](https://i.gyazo.com/f22a26304e7bc0755cd4f4a95b1d2cd2.png)](https://gyazo.com/f22a26304e7bc0755cd4f4a95b1d2cd2)

#### 使用技術
 - Go
 - line-bot-sdk
 - heroku

# 事前準備
LINE Developers登録 - LINE BOTの作成までは、以下ガイドを参考に致しました。
 - [Messaging APIを始めよう](https://developers.line.biz/ja/docs/messaging-api/getting-started/)
 - [ボットを作成する](https://developers.line.biz/ja/docs/messaging-api/building-bot/)

# Heroku準備

#### アプリ作成

```
$ heroku login
$ heroku create sample-bot
$ heroku git:remote -a sample-bot
```

#### LINE シークレット&& トークンをHerokuに設定

 - LINE Developers > Basic settings > Channel secret

[![Image from Gyazo](https://i.gyazo.com/b1fe62c0bde53069254a940dd27a325c.png)](https://gyazo.com/b1fe62c0bde53069254a940dd27a325c)

 - LINE Developers > Messaging API > Channel access token

[![Image from Gyazo](https://i.gyazo.com/cdf93a8ae01e9099c7adcce8f10c5de6.png)](https://gyazo.com/cdf93a8ae01e9099c7adcce8f10c5de6)

 - Herokuアプリ設定

```
$ heroku config:set CHANNEL_SECRET=XXXXXXXXXX --app sample-bot 
$ heroku config:set CHANNEL_TOKEN=XXXXXXXXXX --app sample-bot   
```

#### Webhook URL登録

 - LINE Developers > Messaging API > Webhook settings

[![Image from Gyazo](https://i.gyazo.com/270c5c05330554eca80bea1b7476e9c9.png)](https://gyazo.com/270c5c05330554eca80bea1b7476e9c9)

# Bot作成

#### Goプロジェクト準備

```
$ mkdir sample-bot && cd sample-bot
$ go mod init github.com/GitHubユーザ名/GitHubリポジトリ名
```

#### Goライブラリインストール

```
$ go get github.com/line/line-bot-sdk-go/linebot
$ go get github.com/gin-gonic/gin
```

#### コーディング

```main.go
package main

import (
	"log"
	"os"
	"strings"

	"github.com/gin-gonic/gin"

	"github.com/line/line-bot-sdk-go/linebot"
)

func main() {
	port := os.Getenv("PORT")

	if port == "" {
		log.Fatal("$PORT must be set")
	}
	bot, err := linebot.New(
		"LINE シークレット（上記参照）",
		"LINE アクセストークン（上記参照）",
	)
	if err != nil {
		log.Fatal(err)
	}

	router := gin.New()
	router.Use(gin.Logger())

	// LINE Messaging API ルーティング
	router.POST("/callback", func(c *gin.Context) {
		events, err := bot.ParseRequest(c.Request)
		if err != nil {
			if err == linebot.ErrInvalidSignature {
				log.Print(err)
			}
			return
		}

		// "可愛い" 単語を含む場合、返信される
		var replyText string
		replyText = "可愛い"

		// チャットの回答
		var response string
		response = "ありがとう！！"

		// "おはよう" 単語を含む場合、返信される
		var replySticker string
		replySticker = "おはよう"

		// スタンプで回答が来る
		responseSticker := linebot.NewStickerMessage("11537", "52002757")

		// "猫" 単語を含む場合、返信される
		var replyImage string
		replyImage = "猫"

		// 猫の画像が表示される
		responseImage := linebot.NewImageMessage("https://i.gyazo.com/2db8f85c496dd8f21a91eccc62ceee05.jpg", "https://i.gyazo.com/2db8f85c496dd8f21a91eccc62ceee05.jpg")

		// "ディズニー" 単語を含む場合、返信される
		var replyLocation string
		replyLocation = "ディズニー"

		// ディズニーが地図表示される
		responseLocation := linebot.NewLocationMessage("東京ディズニーランド", "千葉県浦安市舞浜", 35.632896, 139.880394)

		for _, event := range events {
			// イベントがメッセージの受信だった場合
			if event.Type == linebot.EventTypeMessage {
				switch message := event.Message.(type) {
				// メッセージがテキスト形式の場合
				case *linebot.TextMessage:
					replyMessage := message.Text
					// テキストで返信されるケース
					if strings.Contains(replyMessage, replyText) {
						bot.ReplyMessage(event.ReplyToken, linebot.NewTextMessage(response)).Do()
						// スタンプで返信されるケース
					} else if strings.Contains(replyMessage, replySticker) {
						bot.ReplyMessage(event.ReplyToken, responseSticker).Do()
						// 画像で返信されるケース
					} else if strings.Contains(replyMessage, replyImage) {
						bot.ReplyMessage(event.ReplyToken, responseImage).Do()
						// 地図表示されるケース
					} else if strings.Contains(replyMessage, replyLocation) {
						bot.ReplyMessage(event.ReplyToken, responseLocation).Do()
					}
					// 上記意外は、おうむ返しで返信
					_, err = bot.ReplyMessage(event.ReplyToken, linebot.NewTextMessage(replyMessage)).Do()
					if err != nil {
						log.Print(err)
					}
				}
			}
		}
	})
	router.Run(":" + port)
}
```

#### Herokuデプロイ

```
$ git add -A
$ git commit -m "create sample-bot"
$ git push heroku main
```

# 参考文献
 - [Goプロジェクトのはじめかたとおすすめライブラリ8.5選。ひな形にも使えるサンプルもあるよ。
](https://qiita.com/yagi_eng/items/65cd812107362d36ae86)
 - [千葉県東京ディズニーランド](http://www.geocoding.jp/?q=%E5%8D%83%E8%91%89%E7%9C%8C%E6%9D%B1%E4%BA%AC%E3%83%87%E3%82%A3%E3%82%BA%E3%83%8B%E3%83%BC%E3%83%A9%E3%83%B3%E3%83%89)
 - [GolangでLine APIをいじくるよ](https://blog.kazu634.com/labs/golang/2019-02-23-line-sdk-go/)