LINE Bot を Bot Framework Composer でローコード開発する : その 6 返信以外の Messaging API 呼び出し

[前回](https://qiita.com/kenakamu/items/201038ab1ae43d35cce1)はユーザーから画像が送られてきた場合の対応と、外部サービスとの連携について見ていきました。今回は外部サービスとして Messaging API を直接呼び出す場合について見ていきます。

# 返信以外の Messaging API

Messaging API の基本はユーザーからのメッセージに返信する事ですが、それ以外にも多くの事ができます。

- プッシュメッセージの送信
- ボットを追加したユーザーの数を取得
- ユーザーのプロフィール取得
- ユーザー単位のリッチメニュー操作、等

機能はどんどん追加されていくので、[Messaging API リファレンス](https://developers.line.biz/ja/reference/messaging-api) や [ニュース](https://developers.line.biz/ja/news/) で最新情報を確認してください。

# プッシュメッセージの送信

メッセージを送ってきたユーザー以外にメッセージを送る場合、プッシュ通知を利用します。尚、プッシュ通知はプランによって制限があります。

今回は挨拶ダイアログのフローで、ユーザーが熱があった場合に管理者に通知するようにしてみます。

## プッシュメッセージの仕様確認

[プッシュメッセージを送る](https://developers.line.biz/ja/reference/messaging-api/#send-push-message) によると POST で https://api.line.me/v2/bot/message/push に対して以下内容を送信すると通知ができます。

```json
{
    "to": "U4af4980629...",
    "messages":[
        {
            "type":"text",
            "text":"Hello, world1"
        },
        {
            "type":"text",
            "text":"Hello, world2"
        }
    ]
}
```

ヘッダーは Content-Type と Authorization であるため、Postman で確認してみます。

1\. [LINE の開発者コンソール](https://developers.line.biz/console) よりチャネルトークンとユーザーの ID を確認。
**Messaging API 設定より**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/19aace82-26f2-ac4a-3de7-3c9643a20c20.png)
**チャネル基本設定より**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/6f6809f2-83ca-5b65-28fc-a9bf6db2beb8.png)

2\. Postman を起動。POST を選択し、URL とヘッダーを設定。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/94a02bdd-0c90-bda1-7034-c0af9ea012fd.png)

3\. Body に送信するメッセージを設定。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/ae4fdcdf-ce61-d7aa-993f-8959e6f6a6aa.png)

4\. 送信を実行して LINE クライアントで受け取れることを確認。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/0b3ff3d1-0404-289f-f6bc-fa3b83edb03b.png)

## プッシュメッセージ機能の追加

プッシュメッセージの送り方は分かったので、フローの追加します。

1\. HelloDialog の BegingDialog トリガーを開き、体調を聞いている個所を確認。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/143aeddd-1b59-757d-a2c9-3d396495730e.png)

2\. ユーザーからの回答の直後に If/Else ブランチを追加。条件で ```user.healthCondition == 'とても悪いです'```　を指定。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/fb5c12cd-6ffe-39db-5753-8cb5fa617432.png)

3\. True ブランチに HTTP 要求を追加。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/05c9880d-6365-cb06-3d52-89a847a4b9ef.png)

4\. Http メソッド、アドレスを指定。またボディは以下のように設定。

- settings は設定情報を取得する変数。line 以降の設定は後で追加

```json
{
    "to": "${settings.line.adminUserId}",
    "messages":[
        {
            "type":"text",
            "text":"体調の悪いユーザーがいます"
        }
    ]
}
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/555994e3-d937-8161-53a2-ceb0eeca306d.png)

5\. ヘッダーを以下のように設定。

- Content-Type: application/json
- Authorization: Bearer ${settings.line.accesstoken}

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/b3c0038f-14f0-a673-500c-6da43019e4b4.png)

6\. Settings メニューより「Show keys」をオンにして編集モードにする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/41193b4b-fc6b-9d6f-b388-28265b724889.png)

7\. 以下の line 設定を既存の項目の下に追加。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/2c34d4b9-fb98-54f0-4332-1f13a85d86d0.png)

## テスト

ボットを再起動して、LINE クライアントからテスト。管理者と同じユーザーでテストしたため少し分かりずらいですが、最後のメッセージはプッシュメッセージで来たものです。
<img width="350" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/11b61ff8-b3eb-6a44-0d95-f79dfd2e63cd.png"/>

# ユーザープロフィールの取得

今のままでは誰の調子が悪いか分からないため、ユーザープロフィールより名前をとってみます。

## プロフィール取得の仕様確認

[プロフィールの取得](https://developers.line.biz/ja/reference/messaging-api/#get-profile) を見ると、GET で https://api.line.me/v2/bot/profile/{userId} に送ることでデータを取得できそうです。

こちらも Postman で確認しておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/b734ac10-f64b-d887-5ce3-61efa373a249.png)

## プロフィール取得機能の追加

プロフィールは更新される可能性はありますが、通常はボットを友達追加した時に取得しておくのが効率がいいです。よって今回も友達追加のタイミングでプロフィールを取ります。

1\. メインダイアログより Greeting トリガーを開く。このトリガーはユーザーが友達追加をしたタイミングでトリガーされる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/14672ed1-7ae7-1579-e677-ae5d4bbe6455.png)

2\. 既定で会話に参加したのがユーザーかボットかを区別するロジックがあるため、if/else の True ブランチに HTTP 要求を追加。メソッドに GET を指定し、Url に https://api.line.me/v2/bot/profile/${dialog.foreach.value.id} を追加。

- dialog.foreach.value: Foreach でループされたアイテムが格納される

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/ce223f69-f5aa-166c-d848-29b9bedf2e40.png)

3\. ヘッダーに認証情報を追加。また結果を dialog.response に格納。

- Authorization: Bearer ${settings.line.accesstoken}

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/7e65b289-952c-43e4-b917-8e9a3f029ea5.png)

4\. 次に「Manage properties」より「Set a property」アクションを追加。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/3501f0cb-4da3-3063-4300-ee40b2658bae.png)

5\. user.name プロパティに ```=dialog.response.content.displayName``` を設定。

- dialog.response.content にプロフィールの結果が入るため、それを user.name にコピー

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/c61dc2c7-c51c-e8c6-df35-638893b99303.png)

6\. 最後に応答の送信を追加して、挨拶を指定。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/a61afb23-ca82-9889-d273-51f6124bc633.png)

## テスト

LINE クライアントより一旦ボットを削除し、再度友達追加することでテストできます。
<img width="350" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/69f94377-f30b-e8ef-7398-c5e80edb9c77.png"/>

## プッシュメッセージの変更

名前が取れるようになったので、プッシュメッセージでも活用します。先ほど追加したプッシュメッセージの中身を変更します。

```json
{
  "to": "${settings.line.adminUserId}",
  "messages": [
    {
      "type": "text",
      "text": "${user.name}さんの体調が悪いようです"
    }
  ]
}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/e57d0ac9-fac6-7a1c-df1d-a01f7dcdcce2.png)

LINE クライアントから確認します。ここでも管理者ユーザーで試したため分かりずらいですが、最後のメッセージはプッシュメッセージ送られてきたものです。他のユーザーで試した場合、管理者には最後の通知のみが届きます。
<img width="350" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/18f72753-cdf0-f0ee-7ee9-6a5ac18e2c85.png"/>

# まとめ

今回は返信以外の機能の使い方を見ていきました。Messaging API には多くの機能があり連携すればするほど高度なボットが開発できます。色々試してください。