ようこそNICのホームページへ(なが〜い試運転中 from 2004年)
  • @nifty atnifty-ddns ddo.jp dip.jp   HP パソコン 健康 落語 海外 思うまま 電子工作
  • web上でIPアドレスから国名を調べる
    IP::country::fast (ローカルサーバー上のみ)

  • Last update:2020/09/15    Build:2020/09/15
  •  
    IP::Country::Fastを使って 国名を求めた。 今回ローカルサーバーのみですが、ウェブ上でIPアドレスから国名を求めるようにしました。
    ここです。

      perlで書いたcgiは以下のとおり

    #!/usr/bin/perl -w
    #
    # 2020/9/12 OK
    # /cgi-bin/ip_country-200912.cgi
    # 2020/9/13 --->
    #           国コードだけでなく
    #       国名も表示するように変更
    #    2020/9/14  OK
    #  file name : test-ip_country-200914-cgi-ok.txt
    #
    
    use strict; # 宣言した変数以外を使えなくする
    
    use lib '/home/user/.cpanm/work/1598918143.133026/IP-Country-2.28/lib/';
    
    use IP::Country::Fast;
    
    # 国コードと国名のデータ ---------------------------------
    my $c_code_file="/home/user/ipaddress/c_code_data.txt";
    my $c_name_file="/home/user/ipaddress/c_name_data.txt";
    
    my $i_count;
    my $i_count2;
    my $i_max=260;
    my $ip_line;
    my @c_code;
    my @c_name;
    my $country_name;
    my $country_code;
    
    
    my $ip_addr ;
    my $ip_addr2;
    
    
    $ip_addr = <STDIN>
    
      $ip_addr   =~/\d+\.\d+\.\d+\.\d+/ ;       # IP addressを パターンマッチ ex 192.168.0.1
      $ip_addr2=$& ;
     
    
    my $reg = IP::Country::Fast->new();
    my $country= $reg->inet_atocc($ip_addr2) ;
    
    
    # country code を 読み込む ----------------------------
    
    open IN, "<",$c_code_file || die "Error: data file not existed $!\n" ; #ファイルを入力で開く
    
    $i_count=0;
    while ($ip_line = <IN>) { # 記録されているIPアドレスを1行読み込む 空行でない場合、以下を実行
    
         $i_count=$i_count + 1 ;
         $c_code[$i_count]=$ip_line;
    
    }
    close IN ;
    
    
    # country name を 読み込む ----------------------------
    
    open IN, "<",$c_name_file || die "Error: data file not existed $!\n" ; #ファイルを入力で開く
    
    $i_count=0;
    while ($ip_line = <IN>) { # 記録されているIPアドレスを1行読み込む 空行でない場合、以下を実行
    
         $i_count=$i_count + 1 ;
         $c_name[$i_count]=$ip_line;
    
    }
    close IN ;
    
    
    
    #  ---------  国コードから国名を求める  ------------------
    
    $i_count2=0;
    for ($i_count=1 ; $i_count<=$i_max ;$i_count++ ) {
      $country_code =$c_code[$i_count];
      $country_code =~ s/\x0D?\x0A?$//; # 改行を除く
      if ( $country  eq $country_code ) {
         $i_count2=$i_count;
         last;
      }
    }
    
    if ( $i_count2==0 ) {
        $country_name="Error:該当する国名なし";
      }
      else {
        $country_name=$c_name[$i_count2];
      }
    
    
    #
    # ここからHTML出力 ##########################
    #
    print "Content-type: text/html\n\n";
    print <<EOM;
    
    
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html lang="ja">
    <head>
    	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    	<title>IPから国名を調べる</title>
    </head>
    <body>
    
    IPから国名を調べる<br><br>
    
    IP:$ip_addr2<br>
    国名コード:$country<br>
    国名:$country_name<br>
    
    <br><br><br>
    <a href="/analog/ip_country-200912.html" target="MAIN">IPから国名を調べる画面へ戻る</a><br><br>
    </body>
    </html>
    
    EOM
    

    Apache2のログ、IPアドレスから名前を調べる     HomePage     このページのトップ