震度データベースの地震一覧を取得する

# 概要
震度データベースのAPIにリクエストを送るとデータが返ってくるのでいい感じに保存できます。

## 注意
HTML関係は詳しくないので間違っているところがあるかもしれません。

# 本編
## 探した過程
[震度データベースのページ](https://www.data.jma.go.jp/svd/eqdb/data/shindo/index.html)を開発者ツールで見てみると、地震を検索ボタンにはclassしかないですがCSVダウンロードボタンには`id="outputCsvS"`があったのでjavascriptを見てみます。
https://www.data.jma.go.jp/svd/eqdb/data/shindo/js/main.js にjavascriptがあります(文字化けした場合保存してvscodeで読み込むといい)。vue.jsを使用しているようです。よくわかりませんが、たどってみます。

`outputCsvS`で`hypoCsv(vm.seisList)`を呼び出し、`vm.seisList`の中身をcsvに変換してダウンロードしてるようです。

vmはVueで、インスタンスにデータが格納されているようです。さらに見てみると、地震検索（API呼び出し）というコメントがある`search(query, hst)`があります。ここでAPIにPOSTリクエストを送って取得しているようです。URLはhttps://www.data.jma.go.jp/svd/eqdb/data/shindo/api/api.php です。ネットワークタブのapi.phpのペイロードには以下のようなものが確認できます。
```
mode: search
dateTimeF[]: 2024-01-13
dateTimeF[]: 00:00
dateTimeT[]: 2024-01-19
dateTimeT[]: 23:59
mag[]: 0.0
mag[]: 9.9
dep[]: 000
dep[]: 999
epi[]: 99
pref[]: 99
city[]: 99
station[]: 99
obsInt: 1
maxInt: 1
additionalC: false
Sort: S0
Comp: C0
seisCount: true
observed: false
```
これを実装すれば取得できそうです。

ちなみに、下の例URLのようにURLのパラメータに指定しても取得できます。

## 応答例
https://www.data.jma.go.jp/svd/eqdb/data/shindo/api/api.php?mode=search&dateTimeF[]=2024-01-01&dateTimeF[]=00:00&dateTimeT[]=2024-01-01&dateTimeT[]=11:59&mag[]=0&mag[]=9.9&dep[]=0&dep[]=999&epi[]=99&pref[]=99&city[]=99&station[]=99&obsInt=1&maxInt=1&additionalC=true&Sort=S0&Comp=C0&seisCount=false&observed=false の場合
```json:応答例
{
    "res": [
        {
            "id": "20240101081503",
            "ot": "2024/01/01 08:15:03.0",
            "name": "青森県東方沖",
            "latS": "41°29.4′N",
            "lonS": "142°00.9′E",
            "lat": "41.4900",
            "lon": "142.0150",
            "dep": "57 km",
            "mag": "3.5",
            "maxI": "震度１",
            "maxIcls": "bg-I1",
            "maxS": null,
            "maxScls": null
        }
    ],
    "str": [
        "地震の発生日時 ： 2024/01/01　00:00　～　2024/01/01　11:59",
        "検索結果地震数 ： 1 地震 （「地震の発生日時の新しい順」で検索）"
    ]
}
```

## 注意
- 通常時と同じく1000個までしか取得できません。
- 震度は`1`,`2`,`3`,`4`,`A`,`B`,`C`,`D`,`7`形式である必要があります。

## C#
私はC#でやったのでその時やった点を残しておきます。
- `FormUrlEncodedContent`などパラメータを指定しようとしたが同じものが2つあるものがあったり(dateTimeF[]等)、[]があってできないもの(忘れた)があったりでうまくいかなかったが、URLのパラメータに指定したらできた。
- 取得後は`Regex.Unescape`で見やすく。

例:https://github.com/Ichihai1415/JeqDB-Converter/blob/main/JeqDB-Converter/Program.cs のGetCsv()
操作性は悪いですが、画像や動画(用の画像)を作成できます。

## おまけ
震度データベースjavascriptには配色の情報もあります。
```javascript:震度別色
const intColor = {
	S1: 'rgb(242,242,255)',
	S2: 'rgb(000,170,255)',
	S3: 'rgb(000,065,255)',
	S4: 'rgb(250,230,150)',
	SA: 'rgb(255,230,000)',
	SB: 'rgb(255,153,000)',
	SC: 'rgb(255,040,000)',
	SD: 'rgb(165,000,033)',
	S7: 'rgb(180,000,104)',
	SS: 'rgb(204,204,204)',
};
```
```javascript:震央色
function getEqColorD(dep) {
	let d = parseInt(dep);
	let l = 50;
	let h = 0;
	if (d <= 10) {
		l = 50 - 25*((10 - d)/10);
	} else if (d <= 20) {
		h = 0 + 30*((d - 10)/10);
	} else if (d <= 30) {
		h = 30 + 30*((d - 20)/10);
	} else if (d <= 50) {
		h = 60;
	} else if (d <= 100) {
		h = 60 + 60*((d - 50)/50);
		l = 50 + 25*((50 - d)/100);
	} else if (d <= 200) {
		h = 120 + 90*((d - 100)/100);
		l = 25 - 30*((100 - d)/100);
	} else if (d <= 700) {
		h = 210 + 30*((d - 200)/500);
		l = 55 + 30*((200 - d)/500);
	} else {
		h = 240;
		l = 25;
	}
	return 'hsl(' + h + ', 100%, ' + l + '%)';
}
```

また、api.phpは地震の震度分布も取得できます。
ペイロードは以下のようになります。
```
mode: event
id: 20240113155558
```
同じくhttps://www.data.jma.go.jp/svd/eqdb/data/shindo/api/api.php?mode=event&id=20240114001943 のようにできます。
```json:応答例
{
    "res": {
        "hyp": [
            {
                "id": "20240114001943",
                "ot": "2024/01/14 00:19:43.6",
                "name": "北海道西方沖",
                "latS": "44°17.4′N",
                "lonS": "141°36.3′E",
                "lat": "44.2900",
                "lon": "141.6050",
                "dep": "0 km",
                "mag": "1.6",
                "maxI": "震度１",
                "maxIcls": "bg-I1",
                "maxS": null,
                "maxScls": null
            }
        ],
        "int": [
            {
                "name": "苫前町旭＊",
                "lat": "44.31",
                "lon": "141.655",
                "code": "1300031",
                "int": "震度１",
                "char": "1",
                "mark": "S1",
                "zidx": "1"
            }
        ]
    },
    "str": [
        {
            "hyp": [
                {
                    "id": "20240114001943",
                    "ot": "2024/01/14 00:19:43.6",
                    "name": "北海道西方沖",
                    "latS": "44°17.4′N",
                    "lonS": "141°36.3′E",
                    "lat": "44.2900",
                    "lon": "141.6050",
                    "dep": "0 km",
                    "mag": "1.6",
                    "maxI": "震度１",
                    "maxIcls": "bg-I1",
                    "maxS": null,
                    "maxScls": null
                }
            ],
            "int": [
                {
                    "name": "苫前町旭＊",
                    "lat": "44.31",
                    "lon": "141.655",
                    "code": "1300031",
                    "int": "震度１",
                    "char": "1",
                    "mark": "S1",
                    "zidx": "1"
                }
            ]
        }
    ]
}
```
他にもあるので見てみてください。

# 感謝
気象庁 震度データベース https://www.data.jma.go.jp/svd/eqdb/data/shindo/index.html