LINE WORKSへメッセージを送るLooker Action

こんにちは。株式会社電通国際情報サービスのkumakuraです。

今回はBIツールLookerの外部連携機能である**Action**でビジネス版LINE「[LINE WORKS](https://line.worksmobile.com/jp/)」の[外部トーク連携](https://line.worksmobile.com/jp/blog/use-cases/line-external-user-talk/)を通じてLINEユーザにメッセージを送る連携機能を作成してみました。


#目次
[1. はじめに](#1-はじめに)
[2. LINE WORKSについて](#2-line-worksについて)
[3. 作成したActionについて](#3-作成したactionについて)
[4. Action APIでAction Hubを構築](#4-action-apiでaction-hubを構築)
[5. ソースコードについて](#5-ソースコードについて)
[6. 終わりに](#6-終わりに)




#1. はじめに
BIツールLookerでは分析して得た結果や条件に応じて、**Action Hub**と呼ばれるサーバを経由して
外部サービスにデータを連携することができます。
Looker内ではそれら外部サービス連携機能を**Acition**と呼びます。

Looker公式で[TwilioやSlackといった**Action**が数十種類公開](https://docs.looker.com/ja/admin-options/platform/actions)されていますが、プログラミングをすることで独自にActionを開発することも可能です。

独自のActionを開発する場合、
①. 「公式Node.jsフレームワークを用いる」方法
②. 「Action APIを自前で実装する」方法
の2つ方法があるのですが、今回は②Action APIを採用して、LINE WORKSユーザへLINEユーザへのメッセージテンプレートを含むメッセージを送信するActionを作成しましたので、本記事で紹介していきたいと思います。

~~具体的なソースコードはGithub にて公開しております~~
（鋭意製作中です！しばらくお待ちください）



#2. LINE WORKSについて

LINE WORKSはLINEと連携できる唯一ビジネスチャットツールです。LINEのようにチャットやスタンプを送ることができ、[LINEユーザや他LINE WORKSユーザとコミュニケーションをとることができます。](https://line.worksmobile.com/jp/blog/use-cases/line-external-user-talk/)
例えば、B to C の接客を行う企業でLINE WORKSを利用することにより、スタッフや営業(LINE WORKSユーザ)とお客さん(LINEユーザ)との間で交わされたトーク内容や顧客の情報を一元管理することができます。
また、組織全体でどのようなトークがなされたのか履歴も取得することができるので、データベースに配置することで分析をすることも可能です。

### URLスキーム

LINE WOKSでは[URLスキーム](https://developers.worksmobile.com/jp/document/17?lang=ja)を使用してユーザに様々な操作を実行させることができます。その中で、指定したユーザへトークさせるよう遷移させるURLスキーム機能が存在します。

```
lineworks://message/send?version={scheme_verion}&message={message}&worksAtIdList={works_at_id_list}&callbackMainYn={Y/N}
```

上記URLスキームをLINE WORKSアプリ内で押下することで、LINE WORKSユーザに指定したユーザへトークをさせるよう遷移させることができます。
上の場合、URLスキーマを押下すると、*message*で指定された文章がチャット欄に入力された状態で、*worksAtIdList*で指定された外部ユーザ（**LINE@**、WORKS@）のトークルームへ遷移します。
ユーザは文章が正しいことを確認し、トークを外部ユーザの方へ送信することができます。（*message*で指定された文章を修正することもできます。）

以上の機能を応用することで、**LINE WORKSユーザ（スタッフや営業の方）に向けてLINEユーザ（顧客）へトークさせるようレコメンドすることができる**ようになります。


#3. 作成したActionについて

2章で紹介したURLスキームを利用して、LINE WORKSユーザへLINEユーザへトークをレコメンドするActionを作成しました。
**以降の話はLINE WORKSのスタッフ・営業の情報とLINEの顧客情報がDWHで管理されていることを前提としております。**

　
##3.1. LINEWORKユーザとLINEユーザが対応した表を作成する

今回はLookerで次のような表が作成された際に、それぞれのLINE WORKSのユーザに対して、紐づいているLINEユーザへトークをレコメンドするActionを作成しました。

| LINEWORKS ID | LINE ID[^1]         | LINE ユーザ名 |
| ------------ | --------------- | ------------- |
| xxxxx@org    | 901000000011001 | 山田太郎      |
| xxxxx@org    | 901000000011002 | 佐藤花子      |
| xxxxx@org    | 901000000011003 | 鈴木一郎      |
| yyyyy@org    | 901000000011001 | 山田太郎      |
| yyyyy@org    | 901000000011004 | 高橋雄一      |
| zzzzz@org    | 901000000011001 | 山田太郎      |

上の場合、次のようにレコメンドいたします。

- xxxxx@orgの方へトークしてほしいLINEユーザ
    - 山田太郎(901000000011001)、佐藤花子(901000000011002)、鈴木一郎（901000000011003）
- yyyyy@orgの方へトークしてほしいLINEユーザ
    - 山田太郎(901000000011001)、高橋雄一（901000000011004）
- zzzzz@orgの方へトークしてほしいLINEユーザ
    - 山田太郎(901000000011001)

　
##3.2. ActionのフォームにLINE WORKSユーザヘのレコメンド文章とLINEユーザへのメッセージテンプレートを入力する
Lookerを利用するデータアナリストはActionのフォームで**LINE WORKSユーザヘのレコメンド文章**と**LINEユーザへのメッセージテンプレート**を入力いたします。

![image1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/878249/b2a40639-0cc9-0082-d970-b8e4716ebd42.png)


以上のようにフォームを入力し、Actionを実行することで、LINE WORKS Botを通してLINE WORKSユーザに対してメッセージが送られます。

## 3.3. Actionを実行する

Botからメッセージが送られた後のフローは次のようになります。
![image2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/878249/970cf30b-2c38-329f-330a-ac6ef6c63fa8.png)

（なにかしらのCRMシステムと連携されていることが前提にはなりますが）ユースケースとして、例えば誕生日が近い顧客に対してトークを送るようスタッフ・営業にレコメンドしたり、数ヶ月顧客とのトーク履歴のないスタッフ・営業に対して挨拶をするようレコメンドしたりすることが考えられます。


#4. Action APIでAction Hubを構築

今回、Action APIを自前で実装し、Action Hubサーバを構築いたしました。
Action APIを利用する場合、例えばデータベースを利用したり、個別のAWSの環境とインテグレーションを行ったり、今回のように特定のユースケースに特化したActionを柔軟に作成することができます。

プラットフォームも自由に選択できますが、今回はデプロイの容易さ＋再配布性の高さを考え、Heroku(Heroku Button)でAction Hubサーバを構築しました。
またAction APIを利用する場合、HTTPリクエストを扱うことができればどの言語でも問題ありません。今回はTypeScript + ExpressでAction APIを搭載したサーバを構築しました。

LINE WORKSではbotを通してメッセージを送信する場合、サーバ利用のアクセストークンを取得する必要がありますが、取得方法が*固定IPタイプ*と*ID登録タイプ*の2種類存在します。
*固定IPタイプ*はIPをLINE WORKS上に登録し、特定のアクセストークンを取得する方式で、*ID登録タイプ*は認証キーを用いてJWT(JsonWebToken)を作成し、認証サーバへトークンを要請する方式となります。（下図参考）
![LINE WORKS Token](https://developers.worksmobile.com/kr/document/image/47_JP/124)
引用：https://developers.worksmobile.com/jp/document/1002002?lang=ja

*固定IPタイプ*の場合、認証キーでJWTを作成する必要がなく、アクセストークンの管理も行わなくて済むので楽ではあるのですが、Herokuの外部IPを固定化する必要があるため、`Proximo`といったアドオンを導入するなどで固定IPを準備する必要があります。`Proximo`はフリープランが存在しないので、皆様に手軽にデプロイしていただきたいことを考えて、今回は*ID登録タイプ*を採用しました。
その際、アクセストークンの管理としてHeroku Postgresを利用しております。

アーキテクチャ全体のイメージは以下のようになります。

![アーキテクチャ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/878249/3029c0d6-38cd-5d00-b324-bb2fbc7d3357.png)

#5. ソースコードについて

~~Githubにてソースコード公開しております。readmeにて[Deploy to Heroku]ボタンも配置しておりますので、手軽に自前の環境にデプロイすることが可能です。具体的なデプロイ方法もREADMEに記載しておりますので、是非ご参考ください~~
（鋭意製作中です！しばらくお待ちください）

#6. 終わりに

今回、Action APIを用いてLINE WORKSと連携するActionを作成しました。
Action APIを用いることで、DBを利用する等柔軟に Actionを開発することができ、今回のようなユースケースに特化したActionを作成することもできます。
今回作成したActionはGithubから公開予定ですので、是非ソースコードもご覧ください。
ここまで読んでいただきありがとうございました。



[^1]: LINE IDはLINE WORKS内で管理されているLINEのIDになります。LINEでのUUIDでは無い点にご注意ください。<br>https://forum.worksmobile.com/jp/posts/100319