IP定位,腾讯定位周边数据分享
这些天有空,把IP查询及IP模糊定位的工具更新了一遍,开始用高德,写完后发现查询几次要“阿里式滑动”验证,故放弃了。
针对https://www.sojson.com/ip/ 工具,我真心怕你们“程序员”
去爬虫输出结果,请看到这些分享,自己实现,有难点可以咨询我,不要采用爬虫的方式去实现,因为本站工具颇多,基本上好多工具都被程序员爬虫或者模拟正常使用者大量不正常使用,而且好多“素质低”
完全不管本站死活,造成本站间接性很卡。在此恳求就算用爬虫去爬取别人的东西来实现某一个业务点,那也请节制一点,做好优化,如缓存等等,还是那句话,不要把免费的资源不当资源。
腾讯IP定位申请
在腾讯地图开放平台“https://lbs.qq.com/”用你的QQ号或者微信号登陆,填写个人信息,手机号及邮箱认证,就有几万的额度,有企业资质审核通过就会有几十万的免费额度。
创建一个KEY:https://lbs.qq.com/console/mykey.html?console=mykey
配额查看管理:https://lbs.qq.com/console/myquota.html?console=myquota
点击提升配额需要填写企业信息,有30万的免费额度,一般的都够用了,填写完毕后会3个工作日审核
腾讯IP定位Java代码实现
Http.Response response = Http.create("http://apis.map.qq.com/ws/location/v1/ip?key=你的key&ip=%s", ip)
.get()
.timeout(2)
.send().getResponse();
if(response!=null && response.getStatus() == 200){
String result = response.getResult();
JSONObject json = JSONObject.fromObject(result);
//判断是否无法精准定位
if(json.getInt("status") == 0 ){//可以定位
JSONObject location = json.getJSONObject("result").getJSONObject("location");
//不是默认定位值
String lng = location.getString("lng");
String lat = location.getString("lat");
//腾讯定位要是定位不到,就是默认北京的这个"116.407526"和"39.90403"
if(!("116.407526".equals(lng) && "39.90403".equals(lat))){
try {
//开始精准定位
Http.Response jresponse = Http.create("https://apis.map.qq.com/ws/geocoder/v1/?location=%s,%s&get_poi=1&key=你的key", lat,lng)
.head("Host","map.qq.com")
.head("Accept","*/*")
.head("Accept-Encoding","gzip, deflate, br")
.head("Accept-Language","zh-CN,zh;q=0.9,en;q=0.8")
.head("Cache-Control","no-cache")
.head("Referer","https://map.qq.com/")
.head("User-Agent","Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36")
.head("X-Requested-With","XMLHttpRequest")
.get()
.timeout(2)
.send().getResponse();
if(jresponse!=null && jresponse.getStatus() == 200 && StringUtils.isNotBlank(jresponse.getResult())){
JSONObject jjson = JSONObject.fromObject(jresponse.getResult());
//成功
if(Constant.S_ZERO.equals(jjson.optString("status"))){
JSONObject resultJSON = jjson.optJSONObject("result");
if(null != resultJSON && resultJSON.size() > 0){
bo.setAddress(resultJSON.optString("address"));
JSONObject ad_info = resultJSON.optJSONObject("ad_info");
bo.setDistrictadcode(ad_info.optString("adcode"));
JSONArray poiList = resultJSON.optJSONArray("pois");
//转换
if(null != poiList && poiList.size() > 0){
List<IPBo.PoiList> poiLists = new ArrayList<>();
poiList.forEach(e-> poiLists.add(new IPBo.PoiList(e)));
bo.setPoiLists(poiLists);
}
//地区详细详细
JSONObject address_component = resultJSON.optJSONObject("address_component");
// "nation":"中国",
// "province":"湖南省",
// "city":"长沙市",
// "district":"岳麓区",
// "street":"岳麓大道",
// "street_number":"岳麓大道218号"
bo.setNation(address_component.optString("nation"));
bo.setProvince(address_component.optString("province"));
//市
bo.setCity(address_component.optString("city"));
//区,可能为空字串
bo.setDistrict(address_component.optString("district"));
//街道
bo.setStreet(address_component.optString("street"));
//门牌,可能为空字串
bo.setStreetNumber(address_component.optString("street_number"));
}
}
}
//开启精准定位
bo.setLocation(Boolean.TRUE);
} catch (Exception e) {
log.error("IP 查询精准定位请求异常,ip:%s,url:%s",ip,urlOrIp,e);
cache = false;
}
}
}
}
//数据不全,虽然成功但是不缓存
if(cache){
//存储半个小时
VCache.setex(historyKey,bo,1800);
}
对应的业务BO实体
@Data
public class IPBo implements Serializable {
private static final long serialVersionUID = -1052580448111049751L;
private String ip ;//ip
private String address;//地址
private String localAddress;//本地获取的地址
private String baiduAddress;//百度获取的地址
private String ua;//浏览器信息
private String lg;//语言
private String window;//系统
private String browser;//什么浏览器
private int type;//300:请输入正确的Ip或域名,500:系统繁忙错误
//国家
private String nation;
//省
private String province;
//市
private String city;
//区
private String district;
//邮编
private String adcode;
//区号
private String areacode;
//精准区号
private String districtadcode;
//街道
private String street;
//门牌,可能为空字串
private String streetNumber;
private String message;
//定位建筑 集合
private List<PoiList> poiLists;
//是否精准定位
private Boolean location = Boolean.FALSE;
public IPBo(String ip,int type,String message) {
this.type = type;
this.message = message;
this.ip = ip;
}
public IPBo() {
}
@Data
public static class PoiList implements Serializable {
private static final long serialVersionUID = -1052180448111049751L;
//电话
private String tel;
//"岳麓区政协委员会",
private String title;
//"望岳街道金星北路一段517号",
private String address;
//地址的类型 政府机构及社会团体;政府机关;区县级政府及事业单位",
private String category;
//坐标
private String lt;
//距离
private String distance;
public PoiList(){
}
public PoiList(Object e){
JSONObject elem;
if(null != e && e instanceof JSONObject){
elem = (JSONObject) e;
}else{
elem = JSONObject.fromObject(e);
}
this.tel = elem.optString("tel");
this.title = elem.optString("title");
this.address = elem.optString("address");
this.category = elem.optString("category");
if(StringUtils.contains(this.category,":")){
this.category = this.category.replaceAll(":","/");
}
this.distance = elem.optString("_distance");
JSONObject location = elem.optJSONObject("location");
if(null != location){
this.lt = String.format("%s/%s",location.optString("lat"),location.optString("lng"));
}
}
}
}
JSON使用包为net.sf.json.JSONObject,地址为:https://www.sojson.com/blog/20.html
分享高德2个有用的地址:
https://www.amap.com/service/regeo?longitude=112.90131&latitude=28.20051
https://www.amap.com/service/getHistory?type=301
版权所属:SO JSON在线解析
原文地址:https://www.sojson.com/blog/308.html
转载时必须以链接形式注明原始出处及本声明。
如果本文对你有帮助,那么请你赞助我,让我更有激情的写下去,帮助更多的人。