SimpleTest / SimpleBrowser を使った法令確認

suzukiPHP,SimpleTest

だいぶご無沙汰しましたが、iPad を買って、毎日自分の指紋を確認している suzuki です。ぺたぺた。

みなさん「コンプライアンス」って言葉、聞いた事ありますか? 「法律遵守」とか「法的準拠」とかという意味に使われたりします。まぁ、要するに「会社として、国や自治体のルールなどは守らないとね!」という話です。

ルールを守る為には、ルールを知る必要があります。また、ルールは状況に応じて変わって行きますので、変更があったかどうかを知っておく必要もあります。ルールが変わる前に告知されますので、そこで気がつくはずですが、気付かずにスルーしてしまうことも考えられます。

そんな場合に利用できるのが、「電子政府の総合窓口 イーガブ」内にある「法令データ提供システム」です。法令の名称を入れると、その内容を確認できます。また、最終改正の日付が分かるので、過去に調べた時点から変更があった可能性を探ることができます。(実際の変更点は、追って調べる必要がありますが。。。)

トライコーンでは、実際にこういった法令の変更に対して調査し、変更があれば会社内のルールの見直しなどを行なっています。

と、その役割を今年は私がやっていたのですが、毎回フォームから入力して調べるのが面倒だなぁと思って、最終改正日を取得するスクリプトを作成してみました。

当初、「法令データ提供システム」では検索条件を POST しているだけだろうと思っていたのですが、パラメータをまとめて POST しただけでは、うまく動きませんでした。どうやら、セッション管理されているようで、入力画面で取得したセッションID(実際には Cookie)を付与して POST しないとダメなようです。

全て自前で実装しても良かったのですが、こういったセッション処理を良きに計らってくれるライブラリとして最近気に入っているのが「SimpleTest」です。

SimpleTest は、PHP のユニットテスト用ライブラリなのですが、その中に入っている SimpleBrowser を使うと、GET やら POST やらフォーム入力やら Cookie 処理やらが簡単に行えます。

ということで、SimpleBrowser を使って、指定の法令の最終改正日を取得するスクリプトを書きました。

#!/usr/bin/php
<?php
# -*- coding: utf-8 -*-

require_once('./simpletest/browser.php');

function getLastModified( $law_name ) {
    // 法令データ提供システム
    $law_check_url = 'http://law.e-gov.go.jp/cgi-bin/idxsearch.cgi';

    $browser =& new SimpleBrowser();

    // session cookie を取得する為に、まず入力画面へアクセス
    $result = $browser->get($law_check_url);

    // 検索用のパラメータを作成
    $parameters = array('H_NAME'        => $law_name,
                        'H_RYAKU'       => '2',    # 略称検索するかどうか(1:有 / 2:無)
                        'H_NAME_SUBMIT' => '検索', # hidden
                        'H_NAME_YOMI'   => 'あ',   # hidden
                        'H_NO_GENGO'    => 'H',    # hidden
                        'H_NO_YEAR'     => '0',    # hidden
                        'H_NO_TYPE'     => '2',    # hidden
                        'H_NO_NO'       => '',     # hidden
                        'H_CTG'         => '1',    # hidden
                        'H_YOMI_GUN'    => '1',    # hidden
                        'H_CTG_GUN'     => '1',    # hidden
                        );

    // 検索用の Web が Shift_JIS なのでコンバート
    mb_convert_variables('SJIS','UTF8',$parameters);

    // 検索の実行
    $browser->post($law_check_url, $parameters);

    // 検索結果画面から URL 一覧を取得
    $urls = $browser->getUrls();

    // 最初の URL が検索対象のはず(←弱い)
    $result_url = $urls[0];

    // 検索対象を表示
    $result = $browser->get($result_url);

    // 検索結果画面の data フレームを選択
    $browser->setFrameFocus('data');

    // フレームのコンテンツを取得
    $result = $browser->getContent();
    $result = mb_convert_encoding($result, 'UTF-8','SJIS');

    // 最終改正の文字を探す
    if (preg_match('/最終改正:([^<]+)/', $result, $match)) {
        $last_modified = $match[1];
    } else {
        $last_modified = '最終改正が見つかりませんでした。ブラウザで再確認してください。';
    }

    // 最終改正までの未施行法令を探す
    if (preg_match('/最終改正までの未施行法令.+<A [^>]+>(.+?)<\/A>/i', $result, $match)) {
        $not_yet_effective = $match[1];
    } else {
        $not_yet_effective = '';
    }

    return array($last_modified, $not_yet_effective);
}

// 検索する法令名(略称ではない名称)
$laws = array('不正アクセス行為の禁止等に関する法律',
              '著作権法',
              '個人情報の保護に関する法律',
              '特定電子メールの送信の適正化等に関する法律',
);

// 調査および結果の出力
print "法令名\t最終改正\t最終改正までの未施行法令\n";
foreach ($laws as $law) {
    list($last_modified, $not_yet_effective) = getLastModified($law);
    printf("%s\t%s\t%s\n", $law, $last_modified, $not_yet_effective);

    // 少し相手の負荷を考えたりして。
    sleep(3);
}

SimpleBrowser の使い方の詳細はAPIマニュアルを参照して頂く(手抜き)として、上記では指定した URL を GET( $browser->get() ) 、検索パラメータ等を連想配列の形式でセットして POST ( $browser->post() ) 、検索結果画面からリンクを辿って法令文書へアクセス、フレームを選択し ( $browser->setFrameFocus() )、文書内容を取得 ( $browser->getContent() )、「最終更新」のテキストデータを抜き出す ( ここは単なる preg_match() )、というような流れで利用してます。

「セッションID(Cookie)の処理が必要」と書きましたが、上記のコードには、それらしい部分が無いのが分かりますか?

実は Cookie の取得や送出については、SimpleBrowser が勝手に行ってくれます。利用する側は、入力値や出力結果を気にすれば良いだけなので、セッションが絡んだ Web ページを遷移する必要がある場合など、かなり便利です。

何か、他にもイロイロと使えそうな気がしますよね!

さて、上記のコードを実行すると、次のような出力が得られるはずです。(実際には、法令はもっとたくさん調べていますが、この記事では省略しています)

法令名	最終改正	最終改正までの未施行法令
不正アクセス行為の禁止等に関する法律	平成一一年一二月二二日法律第一六〇号
著作権法	平成二一年七月一〇日法律第七三号	平成二十一年六月十九日法律第五十三号
個人情報の保護に関する法律	平成二一年六月五日法律第四九号
特定電子メールの送信の適正化等に関する法律	平成二一年六月五日法律第四九号

過去に調べた結果とこの出力とを比較して、改正日に差分があれば、何か変わっているはずですので、そこを詳しく調べます。

法令文書は、あまり馴染みのない表現方法で書かれている場合も多いですが、読んで行くと論理的思考やら読解力がアップするような気がしています。

何か、自分が気になる関係の法令文書を一度読んでみてはいかがでしょうか?

suzukiPHP,SimpleTest

Posted by suzuki