7
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Google Apps ScriptAdvent Calendar 2020

Day 1

【GAS】メールに含まれるURL先の更新を自動で確認

Last updated at Posted at 2020-12-01

#モチベーション
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

7
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?