【LINE WORKS】WOFFを使って簡易なミニアプリを作ってみる

# はじめに
5/10にLINE WORKSでミニアプリを実装できる「WOFF (WORKS Front-end Framework)」が公開された。
このWOFFを使うことで、LINE WORKSと高度に連携したWebアプリを作れるようになった。

■ 機能紹介: https://developers.worksmobile.com/jp/features/woff
■ WOFFガイド: https://developers.worksmobile.com/jp/docs/woff-guide
※ WOFFはフリープランでも利用可能。

今回は、このWOFFを使った簡易なミニアプリを作成してみる。

# 1. WOFFアプリの実装
WOFFアプリは、LINE WORKS上で起動するWebアプリであるため、通常のWebアプリ開発とほぼ同じ工程で作成する。

今回作るWebアプリは、ユーザー名やユーザーIDを表示したり任意のメッセージをトーク上に送信できるものとした。
また、ライブラリやフレームワークを使わないバニラなJavaScriptで実装した。

## ソースコード
今回のコード全文は以下に公開。

https://github.com/mmclsntr/woff-simple-app

ここからはいくつかの要点をピックアップして説明する。

## WOFF SDKのインポート
WOFFの各機能は、WOFF SDKを通して利用する。

WOFF SDKは現在、CDNでのみ公開されている。HTMLに以下を入れてインポートする。

```html:index.html # WOFF SDKをインポート
<script src="https://static.worksmobile.net/static/wm/woff/edge/3.6/sdk.js"> </script>
```

## WOFF IDの指定
WOFFの初期化のために、「WOFF ID」が必要となる。
ただし注意として、WOFF IDはDeveloper ConsoleにてWOFFを登録してから取得できるものであるため、ここでは変数のみを定義して、後述のWOFFの登録の後に値をいれる。

```javascript:param.js
export const woffId = 'Your WOFF ID'　 // WOFFの登録後に格納
```

## WOFFの初期化
WOFFの機能を呼び出すために、まず `woff.init()` メソッドでWOFFの初期化を行う。

`window.addEventListener()` に指定してページ描画後に走るようにする。

```javascript:script.js # WOFFの初期化
// On load
window.addEventListener('load', () => {
    console.log(woffId)

    // Initialize WOFF
    woff.init({ woffId: woffId })
        .then(() => {
            // Success
            // Button handler
            registerButtonHandlers();
            // Get and show user profile
            getProfile();
        })
        .catch((err) => {
            // Error
            window.alert(err);
            console.error(err)
        });
});
```

## ユーザー情報の取得と表示
`woff.getProfile()` メソッドでユーザー情報を取得できる。

取れる情報は以下の通り。
- domainId
- userId
- displayName

```html:index.html # ユーザー情報の表示
<h2>Profile</h2>
<table>
    <tr>
        <th>domainId</th>
        <td id="domainIdField"></td>
    </tr>
    <tr>
        <th>userId</th>
        <td id="userIdProfileField"></td>
    </tr>
    <tr>
        <th>displayName</th>
        <td id="displayNameField"></td>
    </tr>
</table>
```

```javascript:script.js # ユーザー情報の取得
/**
 * Get profile
 */
const getProfile = () => {
    // Get profile
    woff.getProfile().then((profile) => {
        // Success
        console.log(profile)

        // Set user info
        document.getElementById('domainIdField').textContent = profile.domainId;
        document.getElementById('userIdProfileField').textContent = profile.userId;
        document.getElementById('displayNameField').textContent = profile.displayName;
    }).catch((err) => {
        // Error
        console.log(err)
        window.alert(err);
    });
}
```

## メッセージの送信
`woff.sendMessage()` メソッドで、トークに任意のメッセージを送ることができる。

> 補足
> - メッセージの送信先は、WOFFアプリを開いたトークルーム上となる。

「Message text」欄に入力したテキストを「Send Message」ボタンで送るようにする。

```html:index.html # メッセージテキストと送信ボタン
<h2>SendMessage</h2>
<div class="buttonRow">
    <label for="message">Message text</label>
    <input type="text" value="text" name="message" id="sendMessageText">
    <button id="sendMessageButton">Send Message</button>
</div>
```

```javascript:script.js # メッセージ送信
/**
 * Register event handlers for the buttons displayed in the app
 */
const registerButtonHandlers = () => {
    document.getElementById('sendMessageButton').addEventListener('click', function() {
        let msg = document.getElementById('sendMessageText').value

        // sendMessage call
        woff.sendMessage({ 'content': msg }).then(() => {
            // Success
            console.log("message sent: " + msg)
            window.alert('Message sent');
        }).catch((err) => {
            // Error
            console.log(err)
            window.alert(err);
        });
    }
    )
}
```


