有时候会接到“打后马上就挂”的匿名电话,有时候没注意,手机上面经常出现几个“未接电话”,这时就想知道到底从哪个地方打来的,心里有个底。 一般都是通过ip138.com查询的,查的次数多了,难免感觉太麻烦了,于是想到用Perl自己写一个程序来查询,当然原理还是远程调用ip138.com的HTTP请求。 脚本如下(querymb.pl) #!/usr/bin/perl use strict; use Encode qw/encode decode/; use LWP::UserAgent; my ($mobile,$url,$ua,$resp,$line); $mobile = $ARGV[0]; die "/nUsage: querymb.pl <mobile number>/n/n" if (! $mobile); #### HTTP 请求地址 $url = "http://www.ip138.com:8080/search.asp"; $ua = LWP::UserAgent->new(); ### 超时时间 $ua->timeout(10); ### 通过 POST 方法发送请求 $resp = $ua->post($url, { "mobile" => $mobile, "action" => "mobile" }); if (! $resp->is_success) { die "ERR: " . $resp->status_line . "/n"; } my ($geo,$type,$found_geo,$found_type); foreach (split(//r/,$resp->content)) { #### 由于语言环境是UTF-8,而返回的数据是 GB2312 编码,故需要转换下编码 #### 如果您的语言环境是 GB2312,请注释下面这行 $line = encode("utf-8",decode("euc-cn",$_)); #### 找到归属地关键字 if ($line =~ /卡号归属地/) { $found_geo = 1; next; } #### 找到卡类型关键字 elsif ($line =~ /卡.*类.*型/) { $found_type = 1; next; } ### 获取归属地信息 if ($found_geo) { $geo = $line; Encode::_utf8_off($geo); $geo =~ s/^/s+<TD.*>(.*)<//TD>/$1/g; $found_geo = 0; $geo =~ s/ //g; next; } #### 获取卡信息 if ($found_type) { $type = $line; Encode::_utf8_off($type); $type =~ s/^/s+<TD.*>(.*)<//TD>/$1/g; $type =~ s/ //g; last; } } print "手机号码: $mobile/n"; print "卡号归属地: $geo/n"; print "卡类型: $type/n"; 查询例子(偶以前的手机号码,呵呵~~~~): # querymb.pl 13476051709 手机号码: 13476051709 卡号归属地: 湖北武汉 卡类型: 移动全球通卡