見出し画像

ラズパイ上のChromiumでファイルダウンロードが終わったらLINEに通知するアレを作ってみたver2 (DL監視機能付き)

[2020/12/3追記]ダウンロードが終わったらLINE通知する機能はできたのですが、使っている回線が細い&ベストエフォートなので、気がつくとダウンロードに失敗する事があるため、そんなときにも通知する機能を追加しました。(ver2)

そもそもの動機

ウチにはインターネット回線が2つあります。
一つがWimax、もう一つがRakuten UN-LIMIT。
Wimaxは10GB/3日の制限があるのですが、Rakutenの方は自社エリアじゃないauの回線借りしてるところでは月5GBの容量制限があるけれど、データ高速モードをオフにすると1Mbpsで延々と使える回線になります。

スクリーンショット_2020-10-09_17_33_19

図. データ高速モードをオフにしたとき

なのでサイズの大きなファイルをダウンロードするときはラズパイを使って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と入力します。

スクリーンショット 2020-10-09 22.22.58

そうすると"Services"のところにLINEの見慣れたアイコンがでくるのでそれをクリック。

スクリーンショット 2020-10-09 22.24.27

そうすると↓の画面がでるので「同意して連携」をクリック

スクリーンショット 2020-08-30 20.40.30

スマホのLINEでLINE Notifyを友達登録しておけばこんな通知がきます。

画像6

IFTTTでWebhooksを設定する

こんどはWebhooksです。LINEを連携させたときと同じようにExploreでWebhooksを検索します。

スクリーンショット 2020-09-02 21.07.58

間髪いれずに右上のSettingsをクリックすると...

スクリーンショット_2020-09-02_21_08_59

こんな画面が出てきます。ここで大切なのがURLのところのモザイクがかかっている部分、"use/"のあとの長い文字列です。こいつをコピーして、最後につくるbashの中に書いてやる必要があります。ほんとここ大事。

IFTTTでWebhooksとLINE Notifyを連携させる

あとはWebhooksとLINE Notifyを紐付けるだけです。トップメニューのCreateをクリックするとこんな画面が、、、

スクリーンショット 2020-09-02 21.11.25

「+This」をクリックすると最初のstep。webhooksを検索。

スクリーンショット 2020-09-02 21.11.51

「Receive a web request」というのが出てくるのでクリック

スクリーンショット 2020-09-02 21.12.31

イベントに名前を付けます。今回はRaspberry_piにしました。

スクリーンショット 2020-09-02 21.13.08

「Create trigger」をクリックすれば終わり。

スクリーンショット 2020-09-02 21.13.39

次は「+That」のところにLINEをくっつけます。

スクリーンショット 2020-09-02 21.14.04

LINEを選ぶと「Send message」というのが出てくるのでクリック。

スクリーンショット 2020-09-02 21.14.23

「Recipient」で「1: 1でLINE Notifyから通知」を選ぶと、送信メッセージのフォーマットが「Message」のところに出てきます。Value1、2、3の3つを設定することができるので、後で作るbashで指定してあげます。

スクリーンショット 2020-09-02 21.15.18

「Create action」を押すとWebhooksとLINEをくっつけられます。最後にFinishを押せば完了

画像17

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

できました

画像2

ネットワークエラーが起きてもわからない

冒頭にも書きましたが、ダウンロードに使ってる楽天モバイルの低速モードはベストエフォート型のため、夕方ころに速度が落ちることがあったり、何らかの問題がネットワークで起こるとダウンロード失敗となり気づかないままになることがあります。
そこでダウンロードの中間ファイル(?)のサイズを監視して、サイズが変わらないままなら何か起こっていることを通知することにしました。
中間ファイルの名前 *.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の文字列を入れてくださいね。

いいなと思ったら応援しよう!