EPGStationでのエラー通知をLine Messaging APIで送る

以前にEPGStationを使用した環境で録画失敗時にLineNotifyを通じてエラーを送る方法を以前に記事にしました。

しかし、利用している人は気が付いたと思いますが、LineNotifyは25年3月末でのサービス終了との通達が最近ありました。古いAPIを残すのはセキュリティ的にもコスト的にも厳しいところがあったのでしょう。

2025年3月31日をもって、LINE Notifyのサービスを終了します
https://developers.line.biz/ja/news/2024/10/07/line-notify-will-be-discontinued

というわけで代替方法を検索してみると、Line Messaging APIが代替候補とのことです。というわけでLineMessaging APIを使ってみましょう。

目次



Line NotifyとMessagingAPI

Line Notifyとの違いは

  • 無料アカウントでは200通/月という送信数に制限がある
  • 公式アカウントがLine Notifyの代わりになる
  • 少しだけ送信のフォーマットが変わる

ぐらいです。EPGStationで録画失敗のコマンドを送るぐらいなら十分でしょう。アクセストークンを使って送信する点や、curlで送れるという点は何も変わっていないので比較的気軽に使えることは間違いないです。

Line登録関係はこのサイトが非常にわかりやすいので、そちらにお任せします。

Qiita - LINE Notifyがサービス終了するので、LINE公式アカウントに置き換える
https://qiita.com/jksoft/items/4d57a9282a56c38d0a9c

指示に従って公式アカウントを作成&友達追加して、その後アクセストークンを取得しましょう。アクセストークンを使ってcurlでメッセージが送れます。コマンドの詳細はこちらのリファレンスにあります。

Line Developer- メッセージを送信する
https://developers.line.biz/ja/docs/messaging-api/sending-messages

Line Messaging APIを使ってメッセージを送信

以下のようなコマンドで送ることができます。

curl -X POST https://api.line.me/v2/bot/message/broadcast -H 'Content-Type: application/json' -H 'Authorization: Bearer ACCESS_TOKEN' -d '{"messages":[{"type":"text","text":"Hello, world"}]}'

これはbroadcastで送っているので、作成した公式アカウントから友達全員に送る方法になっています。登録者が自分ひとりならこれが一番楽ですね。

これを前の記事のような感じでシェルスクリプトを作成してもよいですし、自分で触る方はjsファイルを作って使ってもよいでしょう。今回はjsファイルを作って使う方法を紹介します。

以下のようなファイルを作成します。名前は好きな名前で大丈夫です。例: test.js

const ACCESS_TOKEN="ここにトークンを記入"

function LineMsgAPI(TOKEN,MSG){

const execSync = require('child_process').execSync;
let curl ='curl -X POST https://api.line.me/v2/bot/message/broadcast -H \'Content-Type: application/json\' -H \'Authorization: Bearer '
curl =curl + TOKEN +'\' -d \'{\"messages\":[{\"type\":\"text\",\"text\":\"'+ MSG + '\"}]}\'';
console.log(curl);
const out = execSync(curl);
}

const main = async () => {
await LineMsgAPI(ACCESS_TOKEN,process.argv[2]);
}

main();

これに引数をつけて実行するとメッセージを送ることができます。試しに、「test」と送ってみます。

node test.js test

これで作成した公式アカウントにtestと送られてくれば問題ありません。ちなみに、改行する場合は以下のように改行箇所で/nをした文字列をダブルクォーテーション(")で囲むと可能です。

node test.js "test\nline break"
実際に送ってみた

ダブルクォーテーションで囲まないと真ん中のように「n」が入った謎の文章になってしまうので注意です。



EPGStationで使う

次に、EPGStationに登録してみましょう。コマンドを使用する部分で、以下のように設定します。EPGstation/config/test.jsの位置にjsファイルを置いています。以下は保存領域がいっぱいになった際のコマンドを想定しています。

recorded:
    - name: encode
      path: '/hoge/hoge'
      limitThreshold: 100000
      action: 'none'
      limitCmd: '%NODE% %ROOT%/config/NotifyLine.js エンコード用ドライブの容量が一杯です。確認してください。'

こんな感じで日本語を入れても動かせます。

これで好きなようにLINEに対して通知をEPGStaionから送ることができるようになりました。1か月200通までなのでそこまで大量に送ることはできませんが、便利に使えることは間違いないでしょう。

私は録画ドライブがいっぱいだったとき、録画失敗時、join_logo_scpのロゴファイルがなかったときなどに通知を送るようにしています。ここらへんを設定しておくと異常時にすぐ気づけるので非常に便利です。

番組名など環境変数を使いたい場合

通知に番組名を出したいといったような場合もあるかと思います。その際はepgstationでコマンドを実行時に渡される環境変数を使います。詳細マニュアルによると、NAMEで番組名、CHANNELNAMEで放送局名が与えられる場合などがあるようです。ここら辺は実行するコマンドによって変数が置換されるのか、環境変数が渡されるかが異なるので、マニュアルをよく確認しましょう。

処理の都合のようですが、引数として変数や環境変数を渡すのは難しい仕様となっているので、その際は面倒ですが、ファイルを作りなおさないといけません。加えて、シェルスクリプトだと環境変数を使うのが難しいので、javascriptで書くのが良いかと思います。以下に上述のファイルを変更して、環境変数を使ってファイル名と放送局を送信するjsファイルを記述してみました。

const ACCESS_TOKEN="トークンをここに書く"
const title_name=process.env.NAME
const channel_name=process.env.CHANNELNAME

function LineMsgAPI(TOKEN,MSG){

const SendMSG= MSG + '\\n\\n【番組】 '+ title_name +'\\n\\n【放送局】 '+ channel_name ;
const execSync = require('child_process').execSync;
let curl ='curl -X POST https://api.line.me/v2/bot/message/broadcast -H \'Content-Type: application/json\' -H \'Authorization: Bearer '
curl =curl + TOKEN +'\' -d \'{\"messages\":[{\"type\":\"text\",\"text\":\"'+ SendMSG + '\"}]}\'';
console.log(curl);
const out = execSync(curl);
}

const main = async () => {
await LineMsgAPI(ACCESS_TOKEN,process.argv[2]);
}

main();

先ほどと同じように実行すると任意の文字列の後に番組名と放送局が付加されて送信されるようにしました。具体的には以下の画像のような感じになります。

このソースコードでの変更点は文字列の処理を変えているのはありますが、以下の2行がメイン。

const title_name=process.env.NAME
const channel_name=process.env.CHANNELNAME

これによって渡された環境変数を取り出してconstに格納しています。同じような書き方をすれば他の環境変数も使えるので、ひな形と思っていただければと思います。

まとめ

この記事ではLineNotifyのサービス終了に合わせて、Notifyとの比較やLineMessagingAPIを使って任意の文字列の送信する方法を紹介しました。また、EPGStationでの連携の方法・サンプルの紹介、環境変数の使い方などEPGStaionで使う上で任意で必要な部分も併せて紹介しました。

送信数の上限ができたのは残念ですが、月200通ならほかの開発をしているとかでない限り十分かと思います。それ以上に使うなら有料で使ってもよいと思いますし、Discordのような別のツールで作るのもありかもしれません。

送信できるメッセージについては、筆者は番組名と放送局さえ使えれば十分なので困っていませんが、ほとんどの人もそうではないでしょうか。なので、今回の記事を読んでコードをひな形にして改造すれば簡単に思ったようなメッセージを送れるようになると思います。

以上です。お読みいただきありがとうございました。



投稿日:
カテゴリー: DTVLinux

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です