ワクチン予約ができないからサイト監視スクレイピングを作る

# 自衛隊東京大規模接種センター（東京センター）　のサイトをチェック
## 概要
防衛省では集団接種予約を受け付けている。
しかし、ワクチン供給が足りない事から、予約が停止中。
そしていつ予約再開になるかもわからないので、面倒なのでスクレイピングでサイトを監視してもらうことにした。

### 防衛省ワクチン予約URL
https://www.mod.go.jp/j/approach/defense/saigai/2020/covid/center.html

## 防衛省のサイトの画像
![スクリーンショット 2021-07-07 23.34.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519741/ce80aa41-5bbd-401e-09a9-9e38df30aa1d.png)

## 文字を監視する
予約ボタンの下に「**7月11日（日）までの予約は一旦満了となりました**」という文字が出る。
この文字が消えた時、予約開始ができるかも。と判断することにする。

## PHPを使う
手軽なのでやはりPHP。

## スクレイピングのライブラリ
phpQueryというライブラリを使う。以下からダウンロード
https://code.google.com/archive/p/phpquery/downloads

## 独自ファイルの作成
なんでも良いです。**getvaccine.php**みたいな
phpQueryのファイルは**phpQuery-onefile.php**になりますので、独自で作成するファイルと同じ階層に置きます。

## プログラムを書く
### まずはライブラリ読み込み
念の為、max_execution_timeを無制限にしておく

```
<?php
    ini_set('max_execution_time', 0);
    require_once("./phpQuery-onefile.php");
```

### 必要情報を変数に入れる
今回は防衛省のurlを入れておきます。

```
    $url_boueisho = 'https://www.mod.go.jp/j/approach/defense/saigai/2020/covid/center.html';
```

### サイトの読み込みを開始
file_get_contentsでサイトにアクセス。
下でphpQueryを使うが、これはサイトのhtmlを取得するイメージでおk


```
        $subHtml = file_get_contents($url_boueisho, false, $options);
        $subObj = phpQuery::newDocument(mb_convert_encoding($subHtml, 'HTML-ENTITIES', 'UTF-8'));
```

### 下調べ
細かい情報を取得。
今回は「**7月11日（日）までの予約は一旦満了となりました**」という文字を監視したいので、下調べする

![スクリーンショット 2021-07-07 23.45.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519741/d9e26407-dc09-1fca-37e7-7cf43d414d68.png)

HTMLタグをチェックする。
pタグでclassが**fs-85 matchHeight2 mt-20**の中のspanタグのclass **fc-red** の中に入っていることがわかる

CSS的に書くと

```
p.fs-85.matchHeight2.mt-20 > span.fc-red
```

こんな感じ。
これを使ってスクレイピングすれば良い。
先ほど使ったプログラムの$subObjの中にHTMLデータが入っているので、ここから検索するイメージ。

### スクレイピング
```
     $getText = $subObj->find("p.fs-85.matchHeight2.mt-20 > span.fc-red:eq(0)")->text();
```

補足`span.fc-red:eq(0)`と書いてあるが、同じclassのタグが複数あるため、東京センターは一番最初のデータなので0を指定。
大阪センターは(1)にすればいけるかと。

### 文言チェック＆メール送信
文言をチェック。**strpos**を使えば、その変数の中に特定の文字が含まれるかどうかをチェックしてくれる。
まだその文字が取得できたら「予約できません」の方の条件分岐に入る。
文字が含まれていない（＝予約できる可能性ある）場合は、elseにいく。
今回は、**mb_send_mail**を使ってアラートとしてメール送信をする様にした。
mb_send_mailは正確に送れない場合があるため注意。あと、メールアドレスはサンプルなので変更する様に。

下のプログラムの**test@mail.com**を変更すること


```

    if(strpos($getText, "７月１１日（日）までの予約は一旦満了となりました。") !== false) {
        //予約できない
    }else{
        //予約できる
        mb_send_mail("test@mail.com", 'ワクチン接種！！', "防衛省、今なら予約できるかもっ！！\r\n ".$url_boueisho,"From:info@mail.com");
    }

```

## 完成プログラム

```
<?php
    ini_set('max_execution_time', 0);
    require_once("./phpQuery-onefile.php");

　　　　　　　　$url_boueisho = 'https://www.mod.go.jp/j/approach/defense/saigai/2020/covid/center.html';

    $subHtml = file_get_contents($url_boueisho, false, $options);
    $subObj = phpQuery::newDocument(mb_convert_encoding($subHtml, 'HTML-ENTITIES', 'UTF-8'));

    $getText = $subObj->find("p.fs-85.matchHeight2.mt-20 > span.fc-red:eq(0)")->text();

    if(strpos($getText, "７月１１日（日）までの予約は一旦満了となりました。") !== false) {
        //予約できない
    }else{
        //予約できる
        mb_send_mail("test@mail.com", 'ワクチン接種！！', "防衛省、今なら予約できるかもっ！！\r\n ".$url_boueisho,"From:info@mail.com");
    }

    die;
```

## 動かし方
CRON使うのがベスト。（CRONの使い方はご自分で）
手動実行は以下。ファイル名を変えている場合はその都度変更。
もちろん、ちゃんとPHPが動く環境に置くこと

```
 php getvaccine.php
```