Google Apps Scriptでオウム返しLINE Botを作る。

Google App ScriptでLINEBotを作る機会があったので、メッセージに対して返信をするreplyメッセージについて書いていきます。

##なぜGASを使う？
普通にLINEのボットを動かそうと思えば、サーバーなどが必要になりますが、GASは関数を使って、ウェブサーバとしても利用することができるので、自分でサーバーを用意しなくてもLINEBotを開発できます。
あとは、スプレッドシートやカレンダーなど、Googleのサービスとの連携も簡単に行うことができます。

ということで、今回はBotの基本であるオウム返しBotをGASで作ってみます。

##必要なもの
LINEアカウント
Googleアカウント

##アクセストークンの取得
[LINE Developers](https://developers.line.me/ja/)
こちらで、「MessagingAPIをはじめる」を選択し、適当にBot用のアカウントを作成してください。
ボットのアカウントができたら、Channel基本設定の画面へ行き、最初はアクセストークンが発行されていないので、再発行ボタンを押し、発行して、メモっておいてください。そして、Webhook送信を利用するにして。
LINE＠の機能は両方ともオフにします。
![LINE_Developers.jpg](https://qiita-image-store.s3.amazonaws.com/0/150295/30a8a930-ddd8-448b-a1ad-3a7d5a71bd35.jpeg)

##GASでの開発
GASの開発画面は、GoogleDriveからいけます。
<img width="634" alt="マイドライブ_-_Google_ドライブ.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/150295/dd532c6a-74f8-2412-447d-73be5fd39d59.jpeg">

適当にプロジェクト名などを入れてください。

ちなみに、GASには
Container Bound Script
Standalone Script
の２種類があります。

Container Bound Scriptはスプレッドシートなどのメニューから「スクリプトエディタ」を起動して作成するスクリプトです。
<img width="611" alt="gomisute_bot_-_Google_スプレッドシート.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/150295/58940d68-f7d5-d0e0-2400-820b5d3e1d84.jpeg">


Standalone ScriptはDrive上に直接作るスクリプトになります。

今回はStandalone Scriptを使っているということになります。
Container Bound ScriptでLINEBotの作成もしてみたのですが、うまく動かなかったです。

ということで、GASのエディタが開けたら、以下のコードを記入してください。

```javascript
//LINE Developersで取得したアクセストークンを入れる
var CHANNEL_ACCESS_TOKEN = 'YOUR_CHANNEL_ACCESS_TOKEN'; 
var line_endpoint = 'https://api.line.me/v2/bot/message/reply';

//ポストで送られてくるので、送られてきたJSONをパース
function doPost(e) {
  var json = JSON.parse(e.postData.contents);

  //返信するためのトークン取得
  var reply_token= json.events[0].replyToken;
  if (typeof reply_token === 'undefined') {
    return;
  }

  //送られたメッセージ内容を取得
  var message = json.events[0].message.text;  

  // メッセージを返信    
  UrlFetchApp.fetch(line_endpoint, {
    'headers': {
      'Content-Type': 'application/json; charset=UTF-8',
      'Authorization': 'Bearer ' + CHANNEL_ACCESS_TOKEN,
    },
    'method': 'post',
    'payload': JSON.stringify({
      'replyToken': reply_token,
      'messages': [{
        'type': 'text',
        'text': message,
      }],
    }),
  });
  return ContentService.createTextOutput(JSON.stringify({'content': 'post ok'})).setMimeType(ContentService.MimeType.JSON);
}
```
CHANNEL_ACCESS_TOKENには自分のアクセストークンを入れてください。

## Webhook URLの設定

次に、LINEボットの設定画面にWebhookのURLを入れるためにGASアプリのURLを取得します。
<img width="279" alt="test.png" src="https://qiita-image-store.s3.amazonaws.com/0/150295/94808246-5b33-b0ea-1b35-c9519786fe9a.png">

GASの画面で[公開] -> [ウェブアプリケーションとして導入]を選択

<img width="403" alt="test-4.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/150295/9a47fc2a-67f6-393f-8363-6d733f5fc148.jpeg">

アプリケーションにアクセスできるユーザーを[全員（匿名ユーザーを含む）]にして

<img width="431" alt="test.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/150295/95a982ab-5ad4-2807-47e5-1c88cdd7f1d1.jpeg">

そうするとURLが取得できるので、これをコピペして

<img width="773" alt="LINE_Developers.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/150295/e64f082e-9a0a-1438-c4cf-ef66f0c71252.jpeg">

LINE Developersのボットの設定画面のWebhookURLにペースとします。

## 完成
<img width="423" alt="LINE.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/150295/eda00110-9741-ceea-7441-f567099e7c8e.jpeg">

うまくいくとこんな感じで、自分の送ったメッセージをそのまま返してくれます。

## 少し解説

doPost関数はWebアプリにPOSTリクエストが送られたときに、実行される関数で、LINEBotにメッセージが送られた場合、LINEのサーバーがWebhookURLに設定したURLにPOST形式でメッセージを送るので、それをGASが受け取って、JSONをパースし、返信するためのリプライトークンとメッセージの中身を取得し、それを返信用のJSONフォーマットに入れて

```
https://api.line.me/v2/bot/message/reply
```
のエンドポイントに返信しています。

返信に入れるメッセージの内容はこのJSON部分で設定していて、

```json
'messages': [{
        'type': 'text',
        'text': message,
      }],
```

変数messageに返信するメッセージが入っているため、この中身を変えたら、オウム返し以外のBotを作ることもできます。

## 最後に
このような感じで、GASを使えば、簡単にサーバーレスで、LINEBotを作ることができます。

次回はGASでBotからメッセージを送る、PUSHメッセージの作り方を解説しようと思います。