ブログの投稿ログ

2021年
9月
8月
7月
6月

エンジニアがワクチン予約に本気になると

昨日、自衛隊大規模接種センターでのワクチン予約があり応募しようと思っていたのですが最後の最後で処理が中断されてしまいました。
サイトをみてみるとキャンセルが出た場合は、都度予約枠が解放されるそうです。
そこでサイト自体を自動監視してプログラムを定期実行させて通知する
みたいな物を作ろうと思います。

都度予約枠の解放条件

hoge

この赤枠の箇所が変更になったら予約可能ということで通知される仕組みを作っていきます。

コード

const puppeteer = require('puppeteer');
const cron = require('node-cron');
async function main() {
  const browser = await puppeteer.launch();
  const page = await browser.newPage();

  try {
    await page.goto('https://www.mod.go.jp/j/approach/defense/saigai/2020/covid/center.html');
    const elm = await page.$(".tbl--type1 tr td span");
    const text = await page.evaluate(elm => elm.textContent, elm);
    const check = text.indexOf('予約一旦満了');

    if(check === 0) {
      console.log("予約できない")
    }else{
      setInterval(function(){console.log('\u0007');},100);
    }
  } catch (err) {
    console.log(err)
  } finally {
    await browser.close();
  }
};
cron.schedule('*/30 * * * * *', () => main());

今回はnode.jsのプラグインであるPuppeteerを使ってスクレイピングして定期実行はnode-cronを使っていきたいと思います。

プラグインインストール

npm i puppeteer

npm i node-cron

解説

プラグインを定義

  const browser = await puppeteer.launch();
  const page = await browser.newPage();

先ほどインストールした2つのプラグインを定義していきます。

本体

  try {
    await page.goto('https://www.mod.go.jp/j/approach/defense/saigai/2020/covid/center.html');
    const elm = await page.$(".tbl--type1 tr td span");
    const text = await page.evaluate(elm => elm.textContent, elm);
    const check = text.indexOf('予約一旦満了');

    if(check === 0) {
      console.log("予約できない")
    }else{
      setInterval(function(){console.log('\u0007');},100);
    }
  }

1, ページを取得 2, 画像赤枠内の要素を取得 3, 要素内のテキスト取得 4, 要素内のテキストに予約一旦満了が含まれているかチェック 5, もし含まれているなら、予約できないを出力。含まれていないならビープ音を鳴らす。

定期実行

cron.schedule('*/30 * * * * *', () => main());

node-cronを利用して先ほど説明したコードが内包されているmain関数を30秒に1回実行する。

まとめ

node index.jsをして動かすと30秒に1回スクリプトを実行して指定した要素のテキストに変更があるかどうかをみてくれる仕組みを書いていきました。
今回の例に関わらずエンジニアリングを私生活で発生した問題解決する手段として使えるのはとても気持ちが良いですね!
最後までみてくださりありがとうございました!