前々からRSSをもとにデータ収集をすることが多かったんだけど、今回、jsonを使いだしてみました。
・・・・便利!!
直観的にわかってすごくわかりやすいと感じた。前まではただただ見づらいだけだったのに・・・・自分の中でどういう変化があったのだろうか。今までのコードもjsonから取得するようにコードを書き直そうかなと思っています。
これっていつ更新されているの?ってのがわからないので、スクリプトを組んで確認してみようかなと思ってなんとなくできそうだったからやってみました。
知りたいこと
これを調べる目的でスクリプト組んでいます。
どうやって調べるか?
この流れで確認しようと思います。
最初はRubyでちゃんとやろうと思ったんだけど、まぁ・・・自分用だし・・・・とりあえずわかればいいし・・・・ってことで、思いついたままのbashでやってみました。
先にコードを記載
作成したシェルは2つ。
chk_json.sh:jsonファイルを比較する
一つ目は、chk_json.sh
という名前で、2つのjsonを比較するスクリプトです。
#!/bin/sh GET_FILE="json" DIFF_FILE="latest.json" ITUNES_URL="https://itunes.apple.com/jp/rss/topsongs/limit=200/genre=29/json" wget -q ${ITUNES_URL} date diff -qs ${GET_FILE} ${DIFF_FILE} mv ${GET_FILE} latest.json
ファイル名とかコードにべた書きwww適当すぎるwwww
簡単に説明すると、wgetでjsonファイルを落としてきています。-q
を付けると標準出力がなくてすっきりするのでつけています。
そしてそのあと、何時なのかがわかるようにdateコマンドを入れて、diffコマンドで確認。diffのオプションとして-qs
を付けると、詳細結果は出さずに、違いがあったかないかだけ出力されます。
そして最後に、今回取ってきたファイルを次回の比較対象にできるようにファイル名をリネームしておしまい。
このシェル単体を実施するとこんな感じで表示されます。
$ ./chk_json.sh 2016年 11月 10日 木曜日 21:09:50 JST ファイルjsonとlatest.jsonは同一
slack_post.sh:slackに通知する
そして2つめのシェルは、slackに投稿するシェルのslack_post.sh 。
これは、以下のサイト様から流用させてもらっています。もう、そのまま過ぎて申し訳ないです。このスクリプト、かなり重宝しています。
#!/bin/sh set -eu #Incoming WebHooksのURL WEBHOOKURL="WebHooksのURLを入れてね" usage_exit() { echo "Usage: $0 [-m message] [-c channel] [-i icon] [-n botname]" 1>&2 exit 0 } while getopts c:i:n:m: opts do case $opts in c) CHANNEL=$OPTARG ;; i) FACEICON=$OPTARG ;; n) BOTNAME=$OPTARG ;; m) MESSAGE=$OPTARG"\n" ;; \?) usage_exit ;; esac done #slack 送信チャンネル CHANNEL=${CHANNEL:-"#random"} #slack 送信名 BOTNAME=${BOTNAME:-"RSSチェックしてるよbot"} #slack アイコン FACEICON=${FACEICON:-":robot_face:"} #見出しとなるようなメッセージ MESSAGE=${MESSAGE:-""} MESSAGEFILE=/tmp/webhooks FLG="0" if [ -p /dev/stdin ] ; then #改行コードをslack用に変換 cat - | tr '\n' '\\' | sed 's/\\/\\n/g' > ${MESSAGEFILE} else echo "nothing stdin" FLG="1" # exit 1 fi if [ ${FLG} = "0" ] ; then WEBMESSAGE=${MESSAGE}'```'`cat ${MESSAGEFILE}`'```' else WEBMESSAGE=${MESSAGE} fi #Incoming WebHooks送信 curl -s -S -X POST --data-urlencode "payload={\"channel\": \"${CHANNEL}\", \"username\": \"${BOTNAME}\", \"icon_emoji\": \"${FACEICON}\", \"text\": \"${WEBMESSAGE}\" }" ${WEBHOOKURL} >/dev/null
詳しい解説などはこのコードのおおもとになっている方が詳しく書かれているのでそちらを見てもらうほうがいいかと思います。
これをcronで定期実行
そしてこれを定期的に実行するようにcronに登録します。
10 * * * * cd /path/app ; ./chk_json.sh | ./slack_post.sh
毎時10分になったら実行するようにします。
最初に実行したシェルchk_json.sh
の標準出力の結果をslackに通知する感じです。
こうしておくと定期的に以下のように通知が来ます。
これで完了。
どうなることやら
かなり適当に作っているので、正直なところちゃんと判別してくれているのかの不安があります。
その辺は動かしながらちょっと様子を見ようと思います。
しかし久しぶりにシェル書いたわ。書いたっていうほどのこともなく、コマンドを並べただけだけどwww
このスクリプトたちを作るのにかかった時間よりこのブログを書いている時間のほうが長いと思います・・・・・・
近いうちにこれ、ちゃんとentryを比較してそこで差分がないかどうかを判別して通知するようにRubyで書き直そう。
それではー。
※※ 11/13 追記 ※※
1日分ですが集計結果を書きました。