【GAS/LINE WORKS】一問一答のBotを作る(MessageAPI)

GAS(Google Application Script)に戻る

目次

概要

ソースコード

const getAccessToken = () => {
  const time = Date.now();
  const header = Utilities.base64Encode(JSON.stringify({ 'alg': 'RS256', 'typ': 'JWT' }));
  const claimSet = Utilities.base64Encode(JSON.stringify({
    'iss': "YFBnvE470S8NLSaPt5JM",
    'sub': "z1in3.serviceaccount@works-396230",
    'iat': Math.floor(time / 1000),
    'exp': Math.floor(time / 1000 + 3600)
  }));

  const privateKey = "-----BEGIN PRIVATE KEY-----\nMIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCHsuKFHT1x9qjPDtz//v4A5Zmcb2+d1rDwOt9+lf/diL8T6cQyWiMqF1JTXz1NhgCVoCqOpIpPlv/nEHkM0At8CMAmeY1i4HEQhMeONCsPhnQIbwygU9UEzaACP1N7yFwexbyMBSTbw8se3OQ48opF4gGAJNbVQFcj0AjxfYpyskUBHw2Tvjzf+xICmiqhL3SauMjdIkhHH5qzr0DHOc7/NVjOfHgSuF6Kp6K0HfbNIDpmCyz+xfJ5ggGOFW/TFXuFO+S/Cd9Cjff2OSIEB1PftBHuiSPQLwQx9n8lj5Okn3gytWraLsxF7tk14TfOTvtgJizbWV9YOebqx8DL9FW3AgMBAAECggEAK/TBNZdkKP9abUAGTJJf2xCEsszSHhHGXPrlHI8gQ7WhF6U4nYrfKypEy6blJ7CJje5E+tHHz8I9AK8wVvspTTNUcuIa73V+inhIYAL8E9pcycKXF3QwY47sDu5Ob6FWXc11pvGfn+SLbmLlNqEyMzLjg4vrX0apM3uW+grNhxtJRLxv7FrsQ+WgtzgNbOkWxGrLa1cwbFDZ3TM4pijVibKCxg9QUgZRrqhTNanNmjTm0EVakO/ZV0zjLmYSlgevzWMcfDOZA5KBopGd/LBPENIXhj14X4zaO7upG+HS0QoeFlyQuiO1rKpiLoJyOihv/Q0sXKikH8n/FQMTDi52oQKBgQC9end8OirBdIzjg9GQCeXZmzIoJjp9AJGhnWTqpQv0KPQycvMkX7VslLo4qocK4zU7/CAUhZTKh39/gMlvD3Gp41m4rK1H2OMXP3/mixbJBWSajXBKyTqzjZqldv8eFdit2bgqVIcYIrNmdAvkzQc561Tdg2/+/fYKjDyC9fT5ZwKBgQC3Vu2+OU7iF4mSfXjTcxF2dyTnYOGlldCe6+bskIyR1mkhuFRGYc+KkTkJo12NxOo4xvBzpddl0XKjfO+SNM9j1aEtAjCJlD3QXGMBAb7A++SMGssVhtx3B97ov8Lejo9tFvuM963z1B/oTBsjBvCjzzjIdCdZnlYn5QL8gmX/MQKBgFknp9MvN3EBm01ueAvTbHCgws/7dOfefafS/GogMOi44HZgeiGyWxZ1QM5rBtHLqP/JmXquhB1r9kUTXzS/ypbKoCvyLDKzTd9hhJgA+D6sJ/NE/AJkfxd/WLXksRQB6Yub9zkLvulPYqShk/sbsfvBzJPSRb9w1fWOmOZyPsufAoGBAJ1crIS4dZ+Tqk4lCd8cBeITk4ZRXnwcocq2Gif0TeMjEGuT5ine7B84VKeUI8l6Obtv7ZSlxMKsymPO6WYpk9RR2ZxjI7wClCfSFFwZ3luQGPO0T5lzfqlgBRDq/ty9qhdtQY4WTKVa7eQZ5rTi0QsY4tkS8W93euWVKEIJvngRAoGAFSBrftwycOqbflxcDqgcQQA2zk4tp0zmFqxZ02/xSKfVct4F2v0mZ916p5JSLjAY2y8qQi71YIZ34YbqT7P7Wmmw4M9QVJOb9O0zJJtSa6MSogmc27BEhIkgzBN6kDcNw3pNxWO7/6c5SyKvHMmFsETostXe12HTLjLQUAiOXUA=\n-----END PRIVATE KEY-----";
  
  const signature = Utilities.base64Encode(
    Utilities.computeRsaSha256Signature(
      `${header}.${claimSet}`,
      privateKey
      )
    );
  const jwt = `${header}.${claimSet}.${signature}`;

  const endpoint = 'https://auth.worksmobile.com/oauth2/v2.0/token';
  const options = {
    method: 'post',
    headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
    payload: {
      'assertion': jwt,
      'grant_type': 'urn:ietf:params:oauth:grant-type:jwt-bearer',
      'client_id': "YFBnvE470S8NLSaPt5JM",
      'client_secret': "PEVqZxdyNP",
      'scope': 'bot,bot.read'
    }
  }
  try {
    const res = JSON.parse(UrlFetchApp.fetch(endpoint, options));
    Logger.log(res)
    return res;
  } catch(e) {
    // 例外エラー処理
    Logger.log('Error(token):')
    Logger.log(e)
    return "";
  }
}

