🦒

kintone|LINEWORKS連携その①

2021/05/08に公開

プログラムを作るのが苦手なプログラマー(破綻)が
mykintoneをチョビットずつ便利に改善していく過程を投稿していきます。
今回はmykintoneと少し違います。

2021年のGWの自習課題としてkintoneとLINEWORKSの連携に取り組んでみました。なおキューピットはAWSに受け持ってもらいました。

📝やりたいこと

LINEWORKSに投稿されたトークをkintoneのアプリのレコードとして登録する。
※LINEWORKSはチャットボットを利用します。受入れ側のkintoneはアプリのAPIトークンを利用します。

📝きっかけ

noteに投稿した記事がきっかけとなります。

📝構成

お粗末ですが、以下の通りです。

  • LINEWORKS:データを発信する人
  • kintone:データの受入れする人
  • AWS Lambda:LINEWORKSのデータをこねてkintoneに投げる人
  • AWS APIGateway:LINEWORKSからのデータをキャッチする人
  • AWS KMS:kintoneにデータを投げる際に必要な情報を復号するために必要な人

📝利用したライブラリ

以下お世話になりました。axiosは参考記事でrequestを利用されていたもののdeprecatedとなっていたためrequestの代替として利用しました。
axios
aws-sdk

📝参考記事

LINE WORKSのトークをkintoneに保存する方法

cybozu developer networkの記事をベース(純度100)にしています。
すごくすごーく助かりました。ありがとうございます。🦒
AWS等々も沢山参考にした記事があったのですが、ごめんなさいメモってませんでした。

📝前提

  • LINEWORKSのチャットボットの設定などは割愛しています。参考記事の参照ください。
  • AWSの設定等は、ほぼ割愛します。

📝ソースコード(AWS Lambda)

/*
 * LINEWORKS > kintone連携
 * Copyright 2021 nononosuque
 *
 * Licensed under the MIT License
 *
 * ↓以下をベースで利用させて頂きました。
 * cybozu developer network
 *  LINE WORKSのトークをkintoneに保存する方法
*/
const axios = require('axios');
const AWS = require('aws-sdk')

AWS.config.update({ region: 'ap-northeast-1' });

// kintone設定値はすべてAWS Lambda環境変数から取得
const ENCRYPTED_DOMAIN = process.env['KINTONE_DOMAIN'];       // kintoneドメイン
const ENCRYPTED_APP_ID = process.env['KINTONE_APP_ID'];       // kintoneアプリID
const ENCRYPTED_API_TOKEN = process.env['KINTONE_API_TOKEN']; // kintoneAPIトークン
const FUNCTION_NAME = process.env.AWS_LAMBDA_FUNCTION_NAME;   // AWS Lambda関数名(復号時に利用)

/**
 * AWS Lambda環境変数の値は全てKMSを利用して暗号化しているため、復号化するための関数
 * @param encrypted
 * @returns {Promise<string>}
 */
const decrypt = (encrypted) => {
  const kms = new AWS.KMS();
  return kms.decrypt({
    CiphertextBlob: Buffer.from(encrypted, 'base64'),
    EncryptionContext: { LambdaFunctionName: FUNCTION_NAME },
  }).promise().then((data) => {
    return data.Plaintext.toString('ascii');
  });
};

/**
 * メイン処理
 * @param event
 * @param context
 */
exports.handler = function(event, context) {

  // eventにLINE WORKSのcallbackデータが入ってる
  const EVENT_DATA = JSON.parse(event.body);
  //console.log(EVENT_DATA);

  // 確認用
  //console.log(`domain:${ENCRYPTED_DOMAIN}`);
  //console.log(`app_id:${ENCRYPTED_APP_ID}`);
  //console.log(`api_token:${ENCRYPTED_API_TOKEN}`);

  // 変数宣言
  let appId;
  let url;
  let headers;

  // 並行で復号処理
  Promise.all([
    decrypt(ENCRYPTED_DOMAIN),
    decrypt(ENCRYPTED_APP_ID),
    decrypt(ENCRYPTED_API_TOKEN)
  ]).then((data) => {
    //console.log('promise-all:' + data);

    url = `https://${data[0]}/k/v1/record.json`;  // ドメイン名の取得(API URLの作成)
    appId = data[1];                              // アプリIdの取得
    headers = {
      'Content-Type': 'application/json',
      'X-Cybozu-API-Token': data[2]
    };  // APIトークンの取得
  }).then(() => {

    // LINE WORKSの発言者とトーク内容をそれぞれ取得する
    const LINE_USER_ID = EVENT_DATA.source.accountId;
    const LINE_MESSAGE = EVENT_DATA.content.text;

    // kintoneのJSON形式に当てはめる
    const BODY_POST = {
      'app': appId,
      'record': {
        'トーク発信者': {
          'value': LINE_USER_ID
        },
        'トーク内容': {
          'value': LINE_MESSAGE
        }
      }
    };

    const OPTIONS_AXIOS = {
      url: url,
      method: 'post',
      headers: headers,
      data: BODY_POST,
    };

    // レコードをPOST
    axios.request(OPTIONS_AXIOS).then((res) => {
      console.log('◆kintone post success◆')
      console.log(res);
    }).catch((err) => {
      console.log(err);
    });

  }).catch((err) => {
    console.log(err);
  });
};

📝AWS Lambda

Lambdaの環境変数にkintoneにデータを渡すためのAPIトークンとアプリIDとURLを設定(KMSで暗号化したもの)しています。

📝動作感

①用意したLINEWORKSのチャットボットにトークを投稿

②受け入れ先として用意したkintoneのアプリのレコード一覧を確認

①でトークに投稿した内容が保存されていることを確認します。

📝結末

元々kintoneの利用促進も兼ねて、ちょうど良い機会だと思い、会社で利用してもらえないかなあと思ってGW中にやってみたのですが、提案してみたもののにべもない感じで断られてしまいました・・・。悲しいけど勝手にやったことですし致し方なしですね。
これもnoteの記事に書きました。

📝最後に・・・

アドバイスは常時募集しております。お待ちしております。
その②(今度はkintoneのwebhookを利用してkintone → LINEWORKS連携)に続きます。
<(_ )><( )><( )><( )><( _)>

Discussion