YubinBango.jsをローカルで動かす

らら
らら

はじめに

昨今、第三者サービスとかになったりすると面倒そうなので・・

あと、サービスが終了したりした時のおぼえがきです。

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];	#昇順	郵便番号がソート番号
}

さいごに

改正個人情報保護法の仮名加工情報とか。。個人関連情報とか・・・サーバーのログとかってどうなるんですかね・・教えてえらいひと・・

関連記事