hawk, camphora, avocado and so on..

美術展、博物展、神社、旅行、読書、IT関連などの雑感を書いていきます。

アイデアを記録・想起する LINE Bot を作ってみました。

鷹楠です。
思いついたアイデアやメモを記録できて、さらに、過去のアイデアを思い出させてくれる LINE Bot を作ってみました。前回作った LINE Bot では、IBM の Bluemix でサーバーを用意しましたが、今回は、もっとお手軽な Google Apps Script を使ってみました。

コンセプト(こんなものが作りたい)

  • 思いついたアイデアやメモを、LINE を使って記録したい
  • 記録したアイデアは、LINE 以外からでもアクセス、活用したい
  • 過去に記録したアイデアを、あとから思い出したい

ちなみに、私は普段、LINE に自分一人だけのグループを作っていて、メモ帳代わりに使ってます。今回は、それをもっと活用できるように拡張したかった…という感じです。

こんなものができた


Bot の名前は「アイデアの泉」(…幹並みですが)。




友だち追加時のメッセージはこんな感じ。


イデアを入力すると、自動的に Google スプレッドシートに記録します。


「アイデア」と入力すると、これまでに入力したアイデアを、日時とともにランダムに 2 つ表示します。この機能によって、なにか新しいアイデアの組み合わせが見つかればいいなあ。


スプレッドシート」と入力すると、アイデアが記録されている Google スプレッドシートの URL を教えてくれます。ブラウザやスプレッドシートからアクセスできるので、アイデアやメモを活用しやすくなります。


スマホGoogle スプレッドシートのアプリで開いた様子。
入力したアイデアやメモが、投稿日時とともに記録されてます。


スプレッドシートはユーザーごとに 1 つ、自動で作成されます。とりあえず、権限は閲覧のみとしました。権限は、どうするのがベストか、悩ましい。…というのも、LINE のユーザーと Google のユーザーが紐付けられないので、Everyone が閲覧可能 or 編集可能 のどちらかを選ぶしかないのです。

おおまかな作り方

  • LINE Bot のアカウントを作成する。
  • Google Drive に、Google Apps Script のプラグインを入れて、Google Apps Script のファイルを新規作成する。
  • Google Apps Script のコードをブラウザ上で書いて、web アプリケーションとして公開する(メニューから選ぶだけ)。このとき URL が決まるので、コピって、LINE Bot の Webhook URL に設定する。

Google Apps Script では、とても簡単に web アプリケーションを公開できます。この手軽さは、本当に素晴らしいです。しかも無料。何かアプリを作るときにいちいちサーバーを立てるのが、ばかばかしく思えてきます。使えるのは JavaScript をベースにした Google 独自の言語であり、なんでもやれるというわけではないですが、それでも、かなりのことが実現できます。

ソースコードの説明

ソースコードは、下記の GitHub リポジトリに格納してます。
GitHub - avcdsld/IdeaLogger: This is a LINE Bot to record your ideas input in Google SpreadSheet. By using this bot, you can also recall past ideas randomly.


Google Apps Script の拡張子は .gs となります。
web アプリを作成するには、.gs ファイルに下記の関数を定義します。LINE Bot に対してメッセージが送信されると、この関数が実行されます。

function doPost(e) {
  // Post送信されてきたときの処理
}


どんな HTTP リクエストが来るかは、LINE の REST API のリファレンス で確認します。
e.postData.contents を JSON としてパースして、必要なパラメータを取得します。Bot からメッセージを返信するために必要となるトークンや、ユーザーから送信されたメッセージなど。

今回の場合、LINE Bot へのメッセージに返信する処理は、下記のようになります(下記のコードだと未実装部分があるので注意。完成版は GitHub のコード を参照)。

var CHANNEL_ACCESS_TOKEN = 'dummy';  // LINE Bot のアクセストークンを入力してください
var line_endpoint = 'https://api.line.me/v2/bot/message/reply';

function doPost(e) {
  // JSONをパース
  var json = JSON.parse(e.postData.contents);

  // 送信されてきたメッセージを取得
  var user_message = json.events[0].message.text;  
  
  // 返信するためのトークンを取得
  var reply_token= json.events[0].replyToken;
  if (typeof reply_token === 'undefined') {
    return;
  }

  // 返信するメッセージを配列で用意する
  var reply_messages;
  if ('ヘルプ' == user_message) {
    // 「ヘルプ」と入力されたときの返信メッセージ
    reply_messages = ["スプレッドシートにアクセスしたい場合は「スプレッドシート」と入力してください。\n\nアイデアを思い出したくなったら「アイデア」と入力してください。あなたの過去のアイデアをランダムにお伝えします。\n\n使い方がわからなくなったら「ヘルプ」と入力してみてください。"];

  } else if ('スプレッドシート' == user_message) {
    //「スプレッドシート」と入力されたときの処理
    // Google スプレッドシートの URL を返信メッセージとする
    // reply_messages = ...

  } else if ('アイデア' == user_message) {
    //「アイデア」と入力されたときの処理
    // 過去のアイデアからランダムに取得して、返信メッセージとする
    // reply_messages = ...

  } else {
    // アイデアやメモが入力されたときの処理
    reply_messages = ['アイデアが追加されました'];
  }

  // メッセージを返信
  var messages = reply_messages.map(function (v) {
    return {'type': 'text', 'text': v};    
  });    
  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': messages,
    }),
  });
  return ContentService.createTextOutput(JSON.stringify({'content': 'post ok'})).setMimeType(ContentService.MimeType.JSON);
}


Google スプレッドシートを操作する処理について説明します。
SpreadsheetApp.create(<任意のタイトル>) で、スプレッドシートを新規に作成できます。
書き込むためには、シートを指定する必要があります。下記のコードの変数名だと、spreadSheet.getSheets()[0] で最初のシートを取得でき、spreadSheet.appendRow(<追加する行の配列>) で行を追加できます。楽でいいです。権限は、DriveApp でファイルを取得して setSharing() で設定できます。

  // スプレッドシートの作成と、ヘッダ行の追加
  var spreadSheet = SpreadsheetApp.create("スプレードシートのタイトル");
  var sheet = spreadSheet.getSheets()[0];
  sheet.appendRow(['日時', 'メッセージ']);

  // 権限の設定(全員が閲覧可能)
  var file = DriveApp.getFileById(spreadSheet.getId());
  file.setSharing(DriveApp.Access.ANYONE_WITH_LINK, DriveApp.Permission.VIEW);
  

なお今回、ひとりのユーザーにただ 1 つのスプレッドシートを作成するために、LINE のユーザー ID(API 用の ID)とスプレッドシート ID の組み合わせを保管することにしました。保管には ScriptProperties を使っています(PropertiesService.getScriptProperties() で取得可能)。

スプレッドシートからランダムにセル値を取得する方法については割愛します。

雑ですが (笑)、ソースコードの説明はこんな感じで。

LINE Bot のしくみで、何か別のものも作ってみたいです。

では。