ラズパイ上のChromiumでファイルダウンロードが終わったらLINEに通知するアレを作ってみたver2 (DL監視機能付き)
[2020/12/3追記]ダウンロードが終わったらLINE通知する機能はできたのですが、使っている回線が細い&ベストエフォートなので、気がつくとダウンロードに失敗する事があるため、そんなときにも通知する機能を追加しました。(ver2)
そもそもの動機
ウチにはインターネット回線が2つあります。
一つがWimax、もう一つがRakuten UN-LIMIT。
Wimaxは10GB/3日の制限があるのですが、Rakutenの方は自社エリアじゃないauの回線借りしてるところでは月5GBの容量制限があるけれど、データ高速モードをオフにすると1Mbpsで延々と使える回線になります。
図. データ高速モードをオフにしたとき
なのでサイズの大きなファイルをダウンロードするときはラズパイを使ってWimaxではなく楽天の回線でのんびりとダウンロードさせています。
ところが!遅い回線でダウンロードしていると、いつ終わるのかが気になってちょくちょくダウンロードの進捗を見てしまう。気になって仕方ないのは人情だけど、それにばかり関わっても居られないので、ダウンロードが終わったら通知してくれる方法はないか?と考えていたところに、LINEに通知機能があることに気づきました。
ファイルのダウンロードが終わったらLINEに通知がくるなんてIoT生活してるじゃん!ということで作ってみました。
LINEへの通知の方法は二種類
LINEへパソコン等から通知を飛ばす方法にはLINE Notifyという物を使うのですが、LINE Notifyへ指示を出す方法が二種類あって
①LINE NotifyのAPIを直接叩く
LINE NotifyではAPIを公開していて、自分でプログラムを組んでリクエストを投げることで実現できます。ただ、これを使うには開発者アカウントが必要らしいとか、後述の外部サービスを使うほうが後々違うアレを作る時に役立つかな?と思ったので、今回はこっちはヤメにしました。
②外部サービスを使う
IFTTT、Github、Mackerelなどの"何か"と"何か"をつなぐサービスを使っても実現できます。これらのサービスは"何か"が公開しているAPIをつなぎ合わせてユーザーが簡単に新しい仕組み?サービス?要はアレなものを作れるんですね。
で、今回はIFTTT(IF This Then Thatの略らしい)で行くことにしました。
アレの全体像
ChromiumでファイルダウンロードをしてるラズパイからスマホのLINEへ通知を飛ばすための仲介役としてIFTTTがデデンと居座ります。
[ここに絵が入る予定 (まだ描いてない)]
IFTTTでは次の2つの口を設定して、ラズパイとスマホを繋げます。
①ラズパイからのリクエストを受け付けるWebhooks
②スマホのLINEへメッセージを飛ばすLINE Notify
Chromiumのファイルダウンロード状況の監視はラズパイでbashを作って監視します。Chromiumはダウンロードの最中はターゲットのファイル名に拡張子 .crdownloadがくっついた中間ファイル(?)が作られるので、ダウンロードを開始したらbashを起動し、中間ファイルを定期的にモニタ、こいつが消えたらダウンロード完了としてLINE Notifyへ通知します。
IFTTTのアカウントを作る
IFTTTに行って右上のSign upをクリックするとAppleかGoogleかFacebookのアカウントと紐付けるか、メルアドとパスワードを入力するとアカウント完成です。
LINE NotifyとIFTTTを連携して、お友達設定する
トップページの上の方にあるExploreというメニューをクリックします。
そうすると検索のボックすが出てくるのでそこにLINEと入力します。
そうすると"Services"のところにLINEの見慣れたアイコンがでくるのでそれをクリック。
そうすると↓の画面がでるので「同意して連携」をクリック
スマホのLINEでLINE Notifyを友達登録しておけばこんな通知がきます。
IFTTTでWebhooksを設定する
こんどはWebhooksです。LINEを連携させたときと同じようにExploreでWebhooksを検索します。
間髪いれずに右上のSettingsをクリックすると...
こんな画面が出てきます。ここで大切なのがURLのところのモザイクがかかっている部分、"use/"のあとの長い文字列です。こいつをコピーして、最後につくるbashの中に書いてやる必要があります。ほんとここ大事。
IFTTTでWebhooksとLINE Notifyを連携させる
あとはWebhooksとLINE Notifyを紐付けるだけです。トップメニューのCreateをクリックするとこんな画面が、、、
「+This」をクリックすると最初のstep。webhooksを検索。
「Receive a web request」というのが出てくるのでクリック
イベントに名前を付けます。今回はRaspberry_piにしました。
「Create trigger」をクリックすれば終わり。
次は「+That」のところにLINEをくっつけます。
LINEを選ぶと「Send message」というのが出てくるのでクリック。
「Recipient」で「1: 1でLINE Notifyから通知」を選ぶと、送信メッセージのフォーマットが「Message」のところに出てきます。Value1、2、3の3つを設定することができるので、後で作るbashで指定してあげます。
「Create action」を押すとWebhooksとLINEをくっつけられます。最後にFinishを押せば完了
bashでファイル監視
適当に名前をつけたファイル(今回はDLChecker.sh)をChromiumのダウンロードディレクトリ"Downloads"に作り、↓を書いて保存します。
#!/bin/bash
echo "Now Checking..."
while [ ture ]; do
if [ -e *.crdownload ]; then
sleep 1m
else
break
fi
done
URL="https://maker.ifttt.com/trigger"
EVENTNAME="Raspberry_pi"
YOUR_KEY="ここにWebhooksのURLの〜〜/use/以降の文字列を書く"
WEBHOOKSURL="${URL}/${EVENTNAME}/with/key/${YOUR_KEY}"
curl -X POST -H "Content-Type: application/json" -d \
'{"value1":"ラズパイからのお便り","value2":"ダウンロード完了したよ","value3":"おわり"}' \
${WEBHOOKSURL}
echo
exit 0
仕組みは単純、while文ぶん回して、testコマンド(簡略型の[ ]でくくったとこ)で"*.crdownload"が居たら1分スリープしてまたやり直す。要は1分間隔でチェックするわけですね。そうでない(*.crdownloadが無い→ダウンロード完了)ならbreakでwhile文を脱出して、IFTTTのRaspberry_piイベントへ「ラズパイからのお便り ダウンロード完了したよ おわり」のメッセージをcurlでポストして終わり。
ちなみにラズパイにcurlが入ってなかったら
エラーメッセージが出るので、そのときはcurlをインスコしてくだしあ。
$sudo apt install curl
できました
ネットワークエラーが起きてもわからない
冒頭にも書きましたが、ダウンロードに使ってる楽天モバイルの低速モードはベストエフォート型のため、夕方ころに速度が落ちることがあったり、何らかの問題がネットワークで起こるとダウンロード失敗となり気づかないままになることがあります。
そこでダウンロードの中間ファイル(?)のサイズを監視して、サイズが変わらないままなら何か起こっていることを通知することにしました。
中間ファイルの名前 *.crdownloadの"*"部分を毎回指定するのもアレなので
1, *.crdownloadのファイル名を取得
2, そのファイル名からファイルサイズを取得
3, 前回取得したファイルサイズと比較
4, ファイルサイズが大きくなってなければ「ネットワークエラー発生」の通知
普通にls、grepやwcコマンドの戻り値を変数に代入する方法で作ったのですが、もっと小粋なやり方があったら教えて下さい。
あと頻繁にチェックしにいっても細い回線が切れかけでも止まるわけじゃない状況を考慮して、チェック間隔を1分から3分に伸ばしました。
DLChecker ver2 (DL監視機能付き)
#!/bin/bash
MSG1="ラズパイからのお便り"
MSG3="おわり"
SIZE2=0
FILE_NAME=$(ls | grep *.crdownload)
echo $FILE_NAME
echo "Now Checking..."
while [ ture ]; do
if [ -e "$FILE_NAME" ]; then
SIZE1=$(wc -c < "$FILE_NAME")
if [ $SIZE1 -gt $SIZE2 ]; then
SIZE2=$SIZE1
sleep 3m
else
MSG2="ネットワークエラー発生"
break
fi
else
MSG2="ダウンロード完了したよ"
break
fi
done
URL="https://maker.ifttt.com/trigger"
EVENTNAME="Raspberry_pi"
YOUR_KEY="ここにWebhooksのURLの〜〜/use/以降の文字列を書く"
WEBHOOKSURL="${URL}/${EVENTNAME}/with/key/${YOUR_KEY}"
curl -X POST -H "Content-Type: application/json" -d \
'{"value1":"'$MSG1'","value2":"'$MSG2'","value3":"'$MSG3'"}' \
${WEBHOOKSURL}
echo
exit 0
これをそのままファイルにしても動きませんw YOUR_KEYのところはWebhooksの文字列を入れてくださいね。