図書館に新書が登録されたタイミングでLINE通知する方法(その2)
背景
前回の続き。
前回は図書館APIについて記事を書いたので、今回はGoogle SpreadsheetのGoogle ActionScript(=GAS)について記事を書きます。
前回記事より抜粋)
どうやって実現するか?(- Google Spreadsheetにチェックする新書タイトル(ISBN)のリストを登録する
- Google SpreadsheetにGoogle ActionScript(=GAS)を登録して、カーリルの図書館APIを定期的に呼び出す
- 新書が登録されたらLINEに通知する
Google Spreadsheetについて
完成イメージ
カラムは3つだけのシンプルな構成にしました。
- checking
定期チェック対象にするかどうかのフラグとする。(予約後にはLINE通知不要なので) - isbn
図書館APIの検索キーとなる。 - title
ISBNだけだと書籍のタイトルがわからないため追加。LINE通知時にも使用する。
GASのソースコード
Google Spreadsheetのメニューから「ツール」 → 「スクリプトエディタ」でエディタを開きコード書きます。
CALIL_APP_KEY
とLINE_API_TOKEN
は、スクリプトエディタのメニューから「ファイル」→「プロジェクトのプロパティ」を開き、ここに値を保存しています。
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処理とかわからなかったので、かなり適当なソースコードですが目的は果たせたので良しとします
参考ページ
- カーリルの図書館API
https://calil.jp/doc/api.html