概要
なんでもシェルスクリプトでやってしまいたい人です。
今回は人気漫画「ワンパンマン」の最新話が更新されるとLINE通知を送るという、
結構実用的な処理をシェルスクリプトでやっちゃいます。
カラクリ
■最新話が更新されているかの判定
これが一番大事。結論から言うと、
htmlのソース中の「次の話を読む」という文字列があるかどうかを見る
です。
あのサイトでは、次の話がある/ないで以下の挙動を示すのだ。
- 次の話がある→漫画のページの最後に「次の話を読む」ボタンが表示される。
- 次の話がない→漫画のページの最後に「次の話を読む」ボタンは表示されない。
この性質を利用してやろうということだ。つまり、
これまで最新話だったページのhtmlソースに対し'次の話を読む'という文字列に対してgrepをかけてやり、
ひっかかれば最新話が更新されている
ということだ。
この判定処理を、数分おきとか定期的に行えば良い。
■最新話が更新されていたら、LINEのAPIを使って通知を送る
LINEには、POSTで叩くとLINE通知を送れるようなAPIが用意されているのでこいつを利用する。
メッセージ内容はPOSTパラメータとして渡せる。
このAPIの具体的な使用方法に関しては、こちらの記事などを参考にすると良い。
もう少し具体的に
上記アイデアを実現するために、具体的には以下のようなシステムを構築する。
以下で、実際にこのシステムを構築していく。
シェルスクリプトのソースコード
シェルスクリプトのコードは以下の通り。
#!/bin/sh
urlfile=$(dirname $0)/latest.txt # 最新話のURLが貼ってあるテキストファイル
html=$(mktemp) # tmpファイル作成
# 最新話のhtmlを取得
# curl -s:余計な出力はしない
cat ${urlfile} | xargs -I{} curl -s {} > ${html}
# 次の話が追加されたかをチェック
cat ${html} | grep '次の話を読む' > /dev/null 2>&1
# 次の話が追加されている場合の処理
if [ "$?" = "0" ]; then
# latest.txtの更新
cat ${html} |
grep '次の話を読む' |
sed -e 's/>/\n/g' -e 's/</\n/g' -e 's/href=/\n/g' |
grep '次の話を読む' -B1 |
grep 'https:' > ${urlfile}
url=$(cat ${urlfile}) # 最新話のURL
# LINE通知
curl -X POST -H 'Authorization: 認証情報' -F "message=
最新話が更新されました
${url}" https://notify-api.line.me/api/notify > /dev/null 2>&1
fi
rm ${html}
※実際に使用する際は、以下のコマンドで実行権限を与えておく。
chmod +x newepisode.sh
latest.txtを用意する
現在の最新話のページのURLを張り付けたテキストファイル(ファイル名:latest.txt)を、
上のシェルスクリプトと同じディレクトリに配置する。
crontabの設定
1分おきに上のシェルスクリプトを実行する。
* * * * * スクリプトを配置しているディレクトリのフルパス/newepisode.sh