kintone|LINEWORKS連携その①
プログラムを作るのが苦手なプログラマー(破綻)が
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