# 2. WOFFアプリのデプロイ
Webサーバーに載せて公開する。今回は検証ということで、ローカルに起動し、Ngrokでフォワーディングして公開する。

## ローカルでWebサーバーを起動
今回はPythonの`http.server` モジュールを使う。

実行。

```sh
python -m http.server 8000
```

portは8000とした。

## Ngrokを使って公開
ローカルに立てたWebサーバーに外部からアクセスできるよう、今回は「Ngrok」を利用する。

https://ngrok.com/

実行。

```sh
ngrok http 8000
```


# 3. WOFFアプリの登録
Developer ConsoleでWOFFを登録する。

まずは「アプリ」を作成する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241369/6d58e7f9-50cc-e2b5-686f-3a4efb56fe3e.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241369/ba2e99a3-91d1-ded8-43f3-449b62a2752a.png)

作成後、まずはScopeを設定する。`woff.sendMessage()` を利用するためには **`bot` scope**が必要。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241369/ab8a9e09-ecaa-1a7f-055a-48bbd1427451.png)

次に、WOFFを登録する。「WOFFアプリ > 登録」から追加する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241369/cb6ffa6c-c415-13f3-66aa-9d12e6ba9098.png)

「Endpoint URL」に、NgrokのURLを入れる。サイズは3種類から選べるため、任意のサイズを選択する。

> サイズの目安
> Full: 全画面、Tall: 4分の3画面, Compact: 半画面

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241369/19a54259-ddc7-c2fe-a69d-df015cfac6f1.png)

保存すると一覧に表示され、「WOFF ID」が割り当てられる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241369/798906d6-a8a6-b433-417f-d85d9b810612.png)


「URLコピー」からWOFFのURLをコピーできる。

```text:例
https://woff.worksmobile.com/woff/{WOFF ID}
```

一度WOFF URLをコピーし、LINE WORKSの任意のトークに送っておく。
(※ この後、モバイル版のアプリで開くため)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241369/17f90ea5-a074-5ba5-19a4-39e2c259701d.png)


## WebアプリにWOFF IDを記述
前述した通り、WOFFアプリを立ち上げた際に、WOFFの初期化のために、「WOFF ID」が必要となる。

Developer Consoleにて取得したWOFF IDを変数に格納する (今回のサンプルでは `param.js` 内)。

```javascript:param.js
export const woffId = 'Developer Consoleから取得したWOFF ID'
```

設定後、必要に応じて再度デプロイして反映させる (今回の方式だとファイル保存のみで再デプロイ不要)。

これで、WOFFアプリの実装と設定は完了。

# 4. LINE WORKS上でWOFFアプリを開く
モバイル版のLINE WORKSアプリを開き、先ほどWOFF URLを送ったトークからWOFFアプリを開いてみる。


正しく動けば、初期化処理とユーザー情報の取得が行われ、上部に情報が表示される。

![IMG_0517.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241369/2c9e3930-619f-b3e1-ac4d-861ebe09aee6.png)

また、下の「SendMessage」から任意のテキストを送信できる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241369/5d2c8b75-6f88-c860-17fa-6423f9bfb4c4.png)
![IMG_0518.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241369/bb3829cf-d668-92fe-d81d-5edda83f8625.jpeg)
![IMG_0519.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241369/c53fd394-3ed9-cee6-b43c-6c0c78796fc8.jpeg)


> 補足
> ちなみに、WOFFはLINE WORKSアプリだけでなく、外部のブラウザにも対応している。
> `woff.login()` メソッドでログインをすることで各種機能を呼び出すことができる。
> ただし、メッセージ送信 (`woff.sendMessage()`など) は対応していない。

# まとめ
このようにWOFFを使うことでLINE WORKSと連携したミニアプリを作ることができる。今回はユーザー情報の取得とメッセージ送信について扱ったが、WOFFは他にもQRコードのスキャンやFlexible messageの送信といった機能も持っている。

ユーザーIDを使ったデータ連携を比較的容易に作れるため、ユーザーに合わせて表示する情報を柔軟に変えたり何か複数の情報を入力させるといった、Botとはまた違った体験を作ることができる。

よりLINE WORKSの活用の幅が広がる機能であるため、ぜひ活用いただきたい。