kintoneからLINEWORKSへメッセージ通知（LINEWORKS API2.0）

kintoneでのイベント発生時に、LINEWORKSのメッセージを送りたい。
今回は詳細画面にボタンを表示し、ボタンを押すことでメッセージ送信します。
コピペできるコードが記載されているサイトを見つけられなかった為、投稿いたします。

## 注意事項<font color="red" size="18">（必読）</font>

今回の内容をそのまま利用するとJavascriptのソースで秘密鍵等が閲覧が可能なため、
<font color="red" size="18">__セキュリティ大きな問題が発生します。__</font>
今回は実行テスト用です。運用時にはプラグイン化等で非可視化の対応をお願いします。
また、実行テストする際はJavascriptのアップ前にアクセス制限をかけておいてください。
kintoneのセキュアコーディング ガイドラインについては [こちら](https://developer.cybozu.io/hc/ja/articles/201919400) をご確認ください。


## 必要なもの
- LINEWORKS
- kintoneスタンダードコース
- jsrsasign-all-min.js

## 使用するサイト
- [LINEWORKS Developers](https://developers.worksmobile.com/jp/?lang=ja)
- kintone
- [jsrsasign -GitHub](https://github.com/kjur/jsrsasign)

## 概要
![スライド1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2919252/8634c011-5326-900f-0836-3b802dfadf86.png)

## 実装
#### 1.LINEWORKS DevelopersでAPI2.0の設定を行う。
![スライド2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2919252/7bc90202-5824-e11b-0b8e-b78358df0a1e.png)

#### 2.LINEWORKS DevelopersでBotの設定を行う。
![スライド3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2919252/3ec906e8-cc8f-ceb8-7d42-a4dee9ea8e56.png)

#### 3.kintoneのカスタマイズjavascriptの作成
記載されているPrivate Keyはサンプルです。API2.0でダウンロードしたPrivate Keyと差し替えてください。
以下の内容はAPI2.0、Bot、メンバー情報から取得して置き換えてください。
{Client ID}
{Service Account}
{Client Secret}
{Bot ID}
{ID}

```javascript:LINEWORKS_SEND.js
(() => {
    'use strict';
    kintone.events.on('app.record.detail.show', (event) => {

        //初期値
        const Client_ID = "{Client ID}";
        const Service_Account = "{Service Account}";
        const Client_Secret = "{Client Secret}";
        const Bot_ID = "{Bot ID}";
        const Send_ID = encodeURI("{ID}");
        const Bot_URL = "https://www.worksapis.com/v1.0/bots/" + Bot_ID +
                        "/users/" + Send_ID + "/messages"

        const JWT_Private_Key =
        	"-----BEGIN PRIVATE KEY-----" +
        	"MIIEvgIBADANBgkqhkiG9sJJDpUZ+9un6swgXllUXhgCcO6CTz9sJJDpUZ+9un6s" +
        	"9un6swgXllUXhgCcO6CJDpUZ+9un6swgXllDpUZ+9un6swgXllDpUZ+9un6swgXl" +
        	"KWuAiqY0lV9xlWh5VWjI72CYhSGxWcRw3IzexKWuAiqY0lV9xlWh5VWjI72CYhSG" +
        	"KtPHXtrvJ7YvygSBZ3lMm5OF0c/CkGv2R5w+iqB/byd4ieLfUB+GMEDnULxNmr2h" +
        	"J7YvygSBZ3lERwxpBLJ7YaAotIk4AwLVg1QFTrdS9wLy6Rmi3WANSgN61bSyq9yq" +
        	"Vg1QFTrdS9wLy6RmiWK8JP2eOAWOzcyXRWK8JP2eOAWOzcyXRWANSgN61bSyq9ES" +
        	"ivY2U0U3AgMBAAECggEAKWuAiqY0lV9xlWh5VWjI72CYhSGxWcRw3Izexak18UZ5" +
        	"4gKCF3zN+muRRwxpBLJ7YaAotIk4AwLVg1QFTrdS9wLy6Rmi3WANSJec1bSyJecS" +
        	"Y9LKnsx8ANSgN61bSyq9ESANSgN61bSlnwo7Uc7N+Kib9XzhUVANSgN61bSyq9ES" +
        	"IiDlKMyNpIblNS4Go2a8Wic3HlDcAuRi/D88y7p3xUr2m5PBbyJeceUqaB4hCVMS" +
        	"4nrUHs4U7ScHSX72F6jBV0V9iGvxP9ulnwo7Uc7N+Kib9XzhUVSAmF3R3brd/I0w" +
        	"dHSH+Ez6/b+ts/NKnTKuRT09jtqOqWANSgHXtrv3YP3oN63YitDXEntAmF3R3brU" +
        	"lIAmhQMp/b+t8e+Bwu48PLDqAOKtPHX4KogEmfb8lfX90LaDCn8HpLTr6Ki3H65Z" +
        	"4xeAtFa2irjDkHwgG4pqxFv4i+zDqAOKtPHXtrv3YP3oviZNk5e4tySx9IKvD5VI" +
        	"Eh7eGhE+HbTY1XRsTWH4BjFlqQKBgQCwKhFiPrz9iGYxitHFu6g6Af22X1O2dGrZ" +
        	"aUk8ncmAQk7E1XRsTWH4BjuYCGpAUtY6swg1XRsTWC7kF9bRzcyXR4hu9r31pjw1" +
        	"xI9TvRxSTpQEbgJJDWK8JP1XRsTWH4Bj2eOAWO7MJ6swg1XRsTWZYwjT05KukJaa" +
        	"PL7sb0Jf3wKBgQDaA2opv3b77RVLFUcGXAsFb5XP1PSSzK284+26swg1XRsTWuDa" +
        	"T2StrfrXafo0b9naHKgty8LPp2Vlk6N1XRsTWH4Bj1fg8J+Um9kmlTdjHlv+DUX1" +
        	"NKT9VfrXafotZXtZXg1XRsTWVrsg1XRsTWVrs1U0tkPDuC+6usEmpitdVrs8CTuC" +
        	"NYQzUfQB9TJYog6swg1XRsTWVrs8X/O1y1QnyFrbJF2cM1bcpg1XRsTWH4BjaDdl" +
        	"8iMNsX3LaTCtZXGkSQg+6KGF/eQ0eGwCIwsrGSd7ITQOIC1XRsTWH4BjjhPu4oDd" +
        	"xbP37g6NMS3QxcmHRKlwlwUbXFw61XRsTWH4Bj92hwKBgFmvRtalbwEBk0yld9+v" +
        	"ahCNeSYeAm2I9k0efwiIYpuHbMcu6w1XRsWHBjXlUhCc6CzsJpUZ94WAtkXfwXI7" +
        	"Zj3+jFvuqEsr4xjW/M9Ne7x3e0efwiIYRsTWH4BjpuHbe0efwiIYpuefwiIYpuHb" +
        	"LORtmnBAlm/P1FGW/M9Ne7x3" +
        	"-----END PRIVATE KEY-----"

        // kintoneの画面上部の要素を取得し、送信ボタン要素を作成
        const Send_Button = kintone.app.record.getHeaderMenuSpaceElement();
        const Start_Button = document.createElement('button');
        Start_Button.innerText = 'LINEWORKS送信';

        // JWTのヘッダ
        var JWT_Header_JSON = {alg: 'RS256', typ: 'JWT'};

        // JWTのペイロード
        // UNIX時間で指定※ライブラリ使用
        var JWT_Payload_JSON = {};
        var JWT_Start_Time = KJUR.jws.IntDate.get('now');
        var JWT_End_Time = KJUR.jws.IntDate.get('now + 1hour');

        JWT_Payload_JSON.iss = Client_ID;
        JWT_Payload_JSON.sub = Service_Account;
        JWT_Payload_JSON.iat = JWT_Start_Time;
        JWT_Payload_JSON.exp = JWT_End_Time;

        // JSON形式にしてJWT生成※ライブラリ使用
        var JWT_Assertion_Key = KJUR.jws.JWS.sign("RS256", JWT_Header_JSON, JWT_Payload_JSON, JWT_Private_Key);

        //ボタンのクリックイベント
        Start_Button.onclick = () => {

            // アクセストークンの取得
        	const Token_Header = {
        		"Content-Type": "application/x-www-form-urlencoded"
        	};

            // URIエンコードが必要。
            // application/x-www-form-urlencodedなのでJSON形式ではないことに注意
            // ちなみに、Botの送信はapplication/json
            const Token_Body = encodeURI(
                "assertion=" + JWT_Assertion_Key + "&" +
                "grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer" + "&" +
                "client_id=" + Client_ID + "&" +
                "client_secret=" + Client_Secret + "&" +
                "scope=bot"
            );

            kintone.proxy("https://auth.worksmobile.com/oauth2/v2.0/token", "POST", Token_Header, Token_Body)
        	.then((result) => {
                // レスポンスのアクセストークンをヘッダーに登録
                const Bot_Header = {
        			"Content-Type": "application/json; charset=UTF-8",
        			"Authorization": "Bearer " + JSON.parse(result[0]).access_token,
        			"X-HTTP-Method-Override": "GET",
        		};

                //送りたい内容はtextに記入
                var Bot_Body = {
        			"content": {
        				"type": "text",
        				"text": "Hello"
        			}
        		};
                var JSON_Data = JSON.stringify(Bot_Body);

                // Botの送信
        		kintone.proxy(Bot_URL, "POST", Bot_Header, JSON_Data)
        		.then((result) => {
        			console.log(result);
        		}, (error) => {
        			console.log(error);
        		});
        	}, (error) => {
        		console.log(error);
        	});
        };

        //ボタンを初期化して生成
        Send_Button.innerText = '';
        Send_Button.appendChild(Start_Button);
    });
})();

```
#### 4.kintoneのカスタマイズアップロード
アップロードして終了です。
![KintoneからLINEWORKSで通知を送る方法2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2919252/02372bd6-71c7-6f1d-32ad-449f9d81fe3c.png)

#### 5.最後に
varとconstが混じっていたりイベント関連の処理など、実用化するためには修正が必要になりますが、
これでとりあえず、送れるようになっているかと思います。