LINE Notify互換のボットを作ったお話
この記事は
2025年3月にサービスが終了する、LINE Notifyに代わるボットを作成しました。そのボットの構築についての記事です。
LINE Notifyとは
LINE Notifyは、外部のサービスからLINEに通知を送ることができるサービスです。LINE Notifyを使うことで、LINEのトーク画面に通知を送ることができます。
登録時に取得した固定の認証ヘッダをHTTPヘッダに設定してエンドポイントに対してPOSTリクエストを送信することで、通知を送ることができるというお手軽さから、多くのサービスやツールで利用されていました。
LINE Notifyの終了
そんなLINE Notifyですが、2025年3月に終了するというアナウンスがありました。
私も各種ハンズオンだけではなく、家族向けのLINE Notifyを使ったサービスを作成していたので、このアナウンスを受けて代替手段を探すことにしました。
自分の用途のためだけにLINE Messaging APIでボットを作るのでも良かったのですが、せっかくなので色々なところで使えるように、LINE Notify互換のボットを作成してみることにしました。
リポジトリ
リポジトリは以下になります。
実装方針
作成するに当たって、以下のように実装方針を定めました。
- LINE NotifyのAPIと同じように、HTTPヘッダに認証トークンを設定してPOSTリクエストを送信することで通知を送ることができるようにする
- LINE Notifyと同じように、所属したグループに送信できるようにする
- Messaging APIのメッセージ数の上限を考慮し、複数のLINE Notifyを1つのボットに相乗りはしないようにする
- サーバレスで作成し、サーバの運用コストを抑える
- Azure/AWSいずれでも動くようにする
- マルチクラウド対応を意識し、環境依存部分をDIで切り替えられるようにレイヤードアーキテクチャを意識する
- IaCでインフラを準備できるようにし、導入手順を簡単にする
技術スタック
以下のような技術スタックを使っています。
- 実装言語: Typescript
- Testing Framework: Jest
- DI Container: tsyringe
- SDK: LINE Messaging API SDK for nodejs
- ランタイム: Azure Functions / AWS Lambda
- アップロード画像保存先: Azure Blob Storage / S3
- グループ情報保存先: Azure Table Storage / DynamoDB
- IaC: bicep / CDK
- CI/CDパイプライン: GitHub Actions
実装にはTypescriptを使いました。LINE Messaging APIのSDKがあり、Azure Functions/AWS Lambdaいずれでもランタイムが提供されており、個人プロダクトでJavaScriptに触る機会が多かったので短期間で実装が可能そうということでの選択です。
デプロイ方法
詳細はREADMEをご覧下さい。
AWSにデプロイする場合はクラウドシェル上で
$ git clone https://github.com/kenichiro-kimura/line-notify-messenger.git
$ export LINE_CHANNEL_ACCESS_TOKEN="xxxx"
$ export AUTHORIZATION_TOKEN="xxxx"
$ export SEND_MODE="group"
$ cd line-notify-messenger
$ npm install
$ npm run build
$ npm run deploy
でいけます。
Azureにデプロイする場合は を押してインフラを構築します。
リポジトリをforkし、READMEに従って発行プロファイルをリポジトリのシークレットに、関数名をリポジトリの変数に設定してください。そしてGitHub上で「Build and deploy Node.js project to Azure Function App」アクション(deploy-to-azure.yml
)を実行することでデプロイできます。
ワークフローの実行方法はGitHubの公式ドキュメントを参照して下さい。
使い方
詳細はREADMEに記載してますが、既存のLINE Notifyを使っているプロジェクトを移行する場合は、以下の手順で移行できます。
- LINE公式アカウントを作成し、LINE Messaging APIを使えるようにする
- このプロジェクトをデプロイし、LINE Messaging APIのチャンネルアクセストーク/LINE Notifyの認証ヘッダ/送信モード(broadcast/group/all)を環境変数に設定する
- LINE公式アカウントを、既存のLINE Notifyを受信しているグループに招待する
- 既存のLINE Notifyを使っているプロジェクトの送信先エンドポイントを変更する
IFTTTのインテグレーションとかSORACOM Lagoonの通知で使っててエンドポイントがサービス側で固定になってるから変更できない場合は...呼び出し部分は頑張って自作するしかなさそうです。
formのPOSTじゃなくてWebhookで呼べるモードも作ると皆さん対応しやすかったりするのであれば、対応案についてIssueを作っていただいたら実装を検討します。
まとめ
LINE Notifyがサービス終了するにあたり、移行先を検討されている方は多いかと思います。
私も手元のプロジェクトを移行しないといけないのですが、移行に当たり、呼び出し元のプログラムの修正や運用が最小限になるように、LINE Notify互換のボットを作成しました。
短期間での実装でしたが、レイヤードアーキテクチャを意識した実装でマルチクラウドにも対応しており、今後の拡張もしやすい構成になっています。
もしバグを見つけた/ドキュメントを改善した/Google Cloudでも動かしてみた...といった方がいらっしゃいましたら是非Issueを作ったりpull requestを送っていただければと思います。
皆様の参考になれば幸いです。
Discussion
2025/3/24現在、cloudflare(workers + KV + R2)にも対応しています