いまさらGASでLineBotを作る【オウム返し】

Google Apps Script LINE BOTを作ってみる Vol.1オウム返し
◆ Live配信スケジュール ◆
サイオステクノロジーでは、Microsoft MVPの武井による「わかりみの深いシリーズ」など、定期的なLive配信を行っています。
⇒ 詳細スケジュールはこちらから
⇒ 見逃してしまった方はYoutubeチャンネルをご覧ください
VSCode Dev Containersで楽々開発環境構築祭り〜Python/Reactなどなど〜
Visual Studio Codeの拡張機能であるDev Containersを使ってReactとかPythonとかSpring Bootとかの開発環境をラクチンで構築する方法を紹介するイベントです。
https://tech-lab.connpass.com/event/311864/

今回は、今更ですがMessaging APIを使用したLINE BOTをGAS(Google Apps Script )で作成していくシリーズを始めていこうと思います。第一弾としては、定番のオウム返しを実装しています。また、LINEを扱う上での制限事項とGASでの制限事項についても触れています。フロントエンドエンジニアがちょっかいを掛けに行くシリーズです。

さて、今回はそんな会話の中から「キュー処理」という概念を学んできたので、転用できそうな分野であるLINE BOT作成を行っていきたいと思います。ちなみにこの話は今回の内容には全く関係ありません。

初めに

どもども、実務に入って数か月で先輩社員が話している内容がわかんなすぎて脳が溶けかけたミーティングを乗り切った龍ちゃんです。やはり単語を知っているか知らないかで、ミーティングの練度が違いますね。知らない単語リストが溜まっていきます。これが、コードレビューいただいている神と一対一で話すと知らない単語しか出てこない会話が走ったりするので、「ブログのネタだ!!」って思って検索バーに打ち込んでいます。

はい!ここまで全く関係のない文章です。

では今回何するの?となります。書きたい記事を書くために準備段階として基礎的な実装について行っていきます。要約するとブログの記事稼ぎですね。今回わかることに関しては以下になります。

  • LINE BOT(Messaging API)の開発を進めるための準備【他社サイトリンク】
  • GASでオウム返しを行う【コード付き】
  • GASやLINEでの制限事項について

それでは初めて行きます。すでに実装したことがある人は次の記事から読んでもらうほうがいいかもしれないので、次の記事を置いておきます。

LINE BOTについて

まずいきなりこの記事にたどり着いた人のためにLINE BOTとは何かについてというセクションを設けたいと思います。あなたはLINEを使っていますか?日本だとほとんどの人が使っていて企業アカウントをフォローしているかと思います。あれです。いろんな活用法がされていますが、いい感じにまとめてあるサイトがあったので置いておきます。種類としてはいろいろありますが、僕が使ったことあるものを中心にざっくりと書き出してみます。

  • お店の問い合わせ(Q&A)を受け付ける窓口
  • 飲食店で注文を受け付けるため【モバイルオーダー】
  • お店の宣伝のため(定期的にキャンペーンが送られてきてミュートするあれです)

こうやって書きだしていくといろんな場面で活用されていますね。最近だとChatGPTと連携したLINE Botがバズっていましたね。ちなみにGhat-GPTに聞いたら実装まで教えてくれますよ。

今回は、その中でもユーザーがメッセージを送った際に行うアクションに注目して実装しています。

登録方法【LINE側の設定】

今回は初期設定については、他のサイトの力を借りていきます(主に公式)。軽くネットで調べてみましたが、写真付きで解説しているサイトの情報は古かったのですが、一から自分で作ると気力が持たなそうなのでさぼります。ざっくりと手順としては以下になります。

とりあえず絶対必要なところは、画像付きで解説を入れていきます。とりあえずコンソールにアクセスしましょう。以下の画面のように「Messaging API」のタブをクリックして下までスクロールしてください。

LINEの設定その1

