【LINE Botの作り方】Messaging API × GAS(Google Apps Script)でおうむ返しボットを作成する

目次
  1. LINE Bot(Messaging API)とは
  2. Messaging APIの使い方
  3. GAS(Googls Apps Script)とは
  4. GASの使い方
  5. LINEボットの実装手順
  6. 0.全体イメージの確認
  7. 1.Messaging APIのアクセストークンを発行
  8. 2.GASでリプライの挙動を実装
  9. 3.GASをウェブアプリケーションとして公開
  10. 4.Messaging APIのWebhookにGASを指定
  11. 作成したLINEボットを動かそう
  12. GASを編集する場合の公開方法に注意
  13. まとめ

LINE Messaging APIもGASも使うのは初めてでしたが、わりかしサクッと作れたので備忘録。
「そもそもLINE Botって何」とかいうレベルから説明していくのでボット製作とかに興味がある人は見てってください。

LINE Bot(Messaging API)とは

LINEが提供しているサービスの一つです。郵便局の「ぽすくま」やLINE公式の翻訳などをイメージするとわかりやすいです。
LINEで友達追加をすることで様々なサービスが利用可能となります。
以下の公式動画を見ると分かりやすいですね。飲食店の予約サービスや車の販売店の問い合わせサービスなど、コミュニケーションのインフラと化しているLINE上で情報の検索から予約などまでが一括で行えます。

そしてこの便利なLINEボットは誰でも無料で作成することが可能です。無料プランの場合は友達の追加数などに多少の制限はあるもののできることは企業が使用しているのと変わりません。
LINEボットを作成するにはLINEのDevelopersアカウントを登録する必要がありますが、通常のLINEのアカウントを持っていればそのアカウントでログイン可能です。

Messaging APiの使い方を簡単に記載しておきます。

Messaging APIの使い方

1.LINE Developersにログインする

以下のURLからログインしてください。(LINEのID/PWと同じ)
LINE Developers

2.Messaging APIを開く

「Messaging APIを始める」をクリックして新規追加画面を開いてください。

3.プロバイダー情報を入力

プロバイダーはLINEボットの提供者(製作者)の意味合いで表示されます。適当な名前をつけてください。
以前にプロバイダーを作成している場合は作成済みの中から選択することも可能です。

4.Channel情報を入力

ここでLINEボットの名前などを入力します。ここの項目は全て入力必須となっています。

ここまで入力できればLINEボットの登録は一旦は完成です。
Messaging APiに以下のように追加されていることを確認してください。

これをクリックすると、ボットの設定画面が確認できます。ここでLINEボット作成時に必要な「アクセストークン」や「Webhook URL」の設定が行えます。
また、友達追加用のQRコードも確認が可能なので、試しにLINEからQRコードを読み込んでみてください。

ちゃんと友達追加できますね。この状態だと追加してメッセージを送信してもテンプレートの返事しか返ってきません。ここの中身を作り込むことでオリジナルのLINEボットを作っていきましょう。
そしてこのLINEボットの中身の動作は次に紹介するGASで作成します。ここはGASでなくてもWebアプリケーションやAPIであればなんでも良いですが、GASが比較的作りやすく応用も効区ためGASで作成していきましょう。

GAS(Googls Apps Script)とは

Google Apps ScriptとはGoogleが提供する各サービス(GmailやSpreadSheetなど)をスクリプト上から操作が行えるものになります。
単純にサービス間を連携させるだけでも便利ですが、このGASはWebアプリケーションやAPIとして開発・公開することも可能になっています。
そのため、GASでWebアプリケーションとして公開して、それをLINEのMessaging APIから実行するといったことが可能となっています。
今回紹介するLINEボットもそのようにして作っています。LINEボットを登録して、実際にLINEボットにメッセージが来た際に処理を行うのがGASになるわけです。
GASはJavascriptをベースとしたスクリプト言語でのため、Web開発経験者であればすんなりと書けます。僕のようにweb開発の経験がそんなに無くても多少のキャッチアップで簡単なものなら作ることが可能です。
GASはGoogleのアカウント(GmailとかGoogle+とか)を持っていれば使用可能です。
簡単に使い始める手順だけ記載しておきます。

GASの使い方

1.Googleドライブを開く

Googleのトップページの右上にある四角から「ドライブ」を選択してください。

2.GASのアプリを追加する

初期の状態だとGASはアプリに追加されていないので手動で追加する必要があります。手順は画像の通り。
「新規」 > 「その他」 > 「アプリを追加」

アプリの追加画面が表示されるので、「Google Apps Script」を探して「接続」をクリックしてください。

緑の帯にチェックがついたら追加完了です。

3.GASのファイルを新規作成する

再び、Googleドライブ上で「新規」のボタンを押下すると「Google Apps Script」が追加されているのでクリックしてください。
新しいタブが開いてGASのエディタが表示されます。

