GASを使ってLINE BOTで遊んだ

#何をしたか
###定期的にサッカーニュースを配信
<img width="375" alt="IMG_3585DB2FC85B-1.jpeg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603181/175ee539-7460-377c-f34b-6c4efa500e48.jpeg">

###Talk APIを使って日常会話
<img width="375" alt="IMG_2486.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603181/ff2db99c-bf77-85d1-e9a2-0dd54f666616.png">

#どのように実現したか
###LINE Messaging APIを使用
>Messaging APIを使って、ボットサーバーとLINEプラットフォームの間でデータを交換できます。リクエストは、JSON形式でHTTPSを使って送信されます。

>1.ユーザーが、LINE公式アカウントにメッセージを送信します。
2.LINEプラットフォームからボットサーバーのWebhook URLに、Webhookイベントが送信されます。
3.Webhookイベントに応じて、ボットサーバーからユーザーにLINEプラットフォームを介して応答します。
![messaging-api-architecture.f40bffbb.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603181/5a6c2da1-6441-588c-b33d-3c85533277e0.png)

###Webhook先としてGAS(Google Apps Script)を使用
GASはGoogleが提供しているjavascriptをベースとした言語

GASはGoogleが用意する「スクリプトエディタ」上に記述することになるため、面倒な環境構築は不要
スクリプトエディタに書いたスクリプトはGoogleのサーバー上で動くため、自前のサーバーも不要

ただしconst, letなどは使えないらしい

##サッカーニュース配信
取得機能
[取得元はゲキサカのrss](https://web.gekisaka.jp/feed)

```javascript:soccer
// サッカーニュースの取得
function getSoccerNews() {
  var options =
      {
        "contentType" : "text/xml;charset=utf-8",
        "method" : "get",
      };
  var response = UrlFetchApp.fetch("https://web.gekisaka.jp/feed", options); 
  var xmlDoc = XmlService.parse(response.getContentText());
  var rootDoc = xmlDoc.getRootElement();
  var item = parser.getElementsByTagName(rootDoc, 'item')
  //最新記事のタイトルとリンク取得
  var title = parser.getElementsByTagName(item[0],'title');
  var link = parser.getElementsByTagName(item[0], 'link');
  var msgSoccerNews = [title[0].getValue(), link[0].getValue()];
  return msgSoccerNews
}
```

配信機能

```javascript:soccer
// 通知機能
function push_soccer_message() {
  var msgSoccerNews = getSoccerNews();
  
  var postData = {
    "to": USER_ID, //lineのユーザーID
    "messages": [
      {
        "type": "text",
        "text": msgSoccerNews[0] + msgSoccerNews[1]
      }
    ]}
  
  var headers = {
    "Content-Type": "application/json",
    'Authorization': 'Bearer ' + CHANNEL_ACCESS_TOKEN, //lineのアクセストークン
  };
  
  var options = {
    "method": "post",
    "headers": headers,
    "payload": JSON.stringify(postData)
  };
  
  var response = UrlFetchApp.fetch("https://api.line.me/v2/bot/message/push", options);
  
}
```

GASには定期実行の機能があるので、4時間ごとに`push_soccer_message`を実行

完成!

##会話BOT
APIはリクルートが提供する[Talk API](https://a3rt.recruit-tech.co.jp/product/talkAPI/)を使用

```javascript:talk
//ポストで送られてくるので、送られてきた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;  
  
  //talk apiに送信するデータ
  var postData = {
    "apikey": api_key, //取得したapikey
    "query": message
  }
  
  //api通信
  var response = UrlFetchApp.fetch("https://api.a3rt.recruit-tech.co.jp/talk/v1/smalltalk", {
	"method": "POST",
	"payload": postData,
  })
  
  //返信文言
  var reply = JSON.parse(response).results[0].reply;
  
  var options = {
    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: reply,
      }],
    }),
  }

  // メッセージを返信    
  UrlFetchApp.fetch('https://api.line.me/v2/bot/message/reply',options);
}
```

完成!

#学んだこと
APIっていう便利なやつ・・・自分で外部のAPIにつなぐのが初めてだったのでいい勉強になった。ほかのAPIも使ってみたい！
GASっていう便利なやつ・・・サーバーレスで実装できるので実装のハードルが下がる
Webhook・・・サービス側のpostリクエスト先を指定できるやつ
fetch api・・・リクエストを送信できる
パーサ・・・構文解析を行う