一番下までスクロールしたら「チャンネルアクセストークン」が出てくるので、発行して値をコピーしておきましょう。あとは、応答メッセージのリンクをクリックして別タブを開いてください。開いたタブで以下のチェックボックスの様式に合わせて設定を完了して下さい。

GASの設定その2

以上で初期セットアップは終了です。公式に絵が少なかったので補足しておきました。文章を読めば書いてありますけど、文字読んで探すのって大変ですよね。

GASでのコーディング

それでは、GASでコーディングを行いオウム返しを行うLINE BOTの構築を行っていきたいと思います。

設定関連の保存

コード上にアクセスに使用するキーをべた書きするのはいろいろと怖いので、スクリプトプロパティに設定を行っていきたいと思います。GASのエディタを開いて左のツールバーから設定をクリックしてください。

GAS-LINEの連携その1

開いたら下までスクロールが出てくるので、先ほど発行した「チャンネルアクセストークン」を「LINE_TOKEN」という名前で保存しましょう。

GAS-LINE連携その2

これを設定しておくことで、GASのコード上で、以下の様に使用することができます。

PropertiesService.getScriptProperties().getProperty("LINE_TOKEN");

これで安心してコードを共有することができますね。

GAS コード

コードの内容としては、「LINE側から送信された情報から必要な情報を取り出し(返信用トークン・メッセージ内容)、返信を行う」といったシンプルなものになっています。

 // LINE developersのメッセージ送受信設定に記載のアクセストークン
const LINE_TOKEN = PropertiesService.getScriptProperties().getProperty("LINE_TOKEN"); // Messaging API設定の一番下で発行できるLINE Botのアクセストークン
const LINE_URL = 'https://api.line.me/v2/bot/message/reply';

//ユーザーがメッセージを送信した時に下記を実行する
function doPost(e) {

  const json = JSON.parse(e.postData.contents);

  //replyToken…イベントへの応答に使用するトークン(Messaging APIリファレンス)
  // https://developers.line.biz/ja/reference/messaging-api/#message-event
  const reply_token = json.events[0].replyToken;
  const messageId = json.events[0].message.id;
  const messageType = json.events[0].message.type;
  const messageText = json.events[0].message.text;

  // 検証で200を返すための取り組み
  if (typeof reply_token === 'underfined') {
    return;
  }
  const option = {
    'headers': {
      'Content-Type': 'application/json; charset=UTF-8',
      'Authorization': 'Bearer ' + LINE_TOKEN,
    },
    'method': 'post',
    'payload': JSON.stringify({
      'replyToken': reply_token,
      'messages': [{
        'type': 'text',
        'text': messageText,
      }],
    }),
  }

  UrlFetchApp.fetch(LINE_URL,option);

  return;
}

コピペで公開して、WebhookのURL設定を行ったら動くと思います。ちなみに、デプロイは「全員」に公開する必要があります。面倒で怖いですけどしょうがないですね。

LINE側のWebhook設定

ちなみに、テキスト以外のものを送ると処理が落ちて、既読だけつきます。BOTの使用用途によって、ユーザーアクションは変化しますが、既定のアクション以外で処理が落ちる仕様はあまりよろしくないですね。

この辺りはサラッと流して、GASとLINEの制限事項に触れていきたいと思います。

GASとLINEの処理の流れと制限事項

ここでは、実装にあたって問題になりそうなところに言及しておこうと思います。結論として、GASとLINEの構成で実務レベルに耐えれるものを作ることは、やめておいた方が良いということになりました。今のコードに足りていない部分を以下に書き出してみます。

  • LINE:署名を検証しなければならない
  • LINE-GAS:Webhookの処理は1秒以内に返答が返ってくるのが理想
  • LINE-GAS:リプライトークンは1分以内の使用が理想的
  • GAS:GASの利用制限の観点

確実に他にもあるのですが、思いつくところだけでこれぐらいです。それでは、制限事項に入る前にGASとLINE間の処理の流れについて簡単に説明していきたいと思います。

GASとLINE間の処理の流れ

GASとLINE間の図にしてみました。言語での解説を入れていきます。

LINE-GAS連携処理の流れ

まず、LINEのアプリケーションでユーザーがBOTにアクションを行うと、「Webhook」で登録したURLにPOST(アクションの内容とか詰まってる)が飛んできます。GAS側では飛んできた情報を基に二つの処理を実行しています。

  • 送られたWebhookに対してサーバーレスポンス200を返答する
  • 送られた情報(Reply_token)を基にメッセージを返答する

それぞれのアクションには期限が設定されています。そちらが「1秒」と「1分」です。BOTを作成するとよくある事項なのですが、「Webhook」の返答は即座に返答して、それ以降の処理は非同期処理的に処理することが求められます。ちなみに制限を超えた場合では、以下の問題が発生します。

  • Webhook:アクセスが失敗してエラーが発生する
  • replay_token:メッセージの送信が失敗する可能性がある

replay_tokenは昔は「30秒」で制限が来ていたのですがだいぶ伸びました。動作保証の秒数が「1分」でした。この辺に関しては以降にまとめていこうと思います。

LINEの制限事項

サラッと先ほど触れてしまいましたが、もう一度まとめておきます。ページとしてはこちらの公式ページに書いてあります。でも六月からプラン改定が走るみたいです。料金プランとして関係するのは、BOT側から送信するメッセージの上限が変動します。今回は扱わないので、あんまり関係ないですね。BOT作成に関係する部分の制限事項をまとめます。

LINEの制限事項
webhook,reply_token,署名の検証

この辺りの要件は、サーバーの要件にも跳ね返ります。署名の検証に関しては、GASで調べた限りだとやっている記事が存在しませんでした。独自に調べた限りだとでGASだとできないのでは?という結論になります。ちなみに公式の資料では、こちらに記載があります。

GASの制限事項

GASの制限事項には触れていなかったので、ここでしっかり関係のある部分の制限について触れていこうと思います。以下にまとめています。

GASの宣言
URL Fetch数,スクリプトの実行時間,カスタム関数の実行時間

どの制限事項に関しても、LINE BOTの作成にクリティカルに関係してきます。「URL Fetch数」では、LINE BOTの返信に関係してきます。20,000回という数字だと制限かからなさそうですが、これが紐づいているのがアカウントというところに注目してください。もしLINE BOTを動かすプログラムが複数あった場合、累計20,000回の「URL Fetch」を行うとその日はもうアクセスできなくなるので、LINE BOTの返答自体が止まります。

実行時間系の制限では、コーディング力で回避する必要があります。GASでLINE BOTの返信がうまくいかない場合は、一度スクリプトの実行時間が関係していないか調査する必要がありそうです。

他の制限をまとめたサイトを見つけたので情報共有しておきます。

終わりに

さて今回は、GASでLINE BOTを作成する方法について紹介しました。内容としては何番煎じかわかりませんが、自分でしっかりまとめたことはなかったので勉強になりましたね。

以降はGASのちょっとした機能を活用して、GASの制限とLINEの性質を組み合わせた機能を作成していこうと思います。GASの機能についてはこちらの記事で紹介しています。

それではまた~

 

 

 

 

アバター画像
About 龍:Ryu 106 Articles
2022年入社で主にフロントエンドの業務でTailwindと遊ぶ日々。お酒とうまいご飯が好きで、運動がちょっと嫌いなエンジニアです。しゃべれるエンジニアを目指しておしゃべりとブログ執筆に注力中(業務もね)//
ご覧いただきありがとうございます! この投稿はお役に立ちましたか?

役に立った 役に立たなかった

1人がこの投稿は役に立ったと言っています。


ご覧いただきありがとうございます。
ブログの最新情報はSNSでも発信しております。
ぜひTwitterのフォロー&Facebookページにいいねをお願い致します!



>> 雑誌等の執筆依頼を受付しております。
   ご希望の方はお気軽にお問い合わせください!

Be the first to comment

Leave a Reply

Your email address will not be published.


*


質問はこちら 閉じる