Cover Image for 図書館に新書が登録されたタイミングでLINE通知する方法(その2)
図書館に新書が登録されたタイミングでLINE通知する方法(その2)

背景

前回の続き。

前回は図書館APIについて記事を書いたので、今回はGoogle SpreadsheetのGoogle ActionScript(=GAS)について記事を書きます。

どうやって実現するか?(前回記事より抜粋)

  • Google Spreadsheetにチェックする新書タイトル(ISBN)のリストを登録する
  • Google SpreadsheetにGoogle ActionScript(=GAS)を登録して、カーリルの図書館APIを定期的に呼び出す
  • 新書が登録されたらLINEに通知する

Google Spreadsheetについて

完成イメージ

image.png

カラムは3つだけのシンプルな構成にしました。

  • checking
    定期チェック対象にするかどうかのフラグとする。(予約後にはLINE通知不要なので)
  • isbn
    図書館APIの検索キーとなる。
  • title
    ISBNだけだと書籍のタイトルがわからないため追加。LINE通知時にも使用する。

GASのソースコード

Google Spreadsheetのメニューから「ツール」 → 「スクリプトエディタ」でエディタを開きコード書きます。
CALIL_APP_KEYLINE_API_TOKENは、スクリプトエディタのメニューから「ファイル」→「プロジェクトのプロパティ」を開き、ここに値を保存しています。

image.png

GASのソース
function getBookStatus(isbn, title, appkey, systemid) {  
  var res_finish = false;
  var no_registed = false;
  var res_json = '';
  while (true) {
    res_json = callCalilApi(appkey, isbn, systemid);  
    if ( isFinish(res_json) ) {
      Utilities.sleep(1000);
      break;
    }
  }

  //var rj = JSON.parse(res_json); 
  no_registed = res_json.match(/"libkey": {}/);
  Logger.log('rj = ' + res_json + 'no_registed = ' + no_registed );
  
  if ( no_registed ) {
    Logger.log('【未登録】ISBN:[' + isbn + ']の[' + title + ']は横浜市の図書館に登録されていません。');
  } else {
    var msg = '【登録済】ISBN:[' + isbn + ']の[' + title + ']は横浜市の図書館に登録されてます。'
    Logger.log(msg);
    notifyLine(msg)
  }
}

function isFinish(res_json){
  return res_json.match(/"continue": 0/);
}

function callCalilApi(appkey, isbn, systemid) {
  var response = UrlFetchApp.fetch('http://api.calil.jp/check?appkey=' + appkey + '&isbn=' + isbn + '&systemid=' + systemid + '&format=json');
  // XMLだとDTDが必要なのでやめた。(カーリルにDTDがない)
  // でも、コールバック処理の扱いがGASではわからない  
  // むりやり文字列でcontinueを判定w
  res_json = response.toString().slice(9,-2);
  Logger.log(res_json);

  return res_json ;
}


function notifyLine(message) {
  var TOKEN = PropertiesService.getScriptProperties().getProperty("LINE_API_TOKEN");
  var res = null;
  var options = {
    "method": "post",
    "payload": "message=" + message,
    "headers": {"Authorization" : "Bearer "+ TOKEN}
   };
  res = UrlFetchApp.fetch("https://notify-api.line.me/api/notify", options);
  return res;
}

function main() {
  // スプレッドシートから読み込む
  // アクティブなシートを取得
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sh = ss.getActiveSheet();
  //getRangeで範囲を指定し、getValuesで値を取得
  var checkbooks = sh.getRange('A4:C100').getValues();

  // 固定
  var appkey = PropertiesService.getScriptProperties().getProperty("CALIL_APP_KEY");
  var systemid = 'Kanagawa_Yokohama'

  for(var i=0; i<checkbooks.length; i++) {
    var idx_check = 0
    var idx_isbn  = 1
    var idx_title = 2
    
    if( checkbooks[i][idx_check] === "チェックしない" || checkbooks[i][idx_isbn] === "" ){
      continue ;
    }
    
    getBookStatus(checkbooks[i][idx_isbn], checkbooks[i][idx_title], appkey, systemid);
  }
}

まとめ

このツールを使って「入門監視(ISBN:4873118646)」を2番目に予約することができました
AM2:19に初回のLINE通知が来て、10:19のLINE通知で気がついてすぐに予約したのですがこの2時間の間に予約している人がいることに驚きました
(一番に予約するためには、自動予約の仕組みが必要ですね)

最後に、
GASのjsソースコードがかなり雑で申し訳ないです。最近のjsソースに書いていないのでとりあえず動かすこと最優先でエイやで書きました。
callback処理とかわからなかったので、かなり適当なソースコードですが目的は果たせたので良しとします

参考ページ

© 2022 k69

本サイトを通じて、たくさんの人がプログラミングに興味を持ち、 これがキッカケでモノづくりの楽しさに触れることができれば幸せです!