e-Gov法令API v2のasof:2時点の条文を比較して保存する
e-Gov法令API v2のasofを使い、同じ法令IDの2025年6月と2026年1月の版を比較。Pythonの実行コード、履歴ID・XML差分・出典の保存、失敗時の確認手順を2026年9月26日の実測で解説します。
e-Gov法令API v2の時点比較は、同じ法令IDに対して、比較したい日付を両方ともasofで指定すると再現しやすくなります。「過去」と「asofなしの現在」では、再実行する日によって比較先が変わるためです。
この記事では、法令ID 331AC0000000120 を 2025-06-01 と 2026-01-01 の2時点で取得します。応答の履歴IDと原文を保存し、XML差分まで1コマンドで作ります。2026年9月26日に公開APIへ実際にアクセスして確認しました。
先に動かす:2時点を比較する
Pythonサンプルをダウンロードして、保存先で実行します。Python 3.10以降の標準ライブラリだけを使います。APIキー、外部パッケージ、MCPサーバーの設定は不要です。
python --versionpython egov-law-api-v2.py --out results compare 331AC0000000120 --before 2025-06-01 --after 2026-01-01--outはサブコマンドcompareより前に置きます。Windowsでpythonが使えない場合は、導入環境に合わせてpyへ置き換えてください。保存して使えるREADMEにも同じ手順があります。
2026年9月26日、Windows / Python 3.10.11での実行結果です。
before: 331AC0000000120_20250523_507AC0000000041after: 331AC0000000120_20260101_507AC0000000041same_revision: falsesame_xml_bytes: falsesaved: results\compare-実行日時| 指定日 | 応答の法令名 | 応答の履歴ID |
|---|---|---|
| 2025-06-01 | 下請代金支払遅延等防止法 | 331AC0000000120_20250523_507AC0000000041 |
| 2026-01-01 | 製造委託等に係る中小受託事業者に対する代金の支払の遅延等の防止に関する法律 | 331AC0000000120_20260101_507AC0000000041 |
これは取得した版の記録です。返却値は将来も固定されるという保証ではありません。実測記録JSONには、取得URL・取得日時・XMLのSHA-256も残しました。
保存される6ファイルの役割
スクリプトはAPIへ2回アクセスし、両方の応答を検証してから、日時付きフォルダーを作ります。
| ファイル | 内容 | 確認すること |
|---|---|---|
before.json / after.json | 取得URL、指定日、取得日時、応答全体 | 比較条件と返ってきた履歴 |
before.xml / after.xml | Base64を復号した原文のバイト列 | 条・項・号、附則、表など |
xml.diff | 読み比べるために整形したXMLの差分 | どの要素が変わったか |
comparison.json | 2時点の識別情報、ハッシュ、比較結果 | 比較一式が保存できたか |
comparison.jsonは最後に書き込みます。ディスク容量や権限の問題で保存が途中で止まった場合、このファイルのないフォルダーを完了した比較として扱わないでください。出力先を変えて再実行すれば、既存ファイルを上書きせずにやり直せます。
差分の読み方は3段階です。
same_revisionで、APIが別の履歴を選んだかを確認する。same_xml_bytesで、原文のバイト列が同じかを確認する。xml.diffを開き、変更された要素を原文で確認する。
履歴IDだけが変わり本文が同じ、またはXMLの整形だけが変わる場合もあり得ます。差分ファイルでは属性順と字下げを整えるため、元のバイト列は別のXMLに保持しています。
asofの意味と、効かない指定
公式OpenAPI仕様のlaw_dataでは、asofは指定時点以前で最新の履歴を選ぶ条件です。履歴IDの中央にある日付だけで、個別の規定の適用日まで判断しないでください。
API単体で確認する場合は、次の2本です。
curl.exe --fail-with-body "https://laws.e-gov.go.jp/api/2/law_data/331AC0000000120?asof=2025-06-01&response_format=json&law_full_text_format=xml"curl.exe --fail-with-body "https://laws.e-gov.go.jp/api/2/law_data/331AC0000000120?asof=2026-01-01&response_format=json&law_full_text_format=xml"法令履歴IDをパスに入れると、asofは無視されます。 日付を変えたのに同じ応答が返る場合は、まずパスが15文字の法令IDか確認してください。配布コードのcompareは履歴IDを受け付けず、日付の同一・逆順も通信前に止めます。
response_format=jsonとlaw_full_text_format=xmlは、外側をJSON、本文をXMLにする指定です。この組み合わせでは本文がBase64文字列になるため、Pythonで復号して保存する手順を使います。
法令名からIDを探す場合は、APIリクエスト作成ツールでURLとコマンドを組み立てられます。通称・改題で見つからないときは、法令名の検索漏れを調べる記事を参照してください。
次に、第1条だけを抽出する
比較先のJSONから必要な条を取り出せます。次のcompare-実行日時を、実際に表示されたフォルダー名へ置き換えてください。
python egov-law-api-v2.py --out results excerpt results/compare-実行日時/after.json --article 1この処理では通信しません。保存済みのXMLから本則第1条を選び、履歴ID・指定日・原文URLとともにJSONへ出します。--article 21_2のような枝番号や、--supplement 1で明示した附則も扱います。詳しい出力形式はXMLからMCP向けJSONへの変換にあります。
エラーが出たら確認すること
| 症状 | 確認・復旧 |
|---|---|
| 入力時点で止まる | 法令IDが15文字か、beforeがafterより前かを確認 |
| 2日付で同じ履歴が返る | 正常な可能性あり。law_revisionsと実際の指定日を確認 |
| HTTP 400/404 | 法令ID、日付、公式仕様を確認して再実行 |
| HTTP 429/5xx・タイムアウト | 公式の稼働状況を確認し、時間を置いて単発で再実行 |
| Base64/XMLエラー | 取得形式・API応答を確認。コードは不正応答を成功扱いしない |
ARTICLE_NOT_FOUND | 指定した版の条番号と、本則・附則の違いをXMLで確認 |
サンプルの制限は1通信30秒、JSON応答12 MiBまでです。自動再試行や全法令の巡回は行いません。TLS検証を無効にせず、証明書エラーは実行環境で確認してください。
確認した範囲と、残る判断
2026年9月26日に確認したのは、公式仕様2.1.139、上記の2時点取得、6ファイルの保存、本則第1条の抽出です。別に架空データの回帰テストで、枝番号、附則、号・細目、ただし書、ルビ、表、取得途中の失敗を確認しています。ライブAPIと架空テストは区別しています。
この成果物はXMLを取得・比較する道具です。差分から法的な評価を自動で出すものではなく、公開中のMCPパッケージがこのコードへ切り替わったことも示しません。必要な版と原文を人間が確認できる状態を、まず作ります。
よくある質問
asofを指定すれば、その日の条文を取得できますか?
公式仕様では、指定時点以前で最新の履歴に対応する本文を返します。law_dataのパスに法令IDを渡し、asof=YYYY-MM-DDを付けます。返却されたlaw_revision_idも確認・保存してください。
日付を変えたのに同じ版が返るのはなぜですか?
2日付の間で選ばれる履歴が同じ場合は正常です。また、パスに法令履歴IDを指定するとasofは無視されます。この記事のcompareコマンドは法令IDだけを受け付け、履歴IDの誤入力を通信前に止めます。
XMLに差分があれば、改正内容を判定できますか?
このコードが示すのはXML表現の差分です。題名、メタデータ、附則などの変化も含まれます。適用や改正内容の法的判断は行わず、該当する原文・履歴へ戻って確認します。
この記事の情報・検証メモ
- mcp
- egov
- python
- japanese-law
- legal-tech
- troubleshooting
- 公開日
- 情報確認
- 参考リンク
- 3件
- 更新性
- 定期更新
仕様・料金・提供範囲が変わりやすいテーマは、公開日・更新日・情報確認日を分けて管理します。 導入前には必ず記事末尾の一次情報と公式ドキュメントで最新状況を確認してください。