LoginSignup
46
31

More than 5 years have passed since last update.

Go(golang)+HerokuでLINE Messaging APIに触れてみたよ!

Last updated at Posted at 2016-11-06

golang-320x320.png

Goの勢いを感じつつ、LineBot APIが新しくなったということでGo未経験からGo+HerokuでLINE Messaging APIでBOTを作ってみました!

LINE Messaging APIの利用登録

以下URLから利用登録を行います。
今回はお試しということで「Developer Trial」を選択。
(登録するにはLINEアプリ内の設定->アカウント->ログイン許可をONにする必要があります。)

スクリーンショット 2016-11-06 16.47.47.png

「Developer Trial」は友達等の制限はあるものの、無料でPush APIも利用出来ます。
プランはこんな感じ。

スクリーンショット 2016-11-06 16.58.38.png

Bot名、Botアイコン、職業などを選択して登録。
登録完了後、作成したBOTのLINE@MANAGERから「アカウント設定」->「bot設定」で「APIを利用する」を選択、他設定は以下のようにしておきます。

スクリーンショット 2016-11-06 20.00.09.png

一旦LINEの設定は終了!
次はLINEのHookに応答するサーバー環境の準備を行います。

Go環境準備

開発環境

MacOS 10
Go 1.6

インストール

$ brew install go
...
$ go version
go version go1.6.2 darwin/amd64

パス設定

(zshを利用)

export GOPATH=$HOME/.go
export PATH=$GOPATH/bin:$PATH
source ~/.zshrc

Heroku用のGoアプリを準備

$ go get github.com/heroku/go-getting-started
$ ls $GOPATH/src/github.com/heroku/go-getting-started

ちなみにここで$GOPATHに以下のように展開された

$ tree -L 1 ~/.go
.go
├── bin
├── pkg
└── src

IntelliJ IDEA環境準備(+Golang plugin)

Syntaxチェックやメソッド補完など初心者にはありがたいのでインストールします!(好みでここは飛ばしてください)
(参考:http://qiita.com/kaiinui/items/433eb86c022ffcad0bea)

1.インストール

から Community Edition をダウンロード!

2.Golang pluginをインストール

Preferences -> Plugins -> Go を検索&インストール

スクリーンショット 2016-10-27 22.35.38.png

3.プロジェクト作成

New ProjectからGoを選択
=> Project SDKを指定(macでbrewだったら/usr/local/Cellar/go/[version]/libexecとかかな?)
=> Project locationに$GOPATH/src/github.com/heroku/go-getting-startedを指定

スクリーンショット 2016-10-27 23.09.20.png

Heroku環境準備

ユーザー登録

Herokuにアクセスして、ユーザー登録を行います。

右上のsign upから必要事項を入力して「CREATE FREE ACCOUNT」をクリック。
しばらくするとメールが送られてくるので、そこから本登録。
(「Primary Development Language」は初期で作られるサンプルAppが変わるだけっぽいので、なんでも大丈夫)

スクリーンショット 2016-11-06 16.18.57.png

Herokuにアプリ登録

コマンドラインからアプリの更新を行う為に、以下のツールをインストール

インストールが完了したら、以下のコマンドをターミナルから入力し
メールアドレスとパスワードを使ってログイン確認を行う。

$ heroku login
Enter your Heroku credentials.
Email: [メールアドレス]
Password (typing will be hidden):
Logged in as [メールアドレス]

ログインが確認出来たらHeroku用のGoアプリをHerokuにデプロイし、アプリ作成

$ cd $GOPATH/src/github.com/heroku/go-getting-started
$ heroku create
...
Creating app... done,
https://[アプリ名].herokuapp.com/ | https://git.heroku.com/[アプリ名].git

正しくデプロイが完了するとHerokuのPersonal apps内にアプリが出来ているのが確認出来ます。

スクリーンショット 2016-11-06 16.33.23.png

Bot実装

今回は適当にガヤを入れてくれる、ウザいBotを作ります!

WebHook設定

LINE@MANAGER内の「bot設定」から「LINE Developers」をクリック
Basic Information内のEditを押し、Webhook URLに以下URlを設定

https://[herokuアプリ名].herokuapp.com/hook

ついでにChannel SecretChannel Access Tokenを確認しておきます。

LineのSDKを取得

go get github.com/line/line-bot-sdk-go/linebot

go-getting-started/main.goを修正

main.go
package main

import (
    "log"
    "net/http"
    "os"

    "github.com/gin-gonic/gin"
    "github.com/line/line-bot-sdk-go/linebot"
    "fmt"
    "time"
    "math/rand"
)

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

    if port == "" {
        log.Fatal("$PORT must be set")
    }

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


    router.POST("/hook", func(c *gin.Context) {
        client := &http.Client{Timeout: time.Duration(15 * time.Second)}
        bot, err := linebot.New(<Channel Secret>, <Channel Access Token>, linebot.WithHTTPClient(client))
        if err != nil {
            fmt.Println(err)
            return
        }
        received, err := bot.ParseRequest(c.Request)

        for _, event := range received {
            if event.Type == linebot.EventTypeMessage {
                switch message := event.Message.(type) {
                case *linebot.TextMessage:
                    source := event.Source
                    if source.Type == linebot.EventSourceTypeRoom {
                        if resMessage := getResMessage(message.Text); resMessage != "" {
                            postMessage := linebot.NewTextMessage(resMessage)
                            if _, err = bot.ReplyMessage(event.ReplyToken, postMessage).Do(); err != nil {
                                log.Print(err)
                            }
                        }
                    }
                }
            }
        }
    })

    router.Run(":" + port)
}


func getResMessage(reqMessage string) (message string) {
    resMessages := [3]string{"わかるわかる","それで?それで?","からの〜?"}

    rand.Seed(time.Now().UnixNano())
    if rand.Intn(5) == 0 {
        if math := rand.Intn(4); math != 3 {
            message = resMessages[math];
        } else {
            message = reqMessage + "じゃねーよw"
        }
    }
    return
}

依存関係を宣言

$ cd $GOPATH/src/github.com/heroku/go-getting-started
$ go get -u github.com/tools/godep
$ godep save ./...
$ godep go install ./...

Herokuにデプロイ

$ git add .
$ git commit -m "Create Gayabot"
$ git push heroku master

完成!

トーク内にBOTを招待してメッセを送るとガヤってくれるようになりました。
他にも画像、スタンプ、カルーセル表示、クリック可能なボタンを配置したりが簡単に実装出来たので
色々可能性が広がりそうですね!
Goが初めてということで、実装等ご指摘頂けると幸いで御座います。
お疲れ様でした!

IMG_3943.PNG

参考

46
31
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
46
31