Google Apps Scriptでデッドリンクチェッカーを作ってみる

| コメントをどうぞ

最近 Google Apps Script (GAS)  を触り始めまして。

勉強を兼ねて簡単アプリを組んでみました。以下仕様です。

  • 指定サイト内のデッドリンクを検出(href/@srcをチェック)
  • 発見されたら通知メールを出す
  • 指定間隔で定期実行
  • サイトの階層までは辿らない

 コード

言語がJavaScriptなのでさくっと書けました。

// チェック対象サイト
var siteURL = "https://www.infoscoop.org/en/";
var domain = siteURL.match(/^https?:\/\/[^\/]+/, "gi");
var deadLinkList = [];

function main() {
  // 対象サイト内のリンク抽出
  var checkUrlList = getLinks(siteURL);
  
  // デッドリンクチェック
  for(var i=0;i<checkUrlList.length;i++){
  // レスポンスコード200以外であればリストに追加
  var code = getResponseCode(checkUrlList[i]);
  if(code != 200)
    deadLinkList.push(checkUrlList[i] + " [" + code + "]");
  }
  
  // デッドリンクがあればメール通知
  if(deadLinkList.length > 0)
    doNotice(deadLinkList);
}
  
function doNotice(deadLinkList){
  var subject = "[GAS-DeadLinkChecker] " + siteURL;
  
  var body = "サイト " + siteURL + " に" + deadLinkList.length + "件のデッドリンクがあります。\n";
  for(var i=0;i<deadLinkList.length;i++){
    body += "\n" + deadLinkList[i];
  }
  MailApp.sendEmail("hogehoge@hogehoge.co.jp", subject, body)
}

function getResponseCode(url){
  var response = UrlFetchApp.fetch(url, { muteHttpExceptions:true });
  
  Logger.log(url + ":" + response.getResponseCode());
  return response.getResponseCode();
}

function getLinks(siteURL){
  var response = UrlFetchApp.fetch(siteURL);
  var html = response.getContentText();
  var regexp = new RegExp("<a.*?href=\"(.*?)\".*?>(.*?)</a>", "gim");
  
  var array = [];
  var match;
  while((match = regexp.exec(html)) != null){
    var url = match[1];
  if(/^(\/.*)/.test(url)){
    url = url.replace(/^(\/.*)/, domain + "$1");
  }
  else if(!/^(http|https|ftp):\/\//.test(url)){
    url = siteURL + url;
  }
 
  if(array.indexOf(url) == -1)
    array.push(url);
  }
  return array;
}

main メソッド実行で、変数 siteURL に対してチェックをかけます。デッドリンクが発見された場合、30行目に記述されているメルアドへ通知メールを出します。

URLFetchApp.fetch 利用の際、 muteHttpExceptions:true のオプションを指定しておかないと、エラーコードが返った際に例外になってしまいます。注意。

UrlFetchApp.fetch(url, { muteHttpExceptions:true });

トリガの設定

トリガとは、cronのような定期実行ができる機能です。この機能を使って、1日1回 main メソッドを実行する設定をしてみます。

[Resources]->[Current project’s triggers]をクリック。

WS000042

 

「No triggers set up. Click here to add one now.」をクリック。

WS000043

「Run」をmainメソッドに設定。「Time-Driven」「Day Timer」「1am to 2am」に指定します。

WS000044

これで1日1回、午前1時~2時の間にスクリプトが実行されます。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>