function getNextQuestionText() {
  var ss = SpreadsheetApp.getActive()
  var sheet = ss.getActiveSheet();

  // ヘッダ行を取得
  const lastRow = sheet.getLastRow()
  sheet.getRange(10, 1).setValue(lastRow);
  const lastColumn = sheet.getRange(lastRow, sheet.getMaxColumns()).getNextDataCell(SpreadsheetApp.Direction.PREVIOUS).getColumn();
  sheet.getRange(10, 2).setValue(lastColumn);

  var headers = sheet.getRange(1,1,1,sheet.getLastColumn()).getValues()[0];
  switch (headers[lastColumn]) {
    case "Question1":
    return "所属店舗はどちらですか?";
    case "Question2":
    return "あなたの名前を教えてください。";
    case "Question3":
    return "どのようなことでお困りでしょうか?";
  }
}

function sendMessage(message) {
  
  const accessToken = getAccessToken().access_token;
  const url = 'https://www.worksapis.com/v1.0/bots/6806129/channels/412765a4-079b-9756-fc71-dfde9c49972e/messages'

  if (typeof message == 'string') {
  const options = {
    method: 'post',
    headers: {
      'Authorization': `Bearer ${accessToken}`,
      'Content-Type': 'application/json'
    },
    payload: JSON.stringify({
      'content': {
        'type': 'text',
        'text': message
      }
    })
  }

  try {
    const response = UrlFetchApp.fetch(url, options);
    Logger.log(response)
  } catch(e) {
    // 例外エラー処理
    Logger.log('Error(messages):')
    Logger.log(e)
  }
  }
}

// POSTリクエストに対する処理
function doPost(e) {
  sendMessage();

  // JSONをパース
  if (e == null || e.postData == null || e.postData.contents == null) {
    console.log("error");
    return;
  }
  
  var requestJSON = e.postData.contents;
  var requestObj = JSON.parse(requestJSON);

  //  
  // 結果をスプレッドシートに追記
  //

  var ss = SpreadsheetApp.getActive()
  var sheet = ss.getActiveSheet();

  // ヘッダ行を取得
  var headers = sheet.getRange(1,1,1,sheet.getLastColumn()).getValues()[0];
  const questionMessage = getNextQuestionText();
  sendMessage(questionMessage);

  // ヘッダに対応するデータを取得
  var values = [];
  for (i in headers){
    var header = headers[i];
    var val = "";
    switch(header) {
      // ID を返す
      case "userId":
        val = requestObj.source[header];
        break;
      case "date":
        val = new Date();
        break;
      
      // メッセージ形式を返す
      case "messageType":
        val = requestObj.type;
        break;
      case "Question1":
      case "Question2":
      case "Question3":
        val = requestObj.content.text;
        break;
      // その他の場合、content の中の指定の値を返す
      default:
        val = requestObj.content[header];
        break;
    }
    values.push(val);
  }

  // 行を追加
  sheet.appendRow(values);
}

デモ動画

詳細

参考ページ

  • 「」
  • 「」
GAS(Google Application Script)に戻る