Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Go と LINE BOT に まとめて入門する

yagi_eng
November 04, 2020

Go と LINE BOT に まとめて入門する

以下イベントの登壇資料です

https://linedevelopercommunity.connpass.com/event/192599/

yagi_eng

November 04, 2020
Tweet

More Decks by yagi_eng

Other Decks in Programming

Transcript

  1. GoとLINE BOTに まとめて入門する やぎぬ(@yagi_eng) 2020/11/04 1 The Go gopher was

    designed by Renée French. Licensed under the Creative Common 3.0 Attributions License.
  2. 6 • 2020/9 大阪・滋賀 • 2020/3 セブ • 2020/2 台湾

    • 2019/8,9 東南アジアバックパック • 2019/8 北海道 • 2018/11 東北周遊 • 2018/9 カンボジア・ベトナム • etc… Instagramにいっぱい 旅行の写真載せてます! https://www.instagram.com/yaginu_travels_around/ 旅行好きです
  3. 説明 11 今回やること • 位置情報を送信すると、その周辺の飲食店を返すBOTの作成 やらないこと • お気に入り機能 • 文字検索

    • LIFF 技術的な補足 • 飲食店検索にはホットペッパーAPIを使います • 先ほどのサンプルではGoogleMapsAPIを使っていますが、 ホットペッパーAPIの方がカジュアルに使えます
  4. Messaging API • LINE BOTっていうけど正確にはMessagingAPI • 以下公式より引用 • Messaging APIを使って、ユーザー個人に合わせた体験をLINE上で提供する

    ボットを作成できます。 • 作成したボットは、LINEプラットフォームのチャネルに紐づけます。 • Messaging APIを使って、ボットサーバーとLINEプラットフォームの間で データを交換できます。リクエストは、JSON形式でHTTPSを使って送信さ れます。 引用元 https://developers.line.biz/ja/docs/messaging-api/overview 20
  5. Goとは? 23 Googleが開発したプログラミング言語 • 2009年11月に最初のバージョンをオープンソースで公開 • 2012年3月に正式バージョンであるGo1.0を公開 • 2020年11月現在の最新バージョンはGo1.15 •

    半年毎のペースでバージョンアップ • Robert Griesemer、Rob Pike、Ken Thompsonによって設計された 特徴 • 強力でシンプルな言語設計と文法 • 並行プログラミング • 豊富な標準ライブラリ群 • 周辺ツールの充実 • シングルバイナリ・クロスコンパイル 上田さん資料 より抜粋
  6. Goが開発された理由 24 Google内の課題を解決するために開発された • 開発速度の低下 • 超巨大なコードベース • 複雑な依存関係 •

    マルチコア時代のシステム言語 • 並行処理とガベージコレクタを同時に採用 • 軽量プログラミング言語(LL, Light weight Language)の盛り上がり • 静的型付け言語だとコンパイル時にエラーが発見できる • 動的型付け言語だと書きやすい • いいところ取りの書きやすい静的型付け言語がない • 静的解析がしやすい言語 • 言語設計のレベルで静的解析しやすい言語を目指した 上田さん資料 より抜粋
  7. Goの特徴 − 周辺ツールの充実 − 25 • go toolとして標準/準標準で提供 • サードパーティ製のツールも充実

    • IDEによらない独立したツールとして提供 go build ビルドを行うコマンド go test xxxx_test.goに書かれたテストコード の実行 go doc, godoc ドキュメント生成 gofmt, goimports コードフォーマッター go vet コードチェッカー gopls Language Server Protocol (LSP) の実装 上田さん資料 より抜粋
  8. リポジトリはこちら https://github.com/yagi-eng/go-linebot-start ⇒ステップ毎にブランチを作成しています、インデント下がりがブランチ名 1. まずはHello, World! • hello-world 2. オウム返しのLINEBOT

    • parrot 3. 位置情報から緯度/経度を返すLINEBOT • latlng 4. 位置情報から周辺の飲食店を返すLINEBOT • resto 5. 位置情報から周辺の飲食店を見やすく返すLINEBOT • carousel 29
  9. 実装 33 main関数 • 最初に実行される関数 • 厳密には初期化後に実行される 関数宣言 • 18-21行目参照(返り値なし)

    • 返り値ありは後述 変数宣言 • 19行目参照 • 他にも色んな宣言の仕方がある • 型推論がある • 右辺から判断して自動で型付け
  10. 実装 34 ハンドラ登録 • 11行目参照 • 「このURLにアクセスしたら、この関数を 実行しますよ」の登録 • 11行目ではルートドメインにアクセスした

    らhelloHandlerが実行されるように登録 • localhost:8080/helloとしたければ、 http.HandleFunc(“/hello”, helloHandler) とする HTTPサーバの起動 • 15行目参照
  11. 実行 36 以下のコマンドを実行する $ go run (実行するGoファイルのパス) または $ go

    run (実行するGoファイルのディレクトリパス) e.g. $ ls main.go $ go run main.go または $ go run .
  12. LINE Developersに登録 41 以下の公式サイトを参考にアカウントやチャネルを作成する ・Messaging APIを始めよう ⇒LINE Developersコンソールでチャネルを作成する https://developers.line.biz/ja/docs/messaging-api/getting-started/ ・ボットを作成する

    ⇒LINE Developersコンソールでボットを設定する https://developers.line.biz/ja/docs/messaging-api/building-bot/ ※チャネル: 「BOTを管理するもの」くらいの認識でOKです
  13. 実装(lineHandler関数) 45 LINEBOT SDKのexampleをほぼそのままコピペです 少しごちゃっとするので、雰囲気をつかむだけでOKです (自分も最初は雰囲気だけでやってました) • LINEBOT SDK •

    https://github.com/line/line-bot-sdk-go • 参考にしたexampleファイル • https://github.com/line/line-bot-sdk- go/blob/master/examples/echo_bot/server.go
  14. 実装(lineHandler関数 前半) 46 LINEBOT初期化 • 28-31行目参照 • linebotパッケージを使うとLINEBOTで 色々できる •

    29, 30行目ではLINE Developersで取得した 認証情報※を記述 ※ 認証情報を載せたままGitHubでソースコード を公開しないように注意 通常は環境変数から取得したりします
  15. 実装(lineHandler関数 後半) 48 おおまかな処理の流れ • 37-45行目 • リクエストの内容チェック • 46-60行目

    • どのようなイベント※が起こったかを 確認して個別に処理する • 具体的な内容は次スライド ※イベント メッセージ受信、 ポストバック受信など
  16. 実行(ローカル環境を外部公開) 53 以下のコマンドを実行する # 8080番を公開したい時は以下の通り $ ngrok http 8080 ngrok

    by @inconshreveable Session Status online Session Expires 7 hours, 59 minutes Version 2.3.35 Region United States (us) Web Interface http://127.0.0.1:4040 Forwarding http://xxxxxx.ngrok.io -> http://localhost:8080 Forwarding https:// xxxxxx.ngrok.io -> http://localhost:8080 httpsのアドレスを Webhookに登録する
  17. 実装(構造体の定義) 71 構造体 • 84, 89, 94行目参照 • 型の異なるデータ型を集めたデータ型 •

    type (構造体の名前) struct{} で定義できる JSONパース • Goでは構造体とJSONの構造を紐づけて パースするのが一般的 • その際は、フィールドの先頭は大文字で 始める必要あり • フィールドの右に`json:”xxx”`と記述する 必要あり
  18. とりあえず手元で動かしたい方向け 90 • 以下のリポジトリをclone(またはfolk) • https://github.com/yagi-eng/go-linebot-start/tree/master • LINE DevelopersとホットペッパーAPIに登録して、 BOT作成&各種キーなどを発行

    • ngrok(外部へローカルホストを公開するツール)をインストール • cloneしたmain.goに発行した各種キーを埋め込む • 33, 34, 122行目 • 以下の順にコマンドを実行 • $ ngrok http 8080 #ngrok実行 • $ cd go-linebot-start/answer • $ go run main.go #Go実行 • ngrokが生成したURLをLINE DevelopersのBOTページでWebhookURLに登録 • 作成したボットに位置情報を送信してみる
  19. リポジトリはこちら https://github.com/yagi-eng/go-linebot-start ⇒以下のステップ毎にブランチを作成しています、インデント下がりがブランチ名 • まずはHello, World! • hello-world • オウム返しのLINEBOT

    • parrot • 位置情報から経度/緯度を返すLINEBOT • latlng • 位置情報から周辺の飲食店を返すLINEBOT • resto • 位置情報から周辺の飲食店を見やすく返すLINEBOT • carousel 92
  20. 実行(ローカル環境を外部公開) 100 以下のコマンドを実行する # 8080番を公開したい時は以下の通り $ ngrok http 8080 ngrok

    by @inconshreveable Session Status online Session Expires 7 hours, 59 minutes Version 2.3.35 Region United States (us) Web Interface http://127.0.0.1:4040 Forwarding http://xxxxxx.ngrok.io -> http://localhost:8080 Forwarding https:// xxxxxx.ngrok.io -> http://localhost:8080 このアドレスを Webhookに登録する ※httpsであることに注意