【原创】Java实现手机号码归属地查询

网络上已经有很多的手机号码归属地查询的API接口,但是这些接口总是有一些大大小小的缺陷。

总结一下这些缺陷:

1、要直接将它的搜索框链接形式粘到自己的页面,点击查询的时候还要跳转到他们的网站来展示归属地结果

2、提供接口的API,一般都要求付费,或者一天只有免费的限定查询次数

3、有些博客文档中的API已经过于老旧,尝试的时候,已经404Not Found的了

所以写篇博客,供正在做手机归属地查询的小伙伴参考。

思路:

  ->我找到一个拍拍网的接口,可以通过curl直接传手机号码来进行查询,并且会返回给我们一个类似json的字符串(其实不是Json,就是一些字符串里面有我们想要的信息)

  ->java通过HttpURLConnection去连接这个地址,并且抓取到所返回页面的所有字符串,这些字符串中就含有上述的类json的结果

  ->那我们拿到这个字符串,解析出我们想要的通讯商和省份城市等信息就可以了

说明:

  拍拍网查手机归属地地址:http://virtual.paipai.com/extinfo/GetMobileProductInfo?mobile=15850781443&amount=10000

  参数说明:mobile:手机号码

       amount:未知(但是必须要有,不然查询不出结果)

  返回值:类似JSON的字符串

具体实现:

  

 1 /**
 2 * @ClassName: HttpClientUtil
 3 * @Description: html页面抓取素有字符串工具类
 4 * @author: chenkaideng
 5 * @date 2015年11月2日 下午3:55:49
 6  */
 7
 8 import java.io.BufferedReader;
 9 import java.io.InputStream;
10 import java.io.InputStreamReader;
11 import java.net.HttpURLConnection;
12 import java.net.URL;
13 import org.apache.commons.io.IOUtils;
14 import org.apache.commons.lang3.StringUtils;
15 import org.slf4j.Logger;
16 import org.slf4j.LoggerFactory;
17
18
19 public class HttpClientUtil {
20     private static final Logger logger = LoggerFactory.getLogger("HttpClient");
21     private String readInputStream(InputStream instream, String charest) throws Exception {
22         StringBuilder sb = new StringBuilder();
23         try(
24                 InputStreamReader isr = new InputStreamReader(instream, charest);
25                 BufferedReader reader = new BufferedReader(isr);) {
26             String line = null;
27             while ((line = reader.readLine()) != null) {
28                 sb.append(line);
29             }
30         }
31         return sb.toString();
32
33     }
34
35     public String getWebcontent(String webUrl, String charest) {
36         if (StringUtils.isEmpty(webUrl))
37             return null;
38         int response = -1;
39         HttpURLConnection conn = null;
40         try {
41             URL url = new URL(webUrl);
42             conn = (HttpURLConnection) url.openConnection();
43             conn.setRequestMethod("GET");
44             conn.setReadTimeout(60 * 2000);
45             conn.setConnectTimeout(10 * 1000);
46             conn.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36");
47             conn.setDoOutput(true);
48             conn.connect();
49             response = conn.getResponseCode();
50             if (response == 200) {
51                 InputStream im = null;
52                 try {
53                     im = conn.getInputStream();
54                     return readInputStream(im, charest);
55                 } finally {
56                     IOUtils.closeQuietly(im);
57                 }
58             }
59             return null;
60         } catch (Exception e) {
61             logger.error(String.format("下载到文件出错[url=%s][%s][responsecode=%d]", webUrl, e.getMessage(), response));
62             return null;
63         } finally {
64             if(conn != null) {
65                 conn.disconnect();
66                 conn = null;
67             }
68         }
69     }
70 }

  然后调用上述的工具类,带着手机号码参数去访问拍拍的接口地址,抓到页面,解析出归属地信息就可以了

 1 import com.alibaba.fastjson.JSONObject;
 2 /**
 3  *
 4 * @ClassName: GetMobileMessage
 5 * @Description: TODO
 6 * @author [email protected]
 7 * @date 2016年1月28日 下午2:40:56
 8 *
 9  */
10 public class GetMobileMessage{
11     private static final String PHONE_PLACE_API_URL="http://virtual.paipai.com/extinfo/GetMobileProductInfo";
12     /**
13      *
14     * @Title: getMobilePlace
15     * @Description: 获取手机归属地信息
16     * @param @param mobile
17     * @param @return
18     * @return String
19     * @throws
20      */
21     public String getMobilePlace(String mobile){
22         HttpClientUtil util = new HttpClientUtil();
23         String[] strings={"",""};
24         try {
25             //访问拍拍的查询接口
26             String mobileMessage = util.getWebcontent(PHONE_PLACE_API_URL+"?mobile="+mobile+"&amount=10000", "GB2312");
27             strings = mobileMessage.split(";");
28             //(页面获取到的消息,除了这些,还有一些html语句)
29 //            string[0]="({mobile:‘15850781443‘,province:‘江苏‘,isp:‘中国移动‘,stock:‘1‘,amount:‘10000‘,maxprice:‘0‘,minprice:‘0‘,cityname:‘南京‘})";
30             mobileMessage = strings[0];
31             JSONObject jsonObject = JSONObject.parseObject(mobileMessage.substring(1, mobileMessage.length()-1));
32             //解析出省份和city和运营商
33             String province = jsonObject.getString("province");
34             String cityname = jsonObject.getString("cityname");
35             String isp = jsonObject.getString("isp");
36             return isp+"&nbsp"+province+cityname;
37         } catch (Exception e) {
38             e.printStackTrace();
39 //            logger.error(strings[0]+e.toString());
40             return "";
41         }
42     }
43 }

