無料のpub-subサービスで簡単にプッシュ通知　ntfy

# はじめに
本記事は無料で使用できるHTTPベースのpub-subサービス、ntfyについて記載しています。

サインアップ（アカウントの作成）も不要で1分もかからずにトピックを作成し、pub-subの仕組みを用いて簡単にWebやモバイルにプッシュ通知ができます。

オープンソースになるので自前でホスティングして、ローカル環境などクローズドな環境でも動かすことができます。

では、早速使っていきましょう。

## ntfy
### Web app
はじめにWebアプリから試してみます。
[ntfy](https://ntfy.sh/)にアクセスし、画面右上の「Web app」を押します。

![スクリーンショット 2022-06-10 23.54.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/60498f2c-5ba1-21ba-55ef-45d918db0876.png)


「+トピックを購読」を押します。

![スクリーンショット 2022-06-10 23.54.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/f24956ab-dede-7efe-0df4-f84c1873d829.png)

トピック名を入力します。
**注意事項**としてサインアップがないため、トピックはパスワードと同等です。
簡単に推測できないものをトピック名に入力してください。

ここでは[CyberChef](https://gchq.github.io/CyberChef/)で適当に生成したハッシュ値を入力しています。

![スクリーンショット 2022-06-11 0.04.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/a8df8441-132c-5456-4888-12bf35ea8140.png)

本記事のブラウザ環境はChromeです。初回の場合、通知の許可が求められるため、「許可」を押します。

![スクリーンショット 2022-06-11 0.13.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/26bc1988-4875-e67a-ee61-510ebadb4032.png)

トピック作成後、プッシュ通知のテストをしてみます。
Macの場合はターミナルを起動し、画面中央の例に表示されているcurlコマンドをコピーして実行します。

![スクリーンショット 2022-06-11 0.13.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/ca14a6b2-6697-cb85-df75-b89874875c63.png)

デスクトップに通知音と共に知らせてくれます。:sound:

![スクリーンショット 2022-06-11 0.14.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/b0116e5c-0a97-0557-a3b6-a015a0c1d6fb.png)

また、通知音はカスタム可能です。

![スクリーンショット 2022-06-13 22.30.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/b11f96ce-3e14-69f7-76a6-e50941ceaea3.png)

### Android/iOS
Androidは以前から利用できたようですが、iOSについても2022年5月25日にリリースされ利用できるようになりました。
[App Store](https://apps.apple.com/us/app/ntfy/id1625396347)からインストールできます。

iOSを例にApp Storeからアプリをインストール後、トピックの設定手順について以下に記載しています。

アプリを起動し、トピックを登録するためには「+」を押します。

![IMG_3964.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/8e01a19b-1f6b-7dc0-53b4-d6a41a5b2c81.png)

Server URLに`https://nfty.sh`を入力し、Topic Nameに通知したいトピック名を入力します。

![IMG_3965.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/64825e96-228b-13f3-cdda-7d54e85db85e.png)

テストメッセージを送るとプッシュ通知が届きます。

![IMG_3969.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/9f0a8fcd-f6db-b051-23e9-1500366ef4df.png)

### Self-hosting
セキュリティを確保する場合は自前でホスティングすることで、ローカル環境などクローズドな環境として使用することができます。

[Installing ntfy](https://ntfy.sh/docs/install/)の記載の通りに、Windows及びLinuxなど各種プラットフォームで使用可能です。

dockerを使用する場合は以下のコマンドで実行できます。（キャッシュなしの場合）
`$ docker run -p 80:80 -it binwiederhier/ntfy serve`

ローカル環境の場合、トピック名については適当な名前でも大丈夫です。

![スクリーンショット 2022-06-13 23.03.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/64d03017-c15d-82af-3f8b-78896adcf337.png)

**留意事項**としてローカル環境でもアプリでメッセージを受信できますが、iOSについてはプッシュ通知がサポートされていません。[iOS instant notifications](https://ntfy.sh/docs/config/#ios-instant-notifications)を参考にFirebase/APNSの対応が必要になります。

## その他
その他、リマインダーや認証機能もありますが、本記事ではメッセージを加工する方法について一部紹介します。

### Message priority
[Message priority](https://ntfy.sh/docs/publish/#message-priority)はメッセージに対して優先度を定義します。

以下はアンチウイルスソフトウェアと組み合わせてスキャン結果からウイルスを検出した場合を想定した例です。

![スクリーンショット 2022-06-15 1.27.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/54d9f7cb-fa5c-7438-3f85-ded01eea9a17.png)

- 実行例
`$ curl -H "X-Priority: 5" -d "FOUND" ＜サーバURL＞/＜トピック名＞`

### Action buttons
[Action buttons](https://ntfy.sh/docs/publish/#action-buttons)は便利な機能です。
アクションを促したい通知に対して設定できます。

以下の例ではメッセージで通知したリンクの参照ができます。

![スクリーンショット 2022-06-13 23.04.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/dd1d24e3-68b5-c1d1-0b1d-3418ebd300c6.png)

- 実行例
`$ curl -d "Somebody retweetet your tweet." -H "Actions: view, Open Twitter, ＜リンクURL＞" ＜サーバURL＞/＜トピック名＞`

### GitHub
リポジトリは[https://github.com/binwiederhier/ntfy](https://github.com/binwiederhier/ntfy)です。
新しいリリースについてiOSはTestFlightに参加できます。

Contributingについても歓迎しています。OSSに興味ある方にも良いと思います。

# おわりに
デスクトップ等ブラウザに対するプッシュ通知を実現したい場合は、最適なサービスだと思います。
また、デザインもシンプルなUIで素敵です。