手机归属地查询
博客专区 > hi_jyf 的博客 > 博客详情
手机归属地查询
hi_jyf 发表于1年前
手机归属地查询
  • 发表于 1年前
  • 阅读 14
  • 收藏 1
  • 点赞 0
  • 评论 0

腾讯云 技术升级10大核心产品年终让利>>>   

      最近,小博在帮客户方营销系统中的微信平台做推荐会员注册赠送红包的功能时,客户提出对注册成功处于是否发送微信现金红包状态的被推荐人进行当前使用手机号归属地区限制,即只有被推荐人的手机号归属地区为指定地区时,被推荐人注册成功后,推荐人和被推荐人才有资格领取微信现金红包。所以,小博接手后当下要解决的问题之一是,如何识别被推荐人的手机号所属地区?因为涉及到三大运营商和各种虚拟运营商的不同号段,小编对此真的无能为力,无法自行写出解决该问题的demo,于是只能大海捞针,寻找提供该解决方案的服务开放平台,经过不懈努力,最终找到了这么几家。

    首先是大厂百度APIStore。 不收费,暂不限制峰值,大规模应用调用只需邮件apistore报备应用和联系人信息,否则视为恶意攻击禁止访问。 具体实现如下:

1、配置信息:StoreApi.java

	/** http://apistore.baidu.com/,手机归属地查询 **/

	public static final String API_KEY = "";
	// 查询手机号的归属地信息。不收费,暂不限制峰值,大规模应用调用只需邮件apistore报备应用和联系人信息,否则视为恶意攻击禁止访问
	public static final String MOBILENUMBER = "http://apis.baidu.com/apistore/mobilenumber/mobilenumber?phone=%s";

2、数据对象

基础:Ret.java(抽象,方便其他服务通用)

package com.web.api.baidu.apistore.model;

public class Ret {
	private int errNum;
	private String retMsg;

	public int getErrNum() {
		return errNum;
	}

	public void setErrNum(int errNum) {
		this.errNum = errNum;
	}

	public String getRetMsg() {
		return retMsg;
	}

	public void setRetMsg(String retMsg) {
		this.retMsg = retMsg;
	}

}

层级1:MobileNumber.java

package com.web.api.baidu.apistore.model;

public class MobileNumber extends Ret {
	MobileNumberRet retData;

	public MobileNumberRet getRetData() {
		return retData;
	}

	public void setRetData(MobileNumberRet retData) {
		this.retData = retData;
	}

}

层级2:MobileNumberRet.java

package com.web.api.baidu.apistore.model;

public class MobileNumberRet {
	private String phone; // 手机号码
	private String prefix; // 手机号码前7位
	private String supplier; // 运营商
	private String province; // 省份
	private String city; // 城市
	private String suit; // 电话卡型号

	public String getPhone() {
		return phone;
	}

	public void setPhone(String phone) {
		this.phone = phone;
	}

	public String getPrefix() {
		return prefix;
	}

	public void setPrefix(String prefix) {
		this.prefix = prefix;
	}

	public String getSupplier() {
		return supplier;
	}

	public void setSupplier(String supplier) {
		this.supplier = supplier;
	}

	public String getProvince() {
		return province;
	}

	public void setProvince(String province) {
		this.province = province;
	}

	public String getCity() {
		return city;
	}

	public void setCity(String city) {
		this.city = city;
	}

	public String getSuit() {
		return suit;
	}

	public void setSuit(String suit) {
		this.suit = suit;
	}

}

3、实现方法:StoreTool.java

	public static MobileNumber mobileNumber(String mobile) {
		String url = String.format(StoreApi.MOBILENUMBER, mobile);
		Map<String, Object> header = new HashMap<String, Object>();
		header.put("apikey", StoreApi.API_KEY);
		try {
			String result = HttpUtil.sendGetWithHeader(url, header);
			log.info("接口名称:StoreTool.mobileNumber,手机号:" + mobile + ",返回结果:"
					+ result);
			if (result != null && !"".equals(result)) {
				return GSON.fromJson(result, new TypeToken<MobileNumber>() {
				}.getType());
			}
		} catch (Exception e) {
			log.error("接口名称:StoreTool.mobileNumber,手机号:" + mobile
					+ ",返回结果:接口调用失败," + e.getMessage());
		}
		return null;
	}

    其次是土豪阿里,阿里有多个服务开放平台,其一是收费版的淘宝开放平台,但是操作流程比较繁琐,这里不做详述;其二是免费版的阿里云市场,0元充值10000次,等于免费无限续杯, 全国移动、联通、电信等手机号码归属地查询,上亿条数据量,更新及时、准确度高,比对ip138、百度、移动联通电信运营商官方数据,数据权威。 综合考虑,选择了阿里云市场服务。具体实现如下:

1、配置信息:StoreApi.java

	/** https://market.aliyun.com/data,手机归属地查询,10000次 **/

	public static final String ALI_APPKEY = "";
	public static final String ALI_APPSECRET = "";
	public static final String ALI_APPCODE = "";
	public static final String ALI_SHOUJI = "http://jshmgsdmfb.market.alicloudapi.com/shouji/query?shouji=%s";

2、数据对象

层级1:Shouji.java

package com.web.api.baidu.apistore.model;

public class Shouji {
	private String status;
	private String msg;
	private ShoujiResult result;

	public String getStatus() {
		return status;
	}

	public void setStatus(String status) {
		this.status = status;
	}

	public String getMsg() {
		return msg;
	}

	public void setMsg(String msg) {
		this.msg = msg;
	}

	public ShoujiResult getResult() {
		return result;
	}

	public void setResult(ShoujiResult result) {
		this.result = result;
	}

}

层级2:ShoujiResult .java