这样就可以免费得到手机号的归属地信息了,而且可以作为自己的一个工具方法使用,大家爱怎么封装就怎么封装,

不然查个归属地还要收费还要给别人网站做广告,实属不爽啊。

但是唯一的缺陷就是,拍拍要是把这个地址一改,就得跟着改咯。

不过没关系,都给整这个思路,什么地址什么接口都能整出归属地。

时间: 2024-07-31 14:17:08

【原创】Java实现手机号码归属地查询的相关文章

Java调用免费的WebService示例【天气预报】【国内手机号码归属地查询】

1.免费的WebService地址:http://www.webxml.com.cn/zh_cn/index.aspx 提供了例如:天气预报,手机归属地查询等很多Web服务. 2.调用天气预报服务示例: 使用JDK自带的wsimport命令生成客户端代码: wsimport -keep http://webservice.webxml.com.cn/WebServices/WeatherWS.asmx?wsdl 发现抛出如下异常: 后来在网上找到了http://blog.sina.com.cn/

java 手机号码归属地查询

下面是利用第三方接口实现手机号码归属地查询 (复制请标明出处或留言) package com.test.yyc; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.MalformedURLException; import java.net.URL; import java.net.URLConnection; import ja

百度手机号码归属地查询api与返回json处理

前天无意间在网上看到百度ApiStore,然后好奇就进去看了看.正好最近在某博培训Android,刚学到java基础.抱着锻炼的心态选择手机号码归属地查询api进行练手.api地址 (http://apis.baidu.com/apistore/mobilephoneservice/mobilephone).百度官方已经给出请求示例 .我们只需要对请求结果json进行解析就可以. Java请求示例: 1 String httpUrl = "http://apis.baidu.com/apisto

本地的手机号码归属地查询-oracle数据

最近做的项目中,有个功能是手机归属地查询,因为项目要在内网下运行,所以不能用提供的webservice,只好在网上找手机归属地的数据,很多都是access的,我们的项目是用oracle,只好自己转吧,转过来的提供到网上,方便大家使用.数据还是比较新的,是2014年的. 下面是部分代码,如果需要全部代码,可以直接下载. TabMobileServiceImpl.java package com.zhouyu.service.impl; import java.util.List; import o

手机号码归属地查询免费api接口代码

根据手机号码查询用户的卡类型.运营商.归属地.区域等信息. 手机归属地实体类 package org.wx.xhelper.model; /** * 手机归属地 * @author wangxw * @version 1.0 * @date Jul 9, 2014 4:03:04 PM */ public class PhoneBelong { // 电话号码 private String phone; // 手机号码所在地区区号 private String area; // 号码卡类型 pr

Android中手机号码归属地查询实现

这部分是昨天学习的,但是因为眼睛超负荷所以拖到现在,以后要合理规划时间. 目前手机里面的号码归属地查询主要是通过两种方式:1.联网查询,2.匹配本机归属地数据库. 我认为两种结合方式最好,在本地数据库中匹配不到的在进行联网查询,能大大增加匹配效果,并且不用过于增加本地数据库容量而增大安装包大小. 步骤:1.开启软件的时候把数据库从assets目录拷贝到files目录下,如果已存在,则不用重新拷贝. 2.实现界面. 3.实现工具类PhoneAddressUtils的getPhoneAddress(

手机号码归属地查询api接口

淘宝网 API地址: http://tcc.taobao.com/cc/json/mobile_tel_segment.htm?tel=15850781443参数: tel:手机号码 返回:JSON 拍拍 API地址: http://virtual.paipai.com/extinfo/GetMobileProductInfo?mobile=15850781443&amount=10000&callname=getPhoneNumInfoExtCallback参数: mobile:手机号码

手机号码归属地查询接口大全(七种)

淘宝网 API地址: http://tcc.taobao.com/cc/json/mobile_tel_segment.htm?tel=15850781443 参数: tel:手机号码 返回:JSON 拍拍 API地址: http://virtual.paipai.com/extinfo/GetMobileProductInfo?mobile=15850781443&amount=10000&callname=getPhoneNumInfoExtCallback 参数: mobile:手机

ajax手机号码归属地查询

<input ....手机号码框><input type="button" onclick="checkPhone()"> function checkPhone(){var zjsjhm = docunent.get...//获取手机号码if(searchAreaMobilePhoneFromIndex(zjsjhm)){//验证手机号 searchMobilePhoneGuiSuArea(zjsjhm);//查询手机归属地 }:} //验