Index
はじめに
ビジネス版のLINE「LINE WORKS」とkintoneを連携させます。
今回、kintoneはLINE WORKSのトーク情報を保存するデータベースとして利用します。
一般的に フロー型 と呼ばれるLINE WORKSと、 ストック型 と呼ばれるkintoneのコラボレーションです!
概要
今回はLINE WORKSとkintoneの間にAWSを使います!
処理の流れは以下のようになります。
- LINE WORKSのBotのCallbackによって、Amazon API Gatewayを動かす
- AWS LambdaでLINE WORKSの情報を取得する
- LINE WORKSの情報をkintoneへPOSTする
kintoneの設定
kintoneアプリの作成
LINE WORKSのCallbackメッセージに含まれるトーク発言者とトーク内容をkintoneに登録したいと思います。
LINE WORKSのCallbackの詳細はこちら(外部サイト)をご確認ください。
フィールド名 | フィールドタイプ | フィールドコード |
---|---|---|
トーク発言者 |
文字列(1行) |
Name |
トーク内容 |
文字列(複数行) |
Contents |
作成日時 |
作成日時 |
作成日時 |
アプリのフォーム画面はこちらです。
APIトークンの生成
今回はkintoneの認証にAPIトークンを利用したいと思います。認証についてはこちらをご覧ください。
生成するAPIトークンは後ほどLambdaのプログラム内で必要になるのでメモしておいてください。
アプリの管理画面から設定タブをクリックし、APIトークンの画面を開きます。
今回はkintoneへのレコード新規登録を行いたいので、生成ボタンをクリックしてレコード追加にチェックを付けます。
(ここで生成されたAPIトークンをメモしておいてください)
その後、「保存」をクリックして「アプリを更新」をクリックします。これでAPIトークンの生成は完了です。
※アプリの更新は忘れがちなので注意してください!
AWSの設定
AWSマネジメントコンソール からコンソールへログインします。
AWSサービスの検索窓から使用するサービスを検索してください。
Lambda関数の作成
先ほどのAWSサービスから「Lambda」を検索してLambdaの画面を開き、「関数の作成」を選びます。
関数名はわかりやすく「LINEWORKS_kintone」とします。
(ここは実際に使用する状況によって適宜変更してください。)
Lambda関数の雛形を先に作っておきます。下の画面が表示されれば大丈夫です。
API Gatewayの設定
先ほどのAWSサービスから「API Gateway」を検索してAPI Gatewayの画面を開き、「REST API」の「構築」を選びます。
プロトコルは「REST」、新しいAPIの作成は「新しいAPI」を選択します。API名はわかりやすく「LINEWORKS_kintone」とします。
(ここは実際に使用する状況によって適宜変更してください。)
APIが作成されるので、作成したAPIを選択して上部のアクションから「メソッドの作成」を選びます。
今回はLINE WORKSから受け取ったデータをkintoneへPOSTしたいので、メソッドはPOSTを選びます。
そして、Lambdaプロキシ統合の使用にチェックをつけ、関連付けるLambda関数名(LINEWORKS_kintone)を入力します。
次に、作成したAPIのデプロイを行います。
上部のアクションからAPIのデプロイを選択します。
デプロイされるステージを選択する画面になるため、過去ステージを設定している場合はそれを選んでいただき、
新しいステージを作成する場合は「新しいステージ」を選択してステージ名を入力します。
(今回は開発用としてdevというステージを作成しています。)
Lambda関数プログラムの作成
実際にLambda上で動かすプログラムを作成します。
Lambdaはzipファイルでアップロードすることができるので、あらかじめローカルで作成しておきzip化したものをアップロードします。
今回はNode.jsでプログラムを書きたいと思います。kintoneへのPOST部分はnode-fetchモジュールを使用するため、
npmでnode-fetchモジュールをインストールしておいてください。
※ Commonjsで動作させるため、今回はnode-fetchのv2を利用しています。
npm install node-fetch@2
・index.js
作成したindex.jsとnode_modulesをzip化してLambdaへアップロードします。
API GatewayのURL取得
Lambda上のAPI GatewayトリガーからURLを取得します。
このURLにアクセスするとLambda関数が実行される仕組みとなっています。
LINE WORKSのBotの設定
次にLINE WORKS側でBotの作成、および適用をします。
API IDの発行
API IDが未発行の場合は、下記のヘルプに従い、API IDを発行してください。
Developer Console に API ID が表示されている場合、API ID の発行は不要です。
※API ID が発行されていないと、LINE WORKSのBotからAmazon API Gatewayにメッセージが送信されないので注意ください。
Botの作成
LINE WORKSの管理者アカウントでLINE WORKS Developer Consoleを開きます。
Developer ConsoleからBotを開いて、登録を選択します。
「Bot名」、「説明」を入力します。
「Callback URL」のOnにチェックをつけ、URLに先ほどAPI GatewayのURLを入力します。
また、Botポリシーの「複数人のトークルームに招待可」にチェックをつけることで、
複数人のメッセージのやりとりを全てkintoneへ登録できるようになります。
Botの適用
LINE WORKSの管理者アカウントでLINE WORKS Adminを開きます。
左のメニューの「サービス」から「Bot」を開き、「Bot追加」を選択します。
先ほど作成したBotが一覧に表示されるので、選択し「Bot追加」を選択します。
そして、追加したBotを選択し、公開にチェックを付けて保存します。
これでBotの適用は完了です。
動作確認
LINE WORKSのトークルームに作成したBotを招待します。
あとはBotを気にせずトークをするだけです。
トーク発言日時(レコード登録日)、トーク発言者、トーク内容がkintoneに登録されています!
ちなみに、
kintoneの文字列(複数行)フィールドを利用することで、きちんと改行もされています。
発展
今回はLINE WORKS → kintoneの一方通行の連携でしたが、
「トークの内容をもとにkintone上のデータをGETして、LINE WORKSにPOSTする」といういわゆるチャットBotの連携も可能となります。
LINE WORKSにトークを送信するためにはサーバーAPIの設定が必要です。
サーバーAPIを利用するためには、
- サーバーの固定IPアドレスを利用したトークン認証
- OAuth認証を利用したトークン認証
のどちらかをサーバー上で設定する必要があります。
詳しくはLINE WORKSのドキュメント(外部サイト)をご覧ください。
おわりに
LINE WORKSからCallbackで受け取ったデータをAWS Lambdaで整形してkintoneに登録する仕組みの紹介でした。
やりとりはLINE WORKS、履歴はkintoneと使い分けることでお互いのいいとこ取りができますね!
設定は多いですが、仕組みはシンプルなのでぜひトライしてみてください!
このTipsは、2021年11月版 kintoneで確認したものになります。
貴重な記事、ありがとうございます。
「Lambda関数プログラムの作成」の項の「作成したindex.jsとnode_moduleをzip化してLambdaへアップロードします」を次のように修正されてはどうでしょうか。特にフォルダ名が単数形なのが気になります。複数形が正しいかと思います。
「作成したindex.jsとnode_modulesフォルダをzip化してLambdaへアップロードします」
以下は余談的メモです。次のコマンドで lineworks.zip を作りました。
それとこちらで、https.request を使った貴重なコードを見つけました♥
Toshi Akazawa 様
お世話になっております。cybozu developer network 事務局です。
記事へのフィードバックをくださりありがとうございます。
また、参考情報もありがとうございます。
いただいたフィードバックの内容を元に記事の修正を検討いたします。
今後ともよろしくお願いいたします。
こんにちは。
上記のコードで試してみると、送信元メンバーアカウントがundefinedになるのですが何が原因なのでしょうか?
喜田 晃大様
お世話になっております。cybozu developer network 運営でございます。
こちら、コードのお間違いや設定のお間違いなどはございませんでしょうか?
でしたら、可能性としては現在LINEが提供しているAPIのバージョンが1.0から2.0へと変わっており、その影響の可能性もございます。
その場合、こちらのAPI2.0リファレンスにあるとおり「accountId」ではなく「userId」とLambdaのコード上修正するとユーザー情報が取得できるかもしれません。
申し訳ございませんが、現時点では未検証のため、保証はできかねますが、
社内にフィードバックし記事内容を検討いたします。
よろしくお願い致します。
cybozu developer network 様
返信ありがとうございます。
「accountId」を「userId」に修正したところユーザー情報取得できました!
ありがとうございました。