Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
19
Help us understand the problem. What is going on with this article?
@umaibou1126

LINE BOTで彼女botを作りたい

はじめに

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

Image from Gyazo

QRコード

Image from Gyazo

使用技術

  • Go
  • line-bot-sdk
  • heroku

事前準備

LINE Developers登録 - LINE BOTの作成までは、以下ガイドを参考に致しました。
- Messaging APIを始めよう
- ボットを作成する

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

参考文献

19
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
19
Help us understand the problem. What is going on with this article?