34
26

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

LINE BOTで彼女botを作りたい

Last updated at Posted at 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

コーディング

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

参考文献

34
26
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
34
26

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?