🔥

LINE BOTで彼女botを作りたい

2021/03/07に公開

はじめに

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

Image from Gyazo

QRコード

Image from Gyazo

使用技術

  • Go
  • line-bot-sdk
  • heroku

事前準備

LINE Developers登録 - LINE 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

  • LINE Developers > Messaging API > Channel access token

Image from Gyazo

  • 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

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

コーディング

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

参考文献

Discussion