popoponnponpopo’s blog

無料で「1分間隔でサイトの変更を監視し、変更されたらメール通知」する

 そういうことをやってくれるサービスはありましたが軽く探したら無料なら大体「30分間隔」とかで1分とか5分とかでやってくれるものがありませんでした(軽く探しただけです)。有料のは使いたくないのでググったらやり方分かったので手短に方法論を書き記します。
 また、今回はサイトの変更を監視するだけですが、一定間隔でスクリプトを発動してくれる便利なツールってのが本筋なので、他にもいろいろやりようがあります。
 あと留意事項として、「ここに書いた内容が合ってるか分かりません」。確かめてません。知恵袋で質問してもなんかめんどうだし。なんか人生辛いので。

 

■使う物

 

■概説

  • Google Apps Script」という、無料で時間指定でスクリプトを動かしてくれるGoogleドライブ上のアプリを使い1分おきに「サイトの変更情報を監視するスクリプト」を発動させます。
  • それを発動させる場所として「Google スプレッドシート」というGoogleドライブ上のアプリを使います(それの上で発動させれば1分前の値を保存しておくことができ、「変化したか」の判定に使えるのでそうしてます)

 

■詳説

まずGoogleスプレッドシートを作る

  1. グーグルドライブにアクセスします(登録してなかったらしてください)
  2. 何もないところを右クリック > 「Google スプレッドシート」を選択します(すると勝手に開きます)
  3. (好みでシートのタイトルを変えます。左上の「無題のスプレッドシート」ってところをクリックして名前を適当に自分好みなのに変えます)
  4. 完了



次にGoogleスプレッドシート上にGoogle Apps Scriptをなんか作る

  1. 開いてるスプレッドシートのメニューっぽい所の中から「ツール」をクリック
  2. その中の「スクリプトエディタ」をクリック
  3. するとGoogle Apps Scriptを編集する画面が出てきます
  4. 完了

ちなみにGoogle Apps Scriptはわざわざスプレッドシート上にこうやって作らなくても、スプレッドシートを作った時みたいにグーグルドライブの何もないところを右クリックして「その他」とかの項目を探したらあるんでそれ選べば作れます(無い場合はそこらへんでなんか「アプリを追加」って項目の中にあるので探して選択すれば選べるようになる)。わざわざスプレッドシート上に作ったのは、上にも書きましたが値を一時的に保存できるからです(というか素のGoogle Apps Scriptで値を一時的に保存しておく方法を見つけられなかった。保存できるならわざわざスプレッドシート作らない)


次にそれ用のスクリプトを準備する(以下のソースをコピペし、最上部3つの変数の値だけ入れ替えるだけでいいようにしてます)

//↓直下の3つの値だけ埋めてくれれば良いです
var targetName="google王国";                //監視したいサイト名
var targetUrl="https://www.google.co.jp";   //監視したいサイトのURL
var mailAddress="fuckme@fuckmail.com";      //通知を送りたいメールアドレス

//メイン
function detectChange(){ 
  //ゲット
  //シート情報
  var spreadSheet = SpreadsheetApp.getActiveSpreadsheet(); //スプレッドシート
  var sheet = spreadSheet.getActiveSheet();                //現在のスプレッドシート
  var cell = sheet.getRange("A1");                         //最終更新日時を保存するセル
  var last = cell.getValue();                              //前回の最終更新日時
  //urlの先の情報
  var response = UrlFetchApp.fetch(targetUrl);             //httpレスポンス
  var now = response.getHeaders()["Last-Modified"];        //最終更新日時
  
  //監視・通知処理  
  if(last != now){  //最終更新日時が更新されたら
    mailMe();             //メールで通知
    cell.setValue(now);   //セルの最終更新日時の値を更新
  }
}

//メールを送る
function mailMe(){
  MailApp.sendEmail(
    mailAddress,                     //宛先
    targetName+"のサイト更新通知",     //タイトル
    targetUrl                        //url
  );  
}


最後にスクリプトを発動させる時間の設定等をする

  1. まず設定も兼ねてるテスト実行を一度します。プログラム編集画面の左上の方にある実行ボタン(三角形のボタン。テストで実行できるボタン)を押します(押せなかったらその右側の「関数を選択」を押して「detectChange」を押せばその関数がメインとして発動できるようになりますのでそうしてください)。するとスプレッドシートに最終更新日が書き込まれてメールが来ます。今このスプレッドシートに書き込まれた文字列を基準に「これと比べて変化が無いか?」を毎回調べさせるように以下で設定します。
  2. 次に発動する時間感覚をついに設定します。プログラム編集画面の左上の方にあるトリガーボタン(時計のマーク)をクリックし、"トリガーが設定されていませんなんたら"みたいな文字列をクリックし、「実行」を"detectChange"に設定、「イベント」を"時間主導型"に設定、「時タイマー」を"分タイマー"に設定、最後の欄を"1分ごと"に設定、そして左下にでている「保存」ボタンを押し、時間間隔設定の操作は完了です。
  3. 完了です。後はスクリプトとかスプレッドシートとかをctrl + sとかで適当になんか保存すれば良いんだと思います。無責任ですがなんかもうよくわかりません(人生が辛い)。
  4. 人生の終わり



■感想文

  • 他のサイトのコンテンツのトピックを具体的にしただけです。焼き増しです。
  • ちゃんと動くかは分かりません。書いた人間はゴミなので。生半可な知識で「これで動くのかな?」って自力で考えて他人に確認しないので。よかったら間違ってたら教えてください。
  • あくまでも「Last-Modifiedの値とhtml自体」を1分前の値と比較してるだけなので、半角スペースが一個増えただけでもメールが来ます。たぶん。事細かに編集かけてるページならば普通に1分毎にメールが来てうざいです。どんだけ細かい更新してんだよ。
  • 仮想通貨で勝ちパターン見つけたと思って9連勝したのですが4連敗して人生辛いです。勝ちパターンかと思ったら違ったかもと思うと不安でやれません。いや、不安は随時取り除きます。それしかありません。今のところ、元金からマイナス20%くらいの状態から、元金からプラス20%くらいまで利益出せました。3000万目指してますので僕は4連続の負けは次回に活かすしかありません。ちなみに3千万行ったらお世話になった人にお金をばらまきます。僕の人生が偶然勝ったののお礼です。負けたら何もできません。昨日までは本当に行けるのではないかと思うレベルの勝ち率でしたが、今日4連敗したんで、なんか3000万行く自信なくなりました。どうなるのか不明瞭で不安です。寝ます


 なおいろいろやって気づきましたが、サイトによっては「こういうツールで更新を悟られないようにするために、常に自動的にツールでhtmlの一部のどうでもいいところ乱数みたいな感じで更新して常に変化させるようにする」ということをしているサイトがあるのかな?と気づきました。binanceとか。そういうところを監視すると常に通知がきますが、一般サイトならそういうことしてないと思うので使えると思いますたぶん。ですが僕が本来したかったのはbinanceのサイトの変化を監視することだったのでこの方法じゃ駄目なようです。
 でも変化したかの判定を「last-modifiedの1分前と見比べる」でなく「html自体を(その乱数で刻々と変わる極一部をスルーして)1分前と見比べる」にすればできると思います。ですがbinanceはそれも見越してそうで、もしこれも駄目だったら「うわああああああああああ」ってなるので次回の勉強として捉えておいて終わります。

 あとこれ今1分にしてますが、5分も選べますし、たしか10分も選べますし、「1分毎にアクセスしに行くと向こうのサーバーの処理が増えてかわいそうだ」という方は1分はやめてあげたほうがいいかもしれない。サイト見に行くのが自分のIPアドレスで行くんじゃないからたぶんBANはされないけど、1分毎に監視してくるアクセスがあったら拒否されるかも。されないかな。わからない。でも1分はちょっと調子乗ってるかもしれない。binanceなのでいいかなと思って1分という時間で書いたけど、普通の用途なら30分とか1時間とかでもいいと思う。