# e-Gov法令API v2: 検索・保存・2時点比較・1条のJSON化

Python 3.10以降、標準ライブラリのみ。APIキー不要。MIT（同じ配布フォルダーの `egov-law-api-v2-LICENSE.txt`）。確認日: 2026-09-26、実行環境: Windows / Python 3.10.11、公式OpenAPI 2.1.139。

## ファイル

- [Pythonスクリプト](https://codeagent.jp/downloads/egov-law-api-v2.py)
- [架空のオフライン入力](https://codeagent.jp/downloads/egov-law-example-fixture.json)
- [2026-09-26の実行記録](https://codeagent.jp/downloads/egov-law-example-evidence-20260926.json)
- [MITライセンス](https://codeagent.jp/downloads/egov-law-api-v2-LICENSE.txt)

4ファイルを保存した作業フォルダーで以下を実行します。`--out` はサブコマンドより前です。

## 1. 通信なしで試す

```powershell
python --version
python egov-law-api-v2.py --out results excerpt egov-law-example-fixture.json --article 1
python egov-law-api-v2.py --out results excerpt egov-law-example-fixture.json --article 1 --supplement 1
```

本則と附則を別々に保存します。入力は架空のテストデータで、実在する法令でも実APIの応答でもありません。`example.invalid` と `FIXTURE` を含む出典は検証用です。

## 2. 法令を検索してIDを選ぶ（API 1回）

```powershell
python egov-law-api-v2.py --out results search "労働基準法" --limit 3
```

2026-09-26は `count=3 total_count=11 next_offset=3`。先頭候補のIDは `322AC0000000049` でした。将来の件数は固定しません。検索後の本文取得は自動実行しません。

## 3. 指定日の本文を保存（API 1回）

```powershell
python egov-law-api-v2.py --out results get 322AC0000000049 --asof 2025-06-01
```

このCLIのgetは15文字の法令IDに限定しています。公式API自体は法令番号・履歴IDも受け付けますが、このサンプルでは入力と返却されたlaw_idを照合するため対象外です。日時付きのJSONとXMLを新規作成します。JSONは応答全体とURL・指定日・取得時刻を保持。XMLはBase64を復号したバイト列です。

## 4. 2日付の版を比較（API 2回）

```powershell
python egov-law-api-v2.py --out results compare 331AC0000000120 --before 2025-06-01 --after 2026-01-01
```

2026-09-26の実測:

```text
before: 331AC0000000120_20250523_507AC0000000041
after: 331AC0000000120_20260101_507AC0000000041
same_revision: false
same_xml_bytes: false
```

`results/compare-日時/` に `before.json`、`before.xml`、`after.json`、`after.xml`、`xml.diff`、`comparison.json` ができます。`comparison.json` は最後に保存されます。両API応答を検証するまで保存を開始しません。書き込み途中でディスクエラーになり要約がないフォルダーは、完了した比較に含めないでください。

日付は両方を明示します。法令履歴IDでは `asof` が無視されるため、compareは15文字の法令IDのみ受け付けます。同一日・逆順は通信前に止めます。履歴IDの変更、XMLのバイト列の変更、整形したXMLの差分は別々に判定します。差分は内容を確認する入口で、法的な変更・適用判断ではありません。

## 5. 取得済みJSONから1条を取り出す（通信なし）

次の `compare-日時` を実行時に表示されたフォルダー名に置き換えます。

```powershell
python egov-law-api-v2.py --out results excerpt results/compare-日時/after.json --article 1
```

`egov-article/1` 形式のJSONに、本則の指定Article、XML属性、子要素とテキストの順序、取得日、指定日、履歴ID、XMLのSHA-256を保存します。枝番号は `--article 21_2` のようにXMLの `Num` をそのまま使います。附則はXML内の直接の `SupplProvision` の順番を確認して `--supplement 1` を明示します。

この形式はMCPツール実装へ渡すための独自データ形式です。MCPサーバーやツールのインストール・登録・通信は行いません。

## 失敗時

| 状況 | 確認・復旧 |
| --- | --- |
| HTTP 400/404 | 法令IDと日付を確認。compareに履歴IDを渡さない |
| HTTP 429/5xx・タイムアウト | 公式稼働状況を確認し、時間を置いて手動で1回実行。自動リトライなし |
| 12 MiB超過 | この小さなサンプルの上限。必要範囲を絞るか、一括ダウンロードを検討 |
| Base64/XMLエラー | 指定形式と公式仕様を確認。不正応答を成功として保存しない |
| ARTICLE_NOT_FOUND | 取得した版のNum、本則/附則をXMLで確認 |
| SUPPLEMENT_NOT_FOUND | 附則の存在と1始まりの番号を確認 |
| 保存失敗 | 権限・空き容量を確認。別の出力フォルダーで再実行 |

TLS検証を無効にしません。既存ファイルは上書きしません。1回の通信は30秒でタイムアウトし、応答の読取上限は12 MiBです。

## 根拠・関連記事

- [公式API仕様](https://laws.e-gov.go.jp/api/2/swagger-ui/)
- [公式OpenAPI](https://laws.e-gov.go.jp/api/2/swagger-ui/lawapi-v2.yaml)
- [公式XML構造](https://laws.e-gov.go.jp/docs/law-data-basic/8ebd8bc-law-structure-and-xml/)
- [Pythonで検索・本文保存](https://codeagent.jp/posts/egov-law-api-v2-python/)
- [asofを固定した2時点比較](https://codeagent.jp/posts/egov-law-api-v2-asof/)
- [XMLからMCP向けJSON](https://codeagent.jp/posts/egov-law-xml-to-mcp-json/)
- [API URL・curl・Pythonの生成ツール](https://codeagent.jp/tools/egov-api-builder/)
