[OneSignalで実現する]WebPush通知配信承認システムをListsとPower Automateとカスタムコネクタで作成してみた

夏休みの課題が、諸事情で遅れてしまいましたが、ようやく形に出来たので、ブログにまとめました。

昨年ぐらいから海外のサイトを閲覧していると、ブラウザへのWebPush通知を確認するダイアログがよく表示されだしたので、個人情報を収集せず、ライトな顧客へのアプローチが可能なサービスとして目をつけていたので、ブラウザの対応状況とか有用なソリューションが無いか調べて、実装までやってみようというのが夏休みの目標でした。

##どうやってブラウザでPush通知を受け取ってるの？
そもそもブラウザでPush通知をどうやって受けとっているのか不思議でした。
モバイルみたいに常にプロセスが起動している訳でもないので、何らかの監視するバックグラウンドのプロセス制御が必要なると予想はしていましたが、PWAで利用される「Service Worker」で実現しているんですねー！

[HTMLページ側でPush通知の登録を行って]→[サーバー側から配信したメッセージ内容をService WorkerがPush通知を受信する]という形になっています。

Push APIについて詳しく知りたい方は[W3C-Push APIのシーケンスダイアグラム](https://w3c.github.io/push-api/#sequence-diagram "ダイアグラム")を参照してください。


##OneSignalについて
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140547/ce7f9857-a420-84bf-b727-3a43ac37104b.png)
各ブラウザ会社が用意しているPush通知のAPIへ直接データを送れるものかと考えていましたが、前述の通り送信内容の暗号化やプロセスとしての常駐など、Javascriptで作られたService Workerが必要なので、統合的なPush通知サービス<b>OneSignal</b>というサービスが、APIにも対応しておりましたので、今回はこちらのサービスで作成することにしました。

OneSignalが対応するサービスとしましては、

- モバイルPush
- WebPush
- SMS
- Email
- アプリ内のメッセージ表示

など幅広く通知を一つのサービスでサポートしています。
モバイルはモバイルのみ、ブラウザはブラウザのみとサービスが別れていることが多く、１社で幅広くサポートしているのが魅力です。

管理画面から、ブラウザPushの設定を行うだけで、Service Workerファイルも作成してくれますし、配信全般の送信・結果・分析まで行えます。（ホントに素晴らしいサービスです！）

##今回作成した配信承認システム概要
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140547/cfe80659-520d-5dc3-f13f-27bbd7360edd.png)
想定したシチュエーションとしては、広報担当者がWebPush通知を使って、社外へ情報発信をするのに、配信内容を上司へ承認を行い、許可が出れば自動的に配信され、却下されればTeamsで通知される流れとなっております。

##作ってみましょう！
####1. OneSignalのサイトで、WebPushの設定をおこないます。
全部説明すると、長くなってしまうので、ここではOneSignalのサイトの設定方法は割愛します。とてもわかり易く説明されているドキュメントを参考にして設定してください。
[WebPushクイックスタート](https://documentation.onesignal.com/docs/web-push-quickstart "ダイアグラム")

作業としては、OneSignalのサイトで、WebPushサービスを設定して、設置したいウェブサイトにJavascriptのファイルを設置する非常に簡単な作業です。

####2. カスタムコネクタの作成
まずは、OneSignalのAPIへ接続するために、カスタムコネクタを作成します。
[OneSignalのAPI仕様書](https://documentation.onesignal.com/reference/create-notification "OneSignalのAPI仕様書")については、リンク先のページを参照してください。

今回はPush通知を送信する機能を利用したいので、「Create notification」をカスタムコネクタで設定します。

<b>[参考]</b>いきなり複雑なカスタムコネクタを作成するのは難しいので、Postmanを利用して確認しながら作成するのをオススメします。Postman上で完成したら、設定ファイルをカスタムコネクタへ取り込めますので、ぜひ活用してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140547/6e529159-c9d7-a5e5-1ee7-2fbee6eba2b1.png)

新規に「一から作成」を選んでコネクタ名を設定してください。私は[OneSignal]としました。

<b>[全般]タブの内容</b>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140547/ae36599c-5e83-57e4-e03e-0b117f819a8c.png)


<b>[セキュリティ]タブの内容</b>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140547/91788220-c1e5-f817-25ed-48e2633a8df6.png)


<b>[定義]タブの内容</b>
「新しいアクション」を「SendPush」として追加して、要求の「サンプルからのインポート」に
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140547/de6000b8-b0ab-2966-67d4-0cc9c35a80d2.png)


動詞：POST
URL：https://onesignal.com/api/v1/notifications
ヘッダー：Content-Type
本文：

```
{
    "app_id": "OneSignalで登録したapp_idをここに記入",
    "include_player_ids": [
"送信先を限定する場合には、ここにデバイス登録されたIDを入力"
    ],
    "data": {
        "url": "リンクする先のURLを記載"
    },
    "contents": {
        "en": "本文メッセージ"
    },
    "headings": {
        "en": "タイトル"
    }
}
```

ヘッダーの「Content-Type」を「編集」を選び
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140547/86b8a634-17e9-1a20-2fe1-8d16d00ea7bc.png)
既定値に「 application/json; charset=utf-8」を記入して戻ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140547/9dad9979-153b-b7d1-e03e-4b442eed2d2b.png)
ここまで入力が終わったら「コネクタの更新」でコネクタを保存してください。

<b>[テスト]タブの内容</b>
最後に「テスト」で送信できるのかテストします。
新しい接続を選んで、APIキーをOneSignalのページで発行し作成してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140547/5ef437d1-7cab-6d68-a315-3c2b183579b6.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140547/53d8a8a4-1219-1d22-cfae-d40d503097b1.png)

※OneSignalのREST API Keysは、ここから見れます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140547/01d8dcfb-73f2-50d8-8449-447e94701776.png)

REST API Keysをコピペしましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140547/711a5024-6868-1271-9d61-492b9bbeeaa9.png)

<b>[テスト]タブの内容</b>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140547/23cfca3a-648a-031e-5e69-4f3df760aed9.png)

<b>app_id</b>
OneSignalで登録したapp_idをここに記入してください。

<b>include_player_ids</b>
送信先を限定する場合には、ここにデバイス登録されたIDを入力します。

<b>url</b>
Push通知の内容へリンクするURLを入力します。

<b>contents</b>
本文のメッセージ

<b>headings</b>
タイトル

##Listsの設定
タイトル、本文、URLの列を作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140547/2e285b00-f751-f622-84a7-fc6b4ef2e20b.png)


##Power Automateの設定
SharePointコネクタの「項目が作成されたとき」をキッカケにして、シンプルに１回の承認を行います。
承認の可否にて、条件分岐をして、「はい」であれば、カスタムコネクターからPush通知の内容をOneSignalのAPIへ送信します。
「いいえ」の場合には、Push配信を申請した担当者へTeamsで、拒否された内容を送信します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140547/a229155b-bfb0-fc17-127c-3f9212765c5c.png)

デスクトップにこの様に通知が届けば完成です！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140547/112f4399-0a91-7365-c62d-6b0dd7de6630.png)


##まとめ
今回は、WebPush配信からヒントを得て、広報担当者が社内から承認を得た上で配信するまでをシステムにしてみました。

メールマガジンのような個人情報を必要とせず、顧客へのつながりを作るWebPush配信は、有用な情報であれば、かなりのエンゲージメントが期待できますが、人気サイト以外では9割が拒否反応というデータもありますので、適切なターゲットを絞り、配信量なども配慮が必要になってくると思います。

ぜひご興味のある方は試して見てください。