package com.web.api.baidu.apistore.model;

public class ShoujiResult {
	private String province;
	private String city;
	private String company;
	private String cardtype;
	private String areacode;

	public String getProvince() {
		return province;
	}

	public void setProvince(String province) {
		this.province = province;
	}

	public String getCity() {
		return city;
	}

	public void setCity(String city) {
		this.city = city;
	}

	public String getCompany() {
		return company;
	}

	public void setCompany(String company) {
		this.company = company;
	}

	public String getCardtype() {
		return cardtype;
	}

	public void setCardtype(String cardtype) {
		this.cardtype = cardtype;
	}

	public String getAreacode() {
		return areacode;
	}

	public void setAreacode(String areacode) {
		this.areacode = areacode;
	}

}

3、实现方法:StoreTool.java

	public static Shouji shouji(String mobile) {
		String url = String.format(StoreApi.ALI_SHOUJI, mobile);
		Map<String, Object> header = new HashMap<String, Object>();
		header.put("Authorization", "APPCODE " + StoreApi.ALI_APPCODE);
		try {
			String result = HttpUtil.sendGetWithHeader(url, header);
			log.info("接口名称:StoreTool.queryMobile,手机号:" + mobile + ",返回结果:"
					+ result);
			if (result != null && !"".equals(result)) {
				return GSON.fromJson(result, new TypeToken<Shouji>() {
				}.getType());
			}
		} catch (Exception e) {
			log.error("接口名称:StoreTool.queryMobile,手机号:" + mobile
					+ ",返回结果:接口调用失败," + e.getMessage());
		}
		return null;
	}

    本来想让BAT这哥仨团聚的,但是腾讯的服务开放平台实在是藏得太深,纵里寻她千百度也没能寻到一丝踪迹。最后找到名不见经传的小厂haoservice,听名字就知道服务水平很好,操作也不复杂,但是免费调用1000次,用完就收费,这是很让人遗憾的地方,毕竟是小厂,人家也是要生存的,可以理解。具体实现如下:

1、配置信息:StoreApi.java

	/** http://www.haoservice.com,手机归属地查询,1000次 **/

	public static final String HS_API_KEY = "0e940bc8b0da4e029948f9bec7315fc1";
	public static final String HS_MOBILE = "http://apis.haoservice.com/mobile?phone=%s&key=%s";

2、数据对象

层级1:Mobile.java

package com.web.api.baidu.apistore.model;

public class Mobile {
	private String error_code;
	private String reason;
	private MobileResult result;

	public String getError_code() {
		return error_code;
	}

	public void setError_code(String error_code) {
		this.error_code = error_code;
	}

	public String getReason() {
		return reason;
	}

	public void setReason(String reason) {
		this.reason = reason;
	}

	public MobileResult getResult() {
		return result;
	}

	public void setResult(MobileResult result) {
		this.result = result;
	}

}

层级2:MobileResult.java

package com.web.api.baidu.apistore.model;

public class MobileResult {
	private String province;
	private String city;
	private String areacode;
	private String zip;
	private String company;
	private String card;

	public String getProvince() {
		return province;
	}

	public void setProvince(String province) {
		this.province = province;
	}

	public String getCity() {
		return city;
	}

	public void setCity(String city) {
		this.city = city;
	}

	public String getAreacode() {
		return areacode;
	}

	public void setAreacode(String areacode) {
		this.areacode = areacode;
	}

	public String getZip() {
		return zip;
	}

	public void setZip(String zip) {
		this.zip = zip;
	}

	public String getCompany() {
		return company;
	}

	public void setCompany(String company) {
		this.company = company;
	}

	public String getCard() {
		return card;
	}

	public void setCard(String card) {
		this.card = card;
	}

}

3、实现方法:StoreTool.java

	public static Mobile mobile(String mobile) {
		String url = String.format(StoreApi.HS_MOBILE, mobile,
				StoreApi.HS_API_KEY);
		try {
			String result = HttpUtil.sendGet(url);
			log.info("接口名称:StoreTool.mobile,手机号:" + mobile + ",返回结果:" + result);
			if (result != null && !"".equals(result)) {
				return GSON.fromJson(result, new TypeToken<Mobile>() {
				}.getType());
			}
		} catch (Exception e) {
			log.error("接口名称:StoreTool.mobile,手机号:" + mobile + ",返回结果:接口调用失败,"
					+ e.getMessage());
		}
		return null;
	}

    读到这里,大家心中可能有疑惑了,只是要解决手机号归属地区查询问题,干嘛费这么大劲找这么多的服务开放平台,搞收藏啊?其实,这也正是小博在开发过程中挥之不去的痛,腾讯的没用过,百度,阿里这些大厂土豪虽然免费,但是用起来的效果不甚理想,俗话说,一分钱一分货,免费的东西质量上肯定是参差不齐的,使用的过程中幺蛾子一波一波的向小博袭来,伤心劳神之后,小博只得找一些靠谱的收费服务商,还要考虑到成本,最后选择了最后那家小厂,虽然说也有一些小问题,但是总体运行良好,还算经济实惠(PS:本人不是广告商)。

    总结:天下没有免费的午餐。

 

备注:本帖来自hi_jade,本着程序员的专业精神学习、整理、编写、分享,并持续完善,知识无价,请以诚实严谨的态度对待本文,尊重他人劳动成果,如转载请注明来源,欢迎批评指正!

代码地址:https://github.com/github-jade/myweb/tree/develop/src/main/java/com/web/api/baidu/apistore
个人博客地址:https://my.oschina.net/jiangyf
GitHub地址:https://github.com/github-jade

 

标签: 手机归属地 api
共有 人打赏支持
粉丝 2
博文 16
码字总数 10748
×
hi_jyf
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: