🤖

GAS+Lambda+LINE APIでBot作成

2024/11/03に公開

最近、担当することになったプロジェクトがBot関連だったので、以前から作ろうと思っていたLINE Botを作成してみました。

Botの機能は至ってシンプルで、40個の決まったメッセージ内容のリストを用意して、それをユーザーが設定した時間に毎日1個ずつ送信するというものです。実際には少し違いますが、1か月分の決まったタスクのリマインダーとして機能するBotみたいなイメージです。

お金も時間もほぼない状態だったので最小規模で超シンプルに実装しました。ただ、今後は他人に使ってもらう予定もあるので随時アップデートする方針です。

主要機能

  • ユーザーに対応した時間に自動メッセージ送信
  • 手動メッセージ送信機能
  • メッセージ送信時間の設定機能
  • 言語切り替え機能(英<=>日)

使用技術

GAS

メインの処理とスプレッドシートを用いたデータ管理。
DBが必要なほどデータを扱うわけでもなければ、複雑な処理を組むわけでもないので無料で済むGASを採用。

Lambda + EventBridge

時間イベントで関数を発火させるのにGASではカバーしきれなかったため、サポート的に使用。

Messaging API (LINE)

LINE Botなので。Webhookを利用してメッセージをイベントにGASが走るようにしています。

開発

今回の内容は連携メインなのでコードはあまり書いてないですが、「GASのトリガーで時間指定のイベントできなくて困ってる」とか、「最低コストでBot作りの練習してみたい」って人には参考になるかと思います。

公式LINEアカウントの準備

1 LINEビジネスにログイン

https://manager.line.biz/

2 LINEの公式アカウントを作成


内容はあまり気にしないでいいので、変な事せずに記入する。

3 Messagging APIを有効化

管理画面の右上にある「設定」を開く。サイドバーのMessaging APIを選択。

ステータスがDisabled(無効)になっているので、下の有効化ボタンをクリック。

プロバイダー選択。

下のLINE Developersリンクへアクセス。

画面下部にアクセストークンがあります。

公式アカウントの設定でWebhoob機能をONにして、LINE DevelopersでWebhhook URLを設定します。

検索すれば色々情報出てくるので端を折っていますが、概ねこんな感じです。(ここ最近で若干動線が変わっているはずなので新しめの記事を参考にすることをお勧めします)

GAS

1 スプレッドシート作成

サンプルシート
https://docs.google.com/spreadsheets/d/1rsIA5nrInU11_-JL3eE7S7d3SsUGA2RS-HoTj8Pjdfw/edit?usp=sharing

2 デプロイ

↓やり方はこちら参照ください
https://programming-zero.net/gas-webapp-deploy/

3 コード作成

↓コードはGithubからご覧ください。
https://github.com/TOGO-ASAI/journal_bot
ポイントとしては、Webhookのイベント発生時にはdoPost()、LambdaからのイベントにはdoGet()が発火します。それぞれの関数の中に処理を書いていく感じです。

Lambda + EventBridge

1 Lambda関数作成


↓詳細はこちら参照
https://benjamin.co.jp/blog/technologies/lambda-1-create/

2 ダイアグラムの左側にあるAdd triggerをクリック

3 EventBridgeをトリガーに設定


ダイアグラムの左側にあるAdd triggerをクリック

ソースはEventBridgeを選択

ルールを作成
cronの書き方は公式リファレンス参照↓
https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/reference-cron-and-rate-expressions.html

4 Lambda関数作成(GASリクエストのみ)

lambda_function.py
import json
import urllib3
from urllib3 import PoolManager
from urllib import request
import os

def lambda_handler(event, context):
    url = "(GASをデプロイした後に表示されるURL)"
    http = urllib3.PoolManager()
    response = http.request('GET', url)
    result = {
        'statusCode': response.status,
        'body': response.data.decode('utf-8')
    }
    return {
        'statusCode': 200,
        'body': json.dumps(result)
    }

GETメソッドで発火さえさせればとりあえずOK。

まとめ

こんな感じで
EventBridgeで定期イベントを起こしてLambda関数を発火

Lambda関数でGASにリクエスト送信

GASでイベント受信して処理開始

GASからMessaging APIでスプシに記録されてるメッセージ送信

という動作が実現できます。

編集後記

簡単な内容ですが、低コストで小規模な開発をするときには候補になる実装だと思ったので、記事にしてみました。

これを軸にカスタマイズして、色んなLINE Botを簡単に開発できると思ってくれる人がいたら嬉しいです。

Discussion