以下のような画面が表示されていればOKです。

LINEボットの実装手順

ここまでの手順で準備が整ったのでさっそく実装をしていきましょう。実装は次の手順に行なっていきます。

0.全体イメージの確認

実装に行く前に全体のイメージも掴んでおきましょう。全体を把握しておくことで今自分がどの部分をやっているか、後どれだけやれば終わるのかが見えるので、簡単な図にはなりますが全体の関連性を把握しておいてください。
リプライを行うLINEボットは以下のように連携していきます。Messaging APIが実際にユーザーとの対話部分となっており、実処理はGASにお任せという形式です。でやろうと思えば、GAS経由して他のアプリケーションやサービスを叩くことももちろん可能です。
※別記事で記載予定ですが、以下noteで記載したようなLINEボットはGASからGoogle SpreadsheetとPythonを連携させています。
友達追加するだけで仮想通貨の新規上場銘柄を通知してくれるLINEボット作りました

1.Messaging APIのアクセストークンを発行

アクセストークンの発行Messaging APIの設定画面から取得します。「再発行」をクリックするとアクセストークンの発行が可能で、発行すると「-」の部分に文字列が表示されます。それをGASのソース中に貼り付けるのでコピーしておいてください。

2.GASでリプライの挙動を実装

まず、GASに以下のコードをコピペしてください。
これがリプライを行うボットの基本形です。
※フォロー、アンフォローの際の処理はリプライタイプのボットには基本必要ありませんが、参考までに記載しています。

var channel_access_token = "Messaging APIのアクセストークンを指定"
// ボットにメッセージ送信/フォロー/アンフォローした時の処理
function doPost(e) {
  var events = JSON.parse(e.postData.contents).events;
  events.forEach(function(event) {
    if(event.type == "message") {
      reply(event);
    } else if(event.type == "follow") {
      follow(event);
    } else if(event.type == "unfollow") {
      unFollow(event);
    }
 });
}
// 入力されたメッセージをおうむ返し
function reply(e) {
  var message = {
    "replyToken" : e.replyToken,
    "messages" : [
      {
        "type" : "text",
        "text" : ((e.message.type=="text") ? e.message.text : "Text以外は返せません・・・")
      }
    ]
  };
  var replyData = {
    "method" : "post",
    "headers" : {
      "Content-Type" : "application/json",
      "Authorization" : "Bearer " + channel_access_token
    },
    "payload" : JSON.stringify(message)
  };
  UrlFetchApp.fetch("https://api.line.me/v2/bot/message/reply", replyData);
}
/* フォローされた時の処理 */
function follow(e) {
}
/* アンフォローされた時の処理 */
function unFollow(e){
}

少し解説していきます。

GASのコード解説

var access_token = "Messaging APIのアクセストークンを指定"

まず最初に出てくるのが「access_token」です。ここには最初に取得したMessaging APIのアクセストークンを指定してください。ここを指定することでどのボットの処理かをLINEが判断することができます。
次に、メインの関数ですがLINEボットにメッセージを送った場合に最初に呼び出される処理が「doPost関数」です。
LINEボットをフォロー/アンフォローした際にもここのdoPost関数が呼び出されます。
ここでまずはイベントを分類して処理を行います。
「event.type」にLINEボットに対してのアクションが指定されているのでまずはそこから判定していきます。
ここでLINEボットに対してメッセージが送られた場合は「reply関数」、フォローされた時は「follow関数」、アンフォローされた場合は「undollow関数」を定義しています。

// ボットにメッセージ送信/フォロー/アンフォローした時の処理
function doPost(e) {
  var events = JSON.parse(e.postData.contents).events;
  events.forEach(function(event) {
    if(event.type == "message") {
      reply(event);
    } else if(event.type == "follow") {
      follow(event);
    } else if(event.type == "unfollow") {
      unFollow(event);
    }
 });
}

なので、リプライタイプのボットの場合は「reply関数」だけを作成すれば良いということになります。
続いてreply関数を見ていきます。ここでは簡単に送られたメッセージがテキストであればそのまま同じメッセージを返し、テキスト以外であればその旨を返す処理を記載しています。

// 入力されたメッセージをおうむ返し
function reply(e) {
  //返信先のデータ及び返信メッセージの指定
  var message = {
    "replyToken" : e.replyToken,
    "messages" : [
      {
        "type" : "text",
        "text" : ((e.message.type=="text") ? e.message.text : "Text以外は返せません・・・")
      }
    ]
  };
  //情報を詰めて、エンドポイントを蹴飛ばす
  var replyData = {
    "method" : "post",
    "headers" : {
      "Content-Type" : "application/json",
      "Authorization" : "Bearer " + channel_access_token
    },
    "payload" : JSON.stringify(message)
  };
  UrlFetchApp.fetch("https://api.line.me/v2/bot/message/reply", replyData);
}

ここでやっていることは大きく2つです。
まず、「message」にreplyTokenとmessagesを指定しています。
replyTokenはpostされたデータから取得していますが、これはLINEボットに対してメッセージを送信したユーザーの情報が入っています。これをreplyTokenに詰めることでメッセージを送ってきたユーザーに対して返答が可能になります。
messagesは実際に返すメッセージの内容を指定します。これもpostされたデータから取得して指定します。ここで送られたメッセージのタイプ判定も行い、テキストメッセージの場合はそのまま返し、テキスト以外であれば「Text以外は返せません・・・」というメッセージを返します。
そして作成したmessageをLINEボットのエンドポイントを指定して実行することで実際の返信を行います。返信に必要なreplyDataにmethodとheader、payloadを指定しています。
あとはこれを指定してLINEのAPIをキックして上げるとLINEボットを通じておうむ返しが行われます。
この指定しているURLはユーザーやボット毎に異なるとかではなく決まったURLになります。
「https://api.line.me/v2/bot/message/reply」\ リプライのメッセージを返す場合はこのURLに上記で作成したデータを渡すことでボットが動きます。
リプライ以外にLINEボット側から通知を行うプッシュメッセージもありますが。プッシュを行う場合は「https://api.line.me/v2/bot/message/multicast」のURLに情報を渡してあげます。必要なデータもリプライを行う時とは少し異なるデータが必要になります。

3.GASをウェブアプリケーションとして公開

コードは理解できましたか?理解できなくてもとりあえず動かすところまではやって見ましょう。まだコピペしただけですがゴールまでもう少しです。
上記のソースにアクセストークンを指定したらそれを保存してください。その後、ツールバー上の「公開」から「ウェブアプリケーションとして導入」を選択してください。

「プロジェクトバージョン」は「新規作成」、「アプリケーションにアクセスできるユーザー」は「全員(匿名ユーザー含む)」を選択して「導入」をクリックしてください。

すると、承認を求められるので「許可を確認」をクリックしてください。Googleのログイン画面が表示されるのでログインしてください。

するとウェブアプリケーションとしての導入が完了します。webhookのURLが表示されるのでこれをコピーしてMessaging APIの設定画面から設定を行います。

4.Messaging APIのWebhookにGASを指定

次にMessaging APIの設定画面に戻って次の手順で操作します。
「Webhook送信」を「利用する」に更新して、その下のWebhookURLに先ほどコピーしたURLを貼り付けてください。
※https://部分はすでに入力されているため、外してください。\
自動応答メッセージは利用しないに設定してください。

設定は以上で完了です。

作成したLINEボットを動かそう

最初に友達追加したボット(してなければQRコードを読み込んで追加してください。)にメッセージを送って見てください。
送ったメッセージがそのまま返ってくることを確認してください。

GASを編集する場合の公開方法に注意

ただのおうむ返しではつまらないので語尾に「・・・知らんけど」をつけて返すボットに編集して見ましょう。
先ほど書いたソースの以下の部分だけ修正してください。

// 入力されたメッセージをおうむ返し
function reply(e) {
  //返信先のデータ及び返信メッセージの指定
  var message = {
    "replyToken" : e.replyToken,
    "messages" : [
      {
        "type" : "text",
        "text" : ((e.message.type=="text") ? e.message.text + "・・・知らんけど" : "Text以外は返せません・・・")
      }
    ]
  };

編集が完了したら、GASを保存して最初と同じように「公開 > ウェブアプリケーションとして導入」を選択してください。
この時にプロジェクトバージョンを「新規作成」にして更新してください。URL自体は変わらないのでMessaging APIの設定変更は不要です。

再度LINEでメッセージを送って見てください。適当な返事を返すボットに進化しているはずです。

こんな感じですね!

まとめ

やってみるとかなり簡単にLINEのボットが作成可能なことがわかったかと思います。今回は単純におうむ返しをするようなボットの作成でしたがこれを応用することで様々なLINEボットのサービスを作成することが可能です。
「送った地名の天気情報を取得する」
「送った画像に含まれる文字を返信する」
などなど、今の時代は様々なAPiが公開されているのでそれらを利用することで簡単に高機能なボットの作成が可能です。
次回はユーザーのメッセージに反応するリプライタイプのボットではなく、ボット側から通知を行うプッシュタイプのボットの作成について書いていきます。
オリジナルのLINEボットを作成して楽しみましょう!!
分からないことがあれば、プログラミング専用のQ&Aサイトで質問すると即効で解決したりします。僕もちょくちょく利用してますが、今んとこ全部解決してます。もちろん利用は無料です。

Related関連記事