#モチベーション
2020年一番お世話になったGASを利用したWebモニター・Webチェッカーです.
Webページの更新を毎週見に行くのが苦痛だったので作りました.
同様のサービスは色々ありますが,広告が入ってたり,PCしか対応していなかったり,追加削除にはホームページに行く必要があったり,だったらGoogle Apps Script(GAS)で作ろうということにしました.
GASなら数十行でGmailをUIとしたWebチェッカーが作れます!
###仕様
このプログラムはスターされたメールに含まれるURLの更新を定期的に確認します.
Gmail側のスターを解除すると更新確認もやめます.
UIはGmail.Gmailが使えればURLの追加や削除ができるのでPC,スマホ,iPhoneでも使えます.
自分自身ににURLの入ったをメールしてスターしておくことで特定のURLに対してもWebチェッカーとして利用できます.
#プログラム
//プログラムを動作させるために15分に1回実行などの設定を行ってください
var myEmailAddress = 'メール@address.com'
//本体
function webMonitor() {
//メールから検索,メールの文書をすべて結合,そこから正規表現でURLを配列で取得
const Emails = getEmailsBySearch('is:starred');
const concatedMail = Emails.reduce(function(pre, cur) {
return pre + ' ' + cur.getPlainBody()
},'');
const urls = concatedMail.match(/(http(s)?:\/\/[-_.!~*\'()a-zA-Z0-9;\/?:\@&=+\$,%#]+)/gi);
//URLのアップデート確認,更新されたものはメールで知らせる.
urls.map(isUpdatedURL).removeNull().map(sendURLByEmail);
}
//更新確認関数,入力はURL,返り値は更新された場合URL,されてない場合null
function isUpdatedURL(url) {
const html = fetchHtmlByUrl(url);
//文字列変換後,ヘッダなどの見えない部分の削除
const htmlBody = JSON.stringify(html)
.replace(/<head>[\S|\s]*?<\/head>/gi,'')
.replace(/<script[^>]+?\/>|<script(.|\s)*?\/script>/gi, '')
.replace(/(<|{)("[^"]*"|'[^']*'|[^'">])*(>|})/g,'')
.replace(/\s|\\r|\\n|\\t/g, "");
//HTML文字列の保存.GASのキャッシュ機能.3600秒間保存する.
const catche = CacheService.getScriptCache();
const beforeHtmlBody = catche.get(url);
catche.put(url, htmlBody, 3600);
//前と変わってないまたは初めての確認時はNULLを返す.更新されてたらURLを返す.
return (beforeHtmlBody == htmlBody || beforeHtmlBody == null) ? null : url;
}
function sendURLByEmail(url) {
return GmailApp.sendEmail(myEmailAddress, '【update】' + getDomainByURL(url), url);
}
//プロトタイプに直接書くのは行儀が悪いかもしれない.
Array.prototype.removeNull = function(){
return this.filter(function(x) {
return x != null;
});
}
function getDomainByURL(url) {
return url.match(/^https?:\/{2,}(.*?)(?:\/|\?|#|$)/)[1];
}
*注意事項
プログラムはHTMLを見てるだけなのでJavascriptで描画される部分やユーザ認証が必要なところでは機能しません.
Webページの応答が長すぎる,HTMLに現在時刻が埋め込まれているなどのエラー処理,例外処理は面倒なのでやってません.
文字列にしてからHTMLのタグを消してる都合上<このような文字列>は消されてしまいます.
#最後に
GoogleフォームをUIにしたり,Chrome拡張機能で部分的に選択してAPIで動作させてみたかったですがそこまでできませんでした.(Chrome拡張機能からGASのAPIにあくせすできるのかな?)できるみたいですね.
https://qiita.com/sakaimo/items/3ee8feaf692d5e7455bb