手軽にスマホなどへの通知を扱えて多機能な「ntfy.sh」

この記事の内容は、[IoTLT vol.89](https://iotlt.connpass.com/event/252034/) の LT で話をした「ntfy.sh」に関するものです。
当初は、その際に LT で話した内容を軽くまとめるだけのつもりでしたが、最終的に以下のスライド内にはない情報も足した形になりました。

<script async class="speakerdeck-embed" data-id="a70aaf0b387e4f15ba9936f48b6f4773" data-ratio="1.77613320999075" src="//speakerdeck.com/assets/embed.js"></script>

## ntfy.sh を知った経緯
最初に ntfy.sh を見かけたのは Twitter上に流れてきたツイートだったと思うのですが、その後、以下のツイートにも書いている「[GIGAZINE の記事](https://gigazine.net/news/20220404-ntfy-push-notification/)」でも見かけたりしました。

https://twitter.com/youtoy/status/1511013966830780416

そして、気になりつつも実際に試したのはわりと最近、という状況でした。

## 「ntfy.sh」について
公式のサイトや GitHubリポジトリは以下になり、上に出てきた GIGAZINE の記事のタイトルでも書かれたいたようにオープンソースとなっています。

- [ntfy.sh | Send push notifications to your phone via PUT/POST](https://ntfy.sh/)
- [binwiederhier/ntfy: Send push notifications to your phone or desktop using PUT/POST](https://github.com/binwiederhier/ntfy/)　

![公式サイト](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/726f737d-1afe-0ded-ccfc-0b03ec090929.png)

![GitHubリポジトリ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/9f8af943-ad01-c7bd-89c2-50505e1c46ad.png)

### できること
ntfy.sh を使うと、スマホや Webアプリに手軽に通知を送ることができます。
オープンソースなので、自前でサーバーやアプリを用意することもできますが、公式から提供されている環境などを使う形でも利用可能です。その場合、自前でビルドしたりサーバーを準備したり、というのが不要になります。

公式の提供している環境について、例えば、スマホに関しては Android・iOS用のアプリがストアからダウンロード可能です。また、通知の情報のやりとりに必要なサーバーも、公式で用意されたものを使うことができます。

#### 公式が提供している環境をそのまま使う場合の注意点
上記の公式が提供している環境を使うと、サービス用のアカウント作成をすることなく、通知の仕組みを使うことができます。
自分が最初に試した際には、、以下の手順で簡単に利用できました。

1. スマホに専用アプリをインストール
1. アプリ上でトピック名（通知元と通知先を紐付ける情報）を設定
1. PC で curl やブラウザを使って通知の送信

一方で上記の使い方だと、アカウント作成や認証などを行っておらず、サーバーが共通であるため、自分以外のユーザと同じ「トピック名」を利用した場合に、異なるユーザ間でもその情報が流れてしまいます。
それを避けるためには、サーバーを自前で用意してセルフホスティングで利用する必要があります。

自身でこまかな検証はできてないですが、「見られても困らないメッセージを送る」というのであれば（例えば、何らかの処理待ちをしている状況で、処理が終わった時に通知を設定するという状況で、「処理終了」とだけメッセージを送るなど）、公式が提供している環境をそのまま使っても大きな問題はないかもしれません。
（不要なメッセージを受けとってしまわないよう、他と重複しなそうなトピック名にして運用、とかで）

### メッセージを送る方法の例
上にも書いていた「[GIGAZINE の記事](https://gigazine.net/news/20220404-ntfy-push-notification/)」や、それ以外にもスクリーンショット付の記事があるので、利用時の画面の様子などはそれらを見ていただくのが良さそうです。

- [無料のpub-subサービスで簡単にプッシュ通知　ntfy - Qiita](https://qiita.com/Brutus/items/3f7a17953e0c07897a6f)
- [Androidに通知を送るのにntfy.shが便利だった](https://zenn.dev/tantan_tanuki/articles/06d2b714d88df0)

以下では、公式ドキュメントに書かれた送信側の話を、少し追加で書いてみます。

#### 公式の情報
公式ドキュメントで、メッセージ送信側について書かれた部分は、以下になります。

●Sending messages - ntfy
　https://ntfy.sh/docs/publish/
![Sending messages - ntfy](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/126edb26-995c-4f7a-3571-04b148d225e3.png)

上記の画像内のタブを見ると分かるとおり、以下の事例について書かれています（仕組み的には、HTTPリクエストの POST が送信できれば OK というのがあります）。

- Command line (curl)
- ntfy CLI
- HTTP
- JavaScript
- Go
- PowerShell
- Python
- PHP

また、ドキュメントでさらにその下を見ていくと、単にテキストを送るだけでなく以下のような仕組みも利用可能なようです。

- [Message priority](https://ntfy.sh/docs/publish/#message-priority)
- [Message title](https://ntfy.sh/docs/publish/#message-title)
- [Tags & emojis 🥳 🎉](https://ntfy.sh/docs/publish/#tags-emojis)
- [Click action](https://ntfy.sh/docs/publish/#click-action)
- [Action buttons](https://ntfy.sh/docs/publish/#action-buttons)
- [Attach file from a URL](https://ntfy.sh/docs/publish/#attach-file-from-a-url)
- [E-mail publishing](https://ntfy.sh/docs/publish/#e-mail-publishing)

![Urgent notification with tags and title](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/d79dad53-6369-f0fd-c24c-6fed96251817.png)
![Notification using a click action, a user action, with an external image attachment and forwarded via email](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/5a7a31fd-71a5-ead0-f0e3-d462ba5289df.png)

上記の機能について見ていくと、例えば以下のようなことが書かれていました。

- Message priority：　 Android向けの場合、優先度設定に応じて音や振動パターンを変えることができる
- Message title： デフォルトだとトピック名を含む短い記載になる（例えば ntfy.sh/mytopic などになる）メッセージタイトルを、任意の内容にする
- Tags & emojis 🥳 🎉： 文字や記号をベースにした特定の文字列を、絵文字に変換して表示
- Click action： 通知をクリックした際に、特定の URL を開くようにする
- Action buttons： 通知内にボタンを作ることができ、そのボタンを押した時のアクションとして「Webサイトやアプリを開く」・「Android端末の場合に、ブロードキャストインテントを発行」・「HTTPリクエストを実行」といったことが設定できる
- Attach file from a URL： 外部URL を用いたファイル添付
- E-mail publishing： トピック名が sometopic の場合に ntfy-sometopic@ntfy.sh にメールを送ると通知を送ることができる

さらに公式ドキュメントの、「Publishing」の下の項目を見ていると、以下の仕組みについても書かれていました。

- [Scheduled delivery](https://ntfy.sh/docs/publish/#scheduled-delivery)
   - 通知タイミングを指定する
- [Webhooks (publish via GET)](https://ntfy.sh/docs/publish/#webhooks-publish-via-get)
   - HTTPリクエストで通知をするが、上で出てきた POSTリクエストなどでなく GETリクエストを使う
- [Publish as JSON](https://ntfy.sh/docs/publish/#publish-as-json)
   - HTTPリクエストのカスタムヘッダで通知内容を設定するのではなく、JSON で内容を設定する

![公式ドキュメントのメニュー：「Publishing」](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/dd84f12f-fffe-0e77-0205-73523624dc59.png)

なお、「[Limitations](https://ntfy.sh/docs/publish/#limitations)」という項目の部分で、通知処理関連の制約について書かれていました。
![Limitations](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/dd42cb07-e754-5db4-5bc5-c614c6347ddf.png)

## 【余談】 「ntfy」という名前の別のもの
「ntfy.sh」についてあらためて調べていたとき、2016年や2017年に書かれた「ntfy」に関する記事が複数見つかりました（たとえば以下など）。

- [linuxコマンド終了したらSlackに通知するようにする - Qiita][https://qiita.com/HikoMSP/items/8977c12e44dba78f4a39]
- [Linuxのコマンドラインやスクリプトからスマホにプッシュ通知する。（ntfyというツールの紹介） - Qiita](https://qiita.com/kojiwell/items/8b0c90d28909e50e4a6d)

しかし、「ntfy.sh」のリポジトリの情報を見ると、そんなに以前から提供されている感じでもなさそうでした。
これについて、結論から書くと「ntfy」という名前の「ntfy.sh」とは別のものに関する記事でした。ちなみに、細かな機能部分は異なるものの、通知を送る仕組みという点では共通で、こちらの「ntfy」のほうが先に出ています。

- [About ntfy — ntfy 2.7.0 documentation](https://ntfy.readthedocs.io/en/latest/)
- [dschep/ntfy: 🖥️📱🔔 A utility for sending notifications, on demand and when commands finish.](https://github.com/dschep/ntfy)

![公式（ntfy）](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/0205684f-cf60-adbb-0bdf-da6d0056c3b7.png)

![GitHub（ntfy）](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/7a7c7468-6ab3-eae8-b2f0-2dce712c20d7.png)