はじめに
お疲れさまです。
個人開発やサービス開発に挑戦される方の中には、
- 開発しようとしている機能(一例: ユーザー間のメッセージ送受信、課金・決済 等)
- 取り扱うデータの属性(一例: 個人情報、機微情報、機密情報、等)
によって、どの法律・法令が関係するのか?、法令の更新情報をどうキャッチすれば良いのか?悩んだ経験はございませんか?
執筆者 自身は、個人開発していきたいサービスやシステムがありまして、関連する法律・法令の更新情報をキャッチしたいと考えております。
本記事は、デジタル庁様が提供してくださっている e-Gov法令検索サイト と 法令API Version 2 を利用して、法令の更新情報をダウンロードするスクリプトを作成しましたのでご紹介となります。
スクリプトはbashで作成しており、何らかのライブラリやパッケージ等を導入せずとも、実行いただけます。
なお、記事の最後、記事作成のきっかけ、私の個人的な思いを綴った文章がございます。直接的な技術情報とは関係ない、ポエム的な内容ですが、ご容赦ください。
記事内の用語について
- 法律
- 法律は国会が制定する法規(法律、政令、省令、規則、条例、条約などの総称)のこと。
- 法令
- 法律に加え、内閣が定める「政令」、各省大臣様が定める「省令」などを含めた総称のこと。
e-Gov法令検索サイトの概要について
- 法律・法令の情報は、e-Gov法令検索というサイトで検索可能です。
- 法令の更新情報をダウンロードするときのAPIとしては、デジタル庁様がご提供してくださっている以下の公開APIを利用します。
- なお、法令の更新情報については、以下の画面でも確認可能です。
スクリプト実行環境について
- 後述のコマンドは、MacOS(macOS Tahoe)のcurlコマンドで動作を確認しております。
法令の更新情報取得スクリプト作成
(1) 任意のディレクトリで、以下のbashスクリプトを作成します。
% vi download_egov_laws_updates_info.sh
以下の内容をコピーペーストして、スクリプトに記載します。
#!/usr/bin/env bash
set -euo pipefail
# ============================================
# e-Gov法令API bulkdownload 取得&一覧化スクリプト
# 使い方:
# ./download_egov_laws_updates_info.sh 20260311 "個人情報保護"
#
# 生成物:
# download_info_20260311/
# ├── legal_updates_YYYYMMDD.zip
# ├── extracted/...
# ├── law_list_YYYYMMDD.csv
# ├── law_list_YYYYMMDD.tsv
# └── grep_target_YYYYMMDD.txt
# ============================================
if [[ $# -lt 1 ]]; then
echo "使い方: $0 YYYYMMDD(e.g. 20260311) [grep_keyword]" >&2
exit 1
fi
TARGET_DATE="$1"
GREP_KEYWORD="${2:-}"
if ! [[ "$TARGET_DATE" =~ ^[0-9]{8}$ ]]; then
echo "エラー: 日付は YYYYMMDD 形式で指定してください。例: 20260311" >&2
exit 1
fi
BASE_URL="https://laws.e-gov.go.jp/bulkdownload?file_section=3&update_date=${TARGET_DATE}&only_xml_flag=true"
WORK_DIR="download_info_${TARGET_DATE}"
ZIP_FILE="${WORK_DIR}/legal_updates_${TARGET_DATE}.zip"
EXTRACT_DIR="${WORK_DIR}/extracted"
CSV_FILE="${WORK_DIR}/law_list_${TARGET_DATE}.csv"
TSV_FILE="${WORK_DIR}/law_list_${TARGET_DATE}.tsv"
GREP_FILE="${WORK_DIR}/grep_target_${TARGET_DATE}.txt"
mkdir -p "$WORK_DIR" "$EXTRACT_DIR"
echo "==> ZIPダウンロード開始: ${BASE_URL}"
echo "ZIPダウンロード実行のHTTPステータスコード"
curl -s -w '%{http_code}\n' -fL -o "$ZIP_FILE" "$BASE_URL"
echo "==> ダウンロードファイル種別確認"
file "$ZIP_FILE"
echo "==> ZIP展開開始"
unzip -oq "$ZIP_FILE" -d "$EXTRACT_DIR"
echo "==> XML一覧を走査してCSV/TSV生成"
tmp_tsv="$(mktemp)"
tmp_csv="$(mktemp)"
# ヘッダ
printf 'update_date\tlaw_num\tlaw_title\tfile_path\n' > "$tmp_tsv"
printf '"update_date","law_num","law_title","file_path"\n' > "$tmp_csv"
find "$EXTRACT_DIR" -type f -name '*.xml' | while read -r f; do
parent_dir="$(basename "$(dirname "$f")")"
# ディレクトリ名例:
# 325AC0000000144_20261001_507AC0000000087
# → 真ん中の 20261001 を更新日として抽出
raw_update_date="$(echo "$parent_dir" | awk -F'_' '{print $2}')"
# 念のため 8桁チェック。取れなければ空欄とする
if [[ "$raw_update_date" =~ ^[0-9]{8}$ ]]; then
update_date="$raw_update_date"
else
update_date=""
fi
law_num="$(xmllint --xpath 'string(/Law/LawNum)' "$f" 2>/dev/null || true)"
law_title="$(xmllint --xpath 'string(/Law/LawBody/LawTitle)' "$f" 2>/dev/null || true)"
# TSV用: タブ/改行を除去
law_num_tsv="$(printf '%s' "$law_num" | tr '\t\r\n' ' ')"
law_title_tsv="$(printf '%s' "$law_title" | tr '\t\r\n' ' ')"
file_path_tsv="$(printf '%s' "$f" | tr '\t\r\n' ' ')"
printf '%s\t%s\t%s\t%s\n' \
"$update_date" "$law_num_tsv" "$law_title_tsv" "$file_path_tsv" >> "$tmp_tsv"
# CSV用: ダブルクォートをエスケープ
law_num_csv="$(printf '%s' "$law_num" | sed 's/"/""/g')"
law_title_csv="$(printf '%s' "$law_title" | sed 's/"/""/g')"
file_path_csv="$(printf '%s' "$f" | sed 's/"/""/g')"
printf '"%s","%s","%s","%s"\n' \
"$update_date" "$law_num_csv" "$law_title_csv" "$file_path_csv" >> "$tmp_csv"
done
# ヘッダを除いて update_date で降順ソートする
{
head -n 1 "$tmp_tsv"
tail -n +2 "$tmp_tsv" | sort -r -k1,1
} > "$TSV_FILE"
{
head -n 1 "$tmp_csv"
tail -n +2 "$tmp_csv" | sort -r -t, -k1,1
} > "$CSV_FILE"
# grepしやすい検索用テキスト
# 例:
# 20261001 | 昭和二十五年法律第百四十四号 | 個人情報保護法 | download_egov_laws_updates_info_20260311/extracted/...
awk -F '\t' 'NR>1 {
printf "%s | %s | %s | %s\n", $1, $2, $3, $4
}' "$TSV_FILE" > "$GREP_FILE"
rm -f "$tmp_tsv" "$tmp_csv"
echo "==> 完了"
echo "作成ファイル:"
echo " CSV : $CSV_FILE"
echo " TSV : $TSV_FILE"
echo " GREP: $GREP_FILE"
echo
echo "==> 先頭5件プレビュー"
head -n 5 "$TSV_FILE"
echo
echo "==> grepしやすい検索例"
echo " grep '個人情報保護法' '$GREP_FILE'"
echo " grep '昭和二十五年法律第百四十四号' '$GREP_FILE'"
if [[ -n "$GREP_KEYWORD" ]]; then
echo
echo "==> キーワード検索: $GREP_KEYWORD"
grep -n --color=always "$GREP_KEYWORD" "$GREP_FILE" || true
fi
(2) 作成したスクリプトに実行権限を付与します。
% chmod 755 download_egov_laws_updates_info.sh
スクリプトを実行して、法令の更新情報をダウンロードする例
(1) 前述のスクリプトを実行し、e-Gov法令検索サイトのAPIを実行して、法令の更新情報をダウンロードします。
- 実行方法は以下になります。
% ./download_egov_laws_updates_info.sh [YYYYMMDD] [取得した更新情報のうち検索したい法令名]
- 実行例は以下になります。
ここでは、例として、消費税法 の更新を確認しています。
% ./download_egov_laws_updates_info.sh 20260311 消費税法
もし、個人情報保護法 について更新を確認されたい場合、以下のように実行します。
% ./download_egov_laws_updates_info.sh 20260311 個人情報保護法
以下がスクリプトを実際に実行した例です。
-
スクリプトを実行すると、e-Gov法令検索サイトのAPIを実行して、法令の更新情報をZIPダウンロード、ダウンロードしたZIPファイルを展開、[取得した更新情報のうち検索したい法令名] を検索できます。
-
ダウンロード・展開したZIPファイルは、後述のスクリプト実行ディレクトリ配下に download_info_20260311 ディレクトリに保存されます。
% ./download_egov_laws_updates_info.sh 20260311 消費税法
==> ZIPダウンロード開始: https://laws.e-gov.go.jp/bulkdownload?file_section=3&update_date=20260311&only_xml_flag=true
ZIPダウンロード実行のHTTPステータスコード
200
==> ダウンロードファイル種別確認
download_info_20260311/legal_updates_20260311.zip: Zip archive data, at least v2.0 to extract, compression method=deflate
==> ZIP展開開始
==> XML一覧を走査してCSV/TSV生成
==> 完了
作成ファイル:
CSV : download_info_20260311/law_list_20260311.csv
TSV : download_info_20260311/law_list_20260311.tsv
GREP: download_info_20260311/grep_target_20260311.txt
==> 先頭5件プレビュー
update_date law_num law_title file_path
21171231 平成十九年法律第二十三号 特別会計に関する法律 download_info_20260311/extracted/419AC0000000023_21171231_351AC0000000038/419AC0000000023_21171231_351AC0000000038.xml
20300619 昭和六十三年法律第百八号 消費税法 download_info_20260311/extracted/363AC0000000108_20300619_507AC0000000074/363AC0000000108_20300619_507AC0000000074.xml
20300619 昭和四十二年法律第八十一号 住民基本台帳法 download_info_20260311/extracted/342AC0000000081_20300619_507AC0000000074/342AC0000000081_20300619_507AC0000000074.xml
20291211 昭和四十二年法律第八十一号 住民基本台帳法 download_info_20260311/extracted/342AC0000000081_20291211_507AC0000000087/342AC0000000081_20291211_507AC0000000087.xml
==> grepしやすい検索例
grep '個人情報保護法' 'download_info_20260311/grep_target_20260311.txt'
grep '昭和二十五年法律第百四十四号' 'download_info_20260311/grep_target_20260311.txt'
==> キーワード検索: 消費税法
2:20300619 | 昭和六十三年法律第百八号 | 消費税法 | download_info_20260311/extracted/363AC0000000108_20300619_507AC0000000074/363AC0000000108_20300619_507AC0000000074.xml
95:20270401 | 昭和六十三年法律第百八号 | 消費税法 | download_info_20260311/extracted/363AC0000000108_20270401_506AC0000000060/363AC0000000108_20270401_506AC0000000060.xml
106:20270101 | 昭和六十三年法律第百八号 | 消費税法 | download_info_20260311/extracted/363AC0000000108_20270101_507AC0000000013/363AC0000000108_20270101_507AC0000000013.xml
111:20261101 | 昭和六十三年法律第百八号 | 消費税法 | download_info_20260311/extracted/363AC0000000108_20261101_507AC0000000013/363AC0000000108_20261101_507AC0000000013.xml
130:20261001 | 昭和六十三年法律第百八号 | 消費税法 | download_info_20260311/extracted/363AC0000000108_20261001_507AC0000000070/363AC0000000108_20261001_507AC0000000070.xml
131:20261001 | 昭和六十三年法律第百八号 | 消費税法 | download_info_20260311/extracted/363AC0000000108_20261001_507AC0000000013/363AC0000000108_20261001_507AC0000000013.xml
%
(2) 法令の更新情報を全て確認したい場合、ダウンロードZIPを展開したディレクトリ内を確認します。
- 法令の更新情報をZIPダウンロードし、展開した内容については、スクリプト実行ディクレクトリ配下に download_info_20260311 ディレクトリとして保存されます。
- スクリプト実行時、指定した日付のディレクトリに保存されます。
% ls -lrta
total 16
-rwxr-xr-x 1 ******* staff 4292 3月 12 00:58 download_egov_laws_updates_info.sh
drwxr-x---+ 75 ******* staff 2400 3月 12 00:58 ..
drwxr-xr-x 7 ******* staff 224 3月 12 00:58 download_info_20260311
drwxr-xr-x 4 ******* staff 128 3月 12 01:05 .
%
% ls -lrta download_info_20260311
total 35184
drwxr-xr-x 7 ******* staff 224 3月 12 00:58 .
-rw-r--r-- 1 ******* staff 17280687 3月 12 01:02 legal_updates_20260311.zip
drwxr-xr-x 170 ******* staff 5440 3月 12 01:02 extracted
-rw-r--r-- 1 ******* staff 37299 3月 12 01:03 law_list_20260311.tsv
-rw-r--r-- 1 ******* staff 38643 3月 12 01:03 law_list_20260311.csv
-rw-r--r-- 1 ******* staff 38261 3月 12 01:03 grep_target_20260311.txt
drwxr-xr-x 4 ******* staff 128 3月 12 01:05 ..
%
download_info_20260311/law_list_20260311.csv に全文が記載されております。
% head -5 download_info_20260311/law_list_20260311.csv
"update_date","law_num","law_title","file_path"
"21171231","平成十九年法律第二十三号","特別会計に関する法律","download_info_20260311/extracted/419AC0000000023_21171231_351AC0000000038/419AC0000000023_21171231_351AC0000000038.xml"
"20300619","昭和六十三年法律第百八号","消費税法","download_info_20260311/extracted/363AC0000000108_20300619_507AC0000000074/363AC0000000108_20300619_507AC0000000074.xml"
"20300619","昭和四十二年法律第八十一号","住民基本台帳法","download_info_20260311/extracted/342AC0000000081_20300619_507AC0000000074/342AC0000000081_20300619_507AC0000000074.xml"
"20291211","昭和四十二年法律第八十一号","住民基本台帳法","download_info_20260311/extracted/342AC0000000081_20291211_507AC0000000087/342AC0000000081_20291211_507AC0000000087.xml"
%
終わりに
記事を閲覧いただき、ありがとうございます。
個人開発やサービス開発などに挑戦される方の中で、e-Gov法令検索サイトで、関係する法律・法令の更新情報、どうキャッチすればよいだろう?と悩まれている方がいましたら、少しでもご参考になれば幸いです。
執筆者の個人的な思い (ポエム)
純粋な技術情報とは無関係で、ポエム的要素がありますが、最後に執筆者の思いについて、少しだけ綴らせてください。
私自身として、今後、解決に取り組みたいと考えている課題感がございまして、いくつか考えている仕組み、サービス、システムがございます。
私自身、諸般の事情により、内心、孤独を感じることが多いのですが、
形は違えども、様々な事情により、孤独や悲しさを抱え、一人涙している方が他にもいらっしゃるかもしれません。
まだ完全に言語化しきれていないですが、今後、
- 「人が孤独で壊れにくい社会をつくる」
ことを目指しておりまして、
- 人と人を繋ぐ大切な言葉、この「言葉のリスクを見える化し、やさしいコミュニケーションを支える仕組みを提供する」
ことに取り組みます。
新しい仕組み、サービスやシステムを検討・実現していくにあたり、やはり、ユーザーさまが安心してサービスやシステムをご利用いただけるようにしたいと考えておりまして、
そのため、開発するサービスやシステムの機能、ユーザーさまからお預かりするデータによって、関連する法律・法令を確認・遵守、法令の更新情報も確認してまいりたいと思います。
以上となります。