はじめに
昨今、第三者サービスとかになったりすると面倒そうなので・・
あと、サービスが終了したりした時のおぼえがきです。
YubinBango.jsとは
郵便番号を検索できて、microformats2仕様のclass記述で定義できます。
classを指定するだけで動作するので便利です。
https://github.com/yubinbango/yubinbango
例)
<script src="https://yubinbango.github.io/yubinbango/yubinbango.js" charset="UTF-8"></script>
<form class="h-adr">
<span class="p-country-name" style="display:none;">Japan</span>
〒<input type="text" class="p-postal-code" size="8" maxlength="8"><br>
<input type="text" class="p-region p-locality p-street-address p-extended-address" /><br>
</form>
今回は上記のhttps://yubinbango.github.io/からの呼び出しをやめてローカルに持っていく方法です。
ローカルにもっていくデメリットは、郵便番号情報を自前で更新しなくてはいけません。
yubinbango.jsを変更する
圧縮されているので下記の記述を探します。
データは下記に保存されています。
this.URL="https://yubinbango.github.io/yubinbango-data/data",
githubから下記からダウンロードできます。
https://github.com/yubinbango/yubinbango-data
ダウンロード後、自分のローカル場所を決めて保存します。
下記を保存したパスもしくは、変数で
this.URL="https://yubinbango.github.io/yubinbango-data/data",
変数例
this.URL=base_zipdata,
変更後の設定例
変数にしておけばhtmlだけで修正が可能ですね。
<script src="お好みのパス/yubinbango/yubinbango.js" charset="UTF-8"></script>
<script>
var base_zipdata="お好みのパス/yubinbango/data/";
</script>
問題点
YubinBango.jsのメリットである郵便番号の自動更新が、自前やらないといけないので・・・
日本郵便から下記の2つをダウンロードしてきます。
日本郵便のデータでは、"以下に掲載がない場合"とか不要なデータが含まれているので削除してデータを作成する必要があります・・
https://www.post.japanpost.jp/zipcode/dl/kogaki/zip/ken_all.zip
https://www.post.japanpost.jp/zipcode/dl/jigyosyo/zip/jigyosyo.zip
日本郵便のデータすでに加工したものが下記サイトで公開されています。こちらもサービスが終了したりした時・・・とかあるので
http://zipcloud.ibsnet.co.jp/
自前でつくる
こういうのって、perlでつくると楽しいですね。
use strict;すると動かないかも・・
LWP::UserAgentが必要なサーバーもあるかも・・
自動取得して、サイズを見て実行します。1日1回cronとか・・
今のままだと。実行するたびに・・日本郵便に迷惑になったりするので、プログラムで1日1回のロジックいれてくださいね。
なんとなく、githubと同じ感じになっています。
perl なので改行コードlfで郵便番号データがsjisなので気をつけてくださいね。
#!/usr/bin/env perl
use Encode;
use LWP::UserAgent;
use Archive::Zip;
my @ZIP_RECORD = (
"z_jis_code",
"z_old_zip",
"z_zip",
"z_pref_kana",
"z_city_kana",
"z_town_kana",
"z_pref",
"z_city",
"z_town",
"z_two_flg",
"z_aza_flg",
"z_cyo_flg",
"z_dbl_flg",
"z_up_flg",
"z_reason_flg",
);
my @OFFICE_RECORD = (
"o_jis_code",
"o_office_kana",
"o_office",
"o_pref",
"o_city",
"o_town",
"o_address",
"o_zip",
"o_old_zip",
"o_station",
"o_class",
"o_dbl_flg",
"o_edit_flg",
);
my @JSON_RECORD = (
"j_zip_key",
"j_pref",
"j_zip",
"j_city",
"j_town",
"j_address",
);
our ($z_jis_code,$z_old_zip,$z_zip,$z_pref_kana,$z_city_kana,$z_town_kana,$z_pref,$z_city,$z_town,$z_two_flg,$z_aza_flg,$z_cyo_flg,$z_dbl_flg,$z_up_flg,$z_reason_flg,$o_jis_code,$o_office_kana,$o_office,$o_pref,$o_city,$o_town,$o_address,$o_zip,$o_old_zip,$o_station,$o_class,$o_dbl_flg,$o_edit_flg,$j_zip_key,$j_pref,$j_zip,$j_city,$j_town,$j_address)="";
my %pref_no = (
"北海道" => "1",
"青森県" => "2",
"岩手県" => "3",
"宮城県" => "4",
"秋田県" => "5",
"山形県" => "6",
"福島県" => "7",
"茨城県" => "8",
"栃木県" => "9",
"群馬県" => "10",
"埼玉県" => "11",
"千葉県" => "12",
"東京都" => "13",
"神奈川県" => "14",
"新潟県" => "15",
"富山県" => "16",
"石川県" => "17",
"福井県" => "18",
"山梨県" => "19",
"長野県" => "20",
"岐阜県" => "21",
"静岡県" => "22",
"愛知県" => "23",
"三重県" => "24",
"滋賀県" => "25",
"京都府" => "26",
"大阪府" => "27",
"兵庫県" => "28",
"奈良県" => "29",
"和歌山県" => "30",
"鳥取県" => "31",
"島根県" => "32",
"岡山県" => "33",
"広島県" => "34",
"山口県" => "35",
"徳島県" => "36",
"香川県" => "37",
"愛媛県" => "38",
"高知県" => "39",
"福岡県" => "40",
"佐賀県" => "41",
"長崎県" => "42",
"熊本県" => "43",
"大分県" => "44",
"宮崎県" => "45",
"鹿児島県" => "46",
"沖縄県" => "47"
);
my $line;
my @values;
my @news;
my $moto_path = "お好みのパス/moto";
my $js_datapath = "お好みのパス/yubinbango/data";
my $zip_downurl = "https://www.post.japanpost.jp/zipcode/dl/kogaki/zip/ken_all.zip";
my $jigyo_downurl = "https://www.post.japanpost.jp/zipcode/dl/jigyosyo/zip/jigyosyo.zip";
my $go_run;
my $i;
$go_run = 0;
my ($oldsize,$zipfile,$zip_arc,@zips,$size);
my $zip_key;
my $downurl = $zip_downurl;
my $file = $moto_path.'/ken_all.zip';
my $ua = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36 Edg/79.0.309.54';
my $timeout = '10';
my $lwp = LWP::UserAgent->new( agent => $ua, timeout => $timeout );
my $res = $lwp->get( $downurl, ':content_file' => $file );
if($res->is_success) {
$oldsize = -s "$moto_path/KEN_ALL.CSV";
$zipfile = $moto_path."/ken_all.zip";
$zip_arc = Archive::Zip->new($zipfile);
@zips = $zip_arc->memberNames();
foreach (@zips) {
$zip_arc->extractMember($_, "$moto_path/$_");
}
$size = -s "$moto_path/KEN_ALL.CSV";
if($size != $oldsize) {
$go_run = 1;
}
}
$downurl = $jigyo_downurl;
$file = $moto_path.'/jigyosyo.zip';
$ua = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36 Edg/79.0.309.54';
$timeout = '10';
$lwp = LWP::UserAgent->new( agent => $ua, timeout => $timeout );
$res = $lwp->get( $downurl, ':content_file' => $file );
if($res->is_success) {
$oldsize = -s "$moto_path/JIGYOSYO.CSV";
$zipfile = $moto_path."/jigyosyo.zip";
$zip_arc = Archive::Zip->new($zipfile);
@zips = $zip_arc->memberNames();
foreach (@zips) {
$zip_arc->extractMember($_, "$moto_path/$_");
}
$size = -s "$moto_path/JIGYOSYO.CSV";
if($size != $oldsize) {
$go_run = 1;
}
}
if($go_run == 0) {
exit;
}
@news = ();
open(DBDATA,"$moto_path/JIGYOSYO.CSV");
while ($line = ) {
$line .= while ($line =~ tr/"// % 2 and !eof(DBDATA));
$line =~ s/(?:\x0D\x0A|[\x0D\x0A])?$/,/;
@values = map {/^"(.*)"$/s ? scalar($_ = $1, s/""/"/g, $_) : $_} ($line =~ /("[^"]*(?:""[^"]*)*"|[^,]*),/g); #?damyコメント
for($i=0;$i <= $#OFFICE_RECORD;$i++) {
{no strict;${$OFFICE_RECORD[$i]} = $values[$i]};
}
$zip_key = substr($o_zip, 0, 3);
push(@news,"$zip_key\t$o_pref\t$o_zip\t$o_city\t$o_town\t$o_address");
}
close(DBDATA);
open(DBDATA,"$moto_path/KEN_ALL.CSV");
while ($line = ) {
$line .= while ($line =~ tr/"// % 2 and !eof(DBDATA));
$line =~ s/(?:\x0D\x0A|[\x0D\x0A])?$/,/;
@values = map {/^"(.*)"$/s ? scalar($_ = $1, s/""/"/g, $_) : $_} ($line =~ /("[^"]*(?:""[^"]*)*"|[^,]*),/g); #?damyコメント
for($i=0;$i <= $#ZIP_RECORD;$i++) {
{no strict;${$ZIP_RECORD[$i]} = $values[$i];}
}
$z_town =~ s/(高層棟)//g;
$z_town =~ s/((.*)階)$/$1階/g;
$z_town =~ s/([^()]*$//g;
$z_town =~ s/以下に掲載がない場合//g;
$z_town =~ s/一円$//g;
$z_town =~ s/第(.*)地割~第(.*)地割//g;
$z_town =~ s/(.*)の次に番地がくる場合//g;
$zip_key = substr($z_zip, 0, 3);
push(@news,"$zip_key\t$z_pref\t$z_zip\t$z_city\t$z_town");
}
close(DBDATA);
my @lists = sort by_sort @news;
my %DBL = ();
my $json_part = "";
my $cmpkey = "zzzzzz";
my $list;
foreach $list (@lists) {
my @rec = split(/\t/,$list);
for($i=0;$i <= $#JSON_RECORD;$i++) {
{no strict 'refs';${$JSON_RECORD[$i]} = $rec[$i];}
}
if($j_zip_key ne $cmpkey) {
if($cmpkey ne "zzzzzz") {
$json_part =~ s/,$//g;
Encode::from_to($json_part, "cp932", "utf8");
my $outjsfile = $js_datapath."/".$cmpkey.".js";
open(DBDATA,">$outjsfile");
print DBDATA '$yubin({'.$json_part.'});'."\n";
close(DBDATA);
$json_part="";
}
$cmpkey = $j_zip_key;
}
if(!$DBL{$j_zip}) {
if($j_address) {
$json_part .= "\"$j_zip\":[$pref_no{$j_pref},\"$j_city\",\"$j_town\",\"$j_address\"],";
} else {
$json_part .= "\"$j_zip\":[$pref_no{$j_pref},\"$j_city\",\"$j_town\"],";
}
}
$DBL{$j_zip} = 1;
}
if($json_part) {
$cmpkey = $j_zip_key;
$json_part =~ s/,$//g;
Encode::from_to($json_part, "cp932", "utf8");
my $outjsfile = $js_datapath."/".$cmpkey.".js";
open(DBDATA,">$outjsfile");
print DBDATA '$yubin({'.$json_part.'});'."\n";
close(DBDATA);
}
sub by_sort
{
my (@alist,@blist);
@blist = split(/\t/,$b);
@alist = split(/\t/,$a);
$alist[2] cmp $blist[2]; #昇順 郵便番号がソート番号
}
さいごに
改正個人情報保護法の仮名加工情報とか。。個人関連情報とか・・・サーバーのログとかってどうなるんですかね・・教えてえらいひと・・