文档章节

手机归属地查询

hi_jyf
 hi_jyf
发布于 2016/12/12 18:06
字数 1829
阅读 21
收藏 1
点赞 0
评论 0

      最近,小博在帮客户方营销系统中的微信平台做推荐会员注册赠送红包的功能时,客户提出对注册成功处于是否发送微信现金红包状态的被推荐人进行当前使用手机号归属地区限制,即只有被推荐人的手机号归属地区为指定地区时,被推荐人注册成功后,推荐人和被推荐人才有资格领取微信现金红包。所以,小博接手后当下要解决的问题之一是,如何识别被推荐人的手机号所属地区?因为涉及到三大运营商和各种虚拟运营商的不同号段,小编对此真的无能为力,无法自行写出解决该问题的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

 

© 著作权归作者所有

共有 人打赏支持
hi_jyf
粉丝 2
博文 16
码字总数 10748
作品 0
深圳
后端工程师

暂无相关文章

如何优雅的编程——C语言界面的一点小建议

我们鼓励在编程时应有清晰的哲学思维,而不是给予硬性规则。我并不希望你们能认可所有的东西,因为它们只是观点,观点会随着时间的变化而变化。可是,如果不是直到现在把它们写在纸上,长久以...

柳猫 ⋅ 32分钟前 ⋅ 0

从零手写 IOC容器

概述 IOC (Inversion of Control) 控制反转。熟悉Spring的应该都知道。那么具体是怎么实现的呢?下面我们通过一个例子说明。 1. Component注解定义 package cn.com.qunar.annotation;impo...

轨迹_ ⋅ 32分钟前 ⋅ 0

系统健康检查利器-Spring Boot-Actuator

前言 实例由于出现故障、部署或自动缩放的情况,会进行持续启动、重新启动或停止操作。它可能导致它们暂时或永久不可用。为避免问题,您的负载均衡器应该从路由中跳过不健康的实例,因为它们...

harries ⋅ 34分钟前 ⋅ 0

手把手教你搭建vue-cli脚手架-详细步骤图文解析[vue入门]

写在前面: 使用 vue-cli 可以快速创建 vue 项目,vue-cli很好用,但是在最初搭建环境安装vue-cli及相关内容的时候,对一些人来说是很头疼的一件事情,本人在搭建vue-cli的项目环境的时候也是...

韦姣敏 ⋅ 44分钟前 ⋅ 0

12c rman中输入sql命令

12c之前版本,要在rman中执行sql语句,必须使用sql "alter system switch logfile"; 而在12c版本中,可以支持大量的sql语句了: 比如: C:\Users\zhengquan>rman target / 恢复管理器: Release 1...

tututu_jiang ⋅ 58分钟前 ⋅ 0

Nginx的https配置记录以及http强制跳转到https的方法梳理

Nginx的https配置记录以及http强制跳转到https的方法梳理 一、Nginx安装(略) 安装的时候需要注意加上 --with-httpsslmodule,因为httpsslmodule不属于Nginx的基本模块。 Nginx安装方法: ...

Yomut ⋅ 今天 ⋅ 0

SpringCloud Feign 传递复杂参数对象需要注意的地方

1.传递复杂参数对象需要用Post,另外需要注意,Feign不支持使用GetMapping 和PostMapping @RequestMapping(value="user/save",method=RequestMethod.POST) 2.在传递的过程中,复杂对象使用...

@林文龙 ⋅ 今天 ⋅ 0

如何显示 word 左侧目录大纲

打开word说明文档,如下图,我们发现左侧根本就没有目录,给我们带来很大的阅读障碍 2 在word文档的头部菜单栏中,切换到”视图“选项卡 3 然后勾选“导航窗格”选项 4 我们会惊奇的发现左侧...

二营长意大利炮 ⋅ 今天 ⋅ 0

智能合约编程语言Solidity之线上开发工具

工具地址:https://ethereum.github.io/browser-solidity/ 实例实验: 1.创建hello.sol文件 2.调试输出结果

硅谷课堂 ⋅ 今天 ⋅ 0

ffmpeg 视频格式转换

转 Mp4 格式 #> ffmpeg -i input.avi -c:v libx264 output.mp4#> ffmpeg -i input.avi -c:v libx264 -strict -2 output.mp4#> ffmpeg -i input.avi -c:v libx264 -strict -2 -s 1......

Contac ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部