4
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

GASを使ってLINE BOTで遊んだ

Last updated at Posted at 2020-03-15

何をしたか

定期的にサッカーニュースを配信

IMG_3585DB2FC85B-1.jpeg

Talk APIを使って日常会話

IMG_2486.PNG

どのように実現したか

LINE Messaging APIを使用

Messaging APIを使って、ボットサーバーとLINEプラットフォームの間でデータを交換できます。リクエストは、JSON形式でHTTPSを使って送信されます。

1.ユーザーが、LINE公式アカウントにメッセージを送信します。
2.LINEプラットフォームからボットサーバーのWebhook URLに、Webhookイベントが送信されます。
3.Webhookイベントに応じて、ボットサーバーからユーザーにLINEプラットフォームを介して応答します。
messaging-api-architecture.f40bffbb.png

Webhook先としてGAS(Google Apps Script)を使用

GASはGoogleが提供しているjavascriptをベースとした言語

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

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

サッカーニュース配信

取得機能
取得元はゲキサカのrss

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
}

配信機能

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を使用

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・・・リクエストを送信できる
パーサ・・・構文解析を行う

4
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?