/var/www/yatta47.log

/var/www/yatta47.log

やったのログ置場です。スクラップみたいな短編が多いかと。

iTunesのjson更新タイミングを調べようと思ってスクリプトを組んだ。

前々からRSSをもとにデータ収集をすることが多かったんだけど、今回、jsonを使いだしてみました。

・・・・便利!!

直観的にわかってすごくわかりやすいと感じた。前まではただただ見づらいだけだったのに・・・・自分の中でどういう変化があったのだろうか。今までのコードもjsonから取得するようにコードを書き直そうかなと思っています。

今日の本題は、それではなく、iTunesjson

これっていつ更新されているの?ってのがわからないので、スクリプトを組んで確認してみようかなと思ってなんとなくできそうだったからやってみました。

 

知りたいこと

iTunesjsonが更新されるタイミング。

これを調べる目的でスクリプト組んでいます。

 

どうやって調べるか?

  1. iTunesjsonを取得する
  2. 前回のjsonと比較する
  3. その結果をslackに通知する

この流れで確認しようと思います。

最初は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

簡単に説明すると、wgetjsonファイルを落としてきています。-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 。

これは、以下のサイト様から流用させてもらっています。もう、そのまま過ぎて申し訳ないです。このスクリプト、かなり重宝しています。

qiita.com

#!/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に通知する感じです。

 

こうしておくと定期的に以下のように通知が来ます。

f:id:yatta47:20161110211537p:plain

これで完了。

 

どうなることやら

かなり適当に作っているので、正直なところちゃんと判別してくれているのかの不安があります。

その辺は動かしながらちょっと様子を見ようと思います。

しかし久しぶりにシェル書いたわ。書いたっていうほどのこともなく、コマンドを並べただけだけどwww

このスクリプトたちを作るのにかかった時間よりこのブログを書いている時間のほうが長いと思います・・・・・・

近いうちにこれ、ちゃんとentryを比較してそこで差分がないかどうかを判別して通知するようにRubyで書き直そう。

それではー。

※※ 11/13 追記 ※※

1日分ですが集計結果を書きました。

yatta47.hateblo.jp