Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
55
Help us understand the problem. What is going on with this article?
@tetrapod117

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

More than 1 year has passed since last update.

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

なぜGASを使う?

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

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

必要なもの

LINEアカウント
Googleアカウント

アクセストークンの取得

LINE Developers
こちらで、「MessagingAPIをはじめる」を選択し、適当にBot用のアカウントを作成してください。
ボットのアカウントができたら、Channel基本設定の画面へ行き、最初はアクセストークンが発行されていないので、再発行ボタンを押し、発行して、メモっておいてください。そして、Webhook送信を利用するにして。
LINE@の機能は両方ともオフにします。
LINE_Developers.jpg

GASでの開発

GASの開発画面は、GoogleDriveからいけます。
マイドライブ_-_Google_ドライブ.jpg

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

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

Container Bound Scriptはスプレッドシートなどのメニューから「スクリプトエディタ」を起動して作成するスクリプトです。
gomisute_bot_-_Google_スプレッドシート.jpg

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

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

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

//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を取得します。
test.png

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

test-4.jpg

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

test.jpg

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

LINE_Developers.jpg

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

完成

LINE.jpg

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

少し解説

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

https://api.line.me/v2/bot/message/reply

のエンドポイントに返信しています。

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

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

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

最後に

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

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

55
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
tetrapod117
最近はWebRTCをやったり、インフラやったり。 ハッカソンが好きで、ちょくちょく出たりしてます。 最近、GCPのProfessional Cloud Architectの資格を取ったので、GCPネタを書いていきたい。

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
55
Help us understand the problem. What is going on with this article?