LINE Messaging API と Google Apps Script で LINE BOT を作ってみる

LINE Messaging APIGoogle Apps Script で LINE BOT を作ってみるメモ。今回は、LINEのグループに送信したメッセージをメールで転送するBOT

アカウント作成 / BOT設定

※事前にLINEアカウントを作成すること

「LINE Business Center > サービス」の Messaging API で、「Developer Trial を始める」から LINE Business Center アカウントを登録する。

アカウントを登録すると LINE@ MANAGER ページが表示されるので、「APIを利用する」をクリックする。

「アカウント設定 > Bot設定」で以下を設定する。

  • リクエスト設定 > Webhook送信 > 「利用する」にチェック
  • 詳細設定 > Botグループトーク参加 > 「利用する」にチェック

BOTを友達に追加したときや自動応答のメッセージが不要の場合は「自動応答メッセージ」「友だち追加時あいさつ」のデフォルトメッセージを削除する。

最後に自分のLINEアカウントでBOTを友達に追加する。

LINE Developers

「アカウント設定 > Bot設定」のステータス欄にある「LINE Developersで設定する」リンクから LINE Developers ページを表示して Channel Access Token を発行する。これは、Google Apps Script から Messaging API にアクセスする際に使う。

Google Apps Script

今回、サーバを立てる代わりに Google Apps Script を使う。Google アカウントがあれば使えるので便利。

LINE BOT のプロジェクトと、処理を記述するスクリプトファイルを作成する。作成したプロジェクトは Google Drive に保存される。

LINE BOT からは POST でメッセージが渡ってくるので、doPost 関数を定義する。今回は受け取ったメッセージと送信したユーザの名前をメールで転送する。

var CHANNEL_ACCESS_TOKEN = '<CHANNEL_ACCESS_TOKEN>';

function getUsername(userId) {
  var url = 'https://api.line.me/v2/bot/profile/' + userId;
  var response = UrlFetchApp.fetch(url, {
    'headers': {
      'Authorization': 'Bearer ' + CHANNEL_ACCESS_TOKEN
    }
  });
  return JSON.parse(response.getContentText()).displayName;
}

function doPost(e) {
  var messageText = JSON.parse(e.postData.contents).events[0].message.text;
  var userId = JSON.parse(e.postData.contents).events[0].source.userId;
  var username = getUsername(userId);
  
  MailApp.sendEmail('sample@mail.com', 'Forwarded LINE Messages', 'From: ' + username + String.fromCharCode(10) + messageText);
  return JSON.stringify({});
}

ドキュメントトップ を参考。

作成したスクリプトは「Publish > Deploy as web app...」で Web アプリとして公開する。Who has access to the app は Anyone, even anonymous を選択する。デプロイすると URL が表示されるので、コピーして LINE Developers の Webhook URL に設定する。

まとめ

思いの外、簡単に LINE BOT が作れる。あと、複数人トークグループトークは違うので要注意。

追記 (2017/07/10)

メッセージをリプライするだけのBOTを作る場合は以下。

var CHANNEL_ACCESS_TOKEN = '<CHANNEL_ACCESS_TOKEN >';

function doPost(e) {
  var replyToken = JSON.parse(e.postData.contents).events[0].replyToken;
  var messageText = JSON.parse(e.postData.contents).events[0].message.text;
  UrlFetchApp.fetch('https://api.line.me/v2/bot/message/reply', {
    'headers': {
      'Content-Type': 'application/json',
      'Authorization': 'Bearer ' + CHANNEL_ACCESS_TOKEN,
    },
    'method': 'POST',
    'payload': JSON.stringify({
      'replyToken': replyToken,
      'messages': [{
        'type': 'text',
        'text': messageText + '!!!!',
      }],
    })
  });
  return JSON.stringify({});
}