本帖最后由 dormant 于 2016-12-13 23:47 编辑
0x00介绍
高精度IP定位目前只支持WiFi链接上网情况下的使用,其原理是实时建库和百度大数据分析挖掘,因此相比于普通IP定位能返回更加精确的定位结果。 目前相关参数如下: 成功率:综合定位成功率 65% 精度:90% 误差 80m 以内;95% 误差 350m 如果高精度定位失败的话,直接返回普通IP定位结果。 高精度IP定位服务和普通IP定位服务并存,两个服务的配额不同,定位效果也不同,请开发者结合自身业务合理选择。
0x01准备工具 1.申请请密钥(AK),作为访问API的依据 2.下载HttpClient.jar,用于进行http/https请求 httpclient_jar.zip
3.下载json-ib,用于处理json json-lib.rar
0x02编写代码
1.编写实体类用于处理json返回数据 public class IpEntity { //需要定位的ip private String ip; public String getIp() { return ip; } public void setIp(String ip) { this.ip = ip; } //纬度坐标 private String lat; //经度坐标 private String lng; //详细地址 private String address; public String getLat() { return lat; } public void setLat(String lat) { this.lat = lat; } public String getLng() { return lng; } public void setLng(String lng) { this.lng = lng; } //定位时间 private String loc_time; //返回代码 private String error; public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } public String getLoc_time() { return loc_time; } public void setLoc_time(String loc_time) { this.loc_time = loc_time; } public String getError() { return error; } public void setError(String error) { this.error = error; }}2.编写方法,调用百度高精度定位API /*** ip定位* @param ip 需要定位的Ip* @return 地址实体对象* */public static IpEntity IpTest(String ip){ CloseableHttpClient httpClient = null; HttpGet httpGet = null; CloseableHttpResponse response = null; IpEntity ipEntity = null; try { httpClient = HttpClients.createDefault(); //String ip = "59.109.64.160"; String ak = "9w0bGND7tWoDQlbC2IGT3VGxe73rlEUG"; //请求url String url = "https://api.map.baidu.com/highacciploc/v1?qcip="+ip+"&ak="+ak+"&qterm=pc&extensions=1&coord=bd09ll&callback_type=json"; httpGet = new HttpGet(url); //System.out.println(httpGet.getURI()); //执行get请求 response = httpClient.execute(httpGet); //获取请求返回字符串 HttpEntity entity = response.getEntity(); //请求状态码 //System.out.println(response.getStatusLine()); if(entity != null){ //长度 //System.out.println("length:"+entity.getContentLength()); String tmp = EntityUtils.toString(entity); //将json字符串转换为json对象 JSONObject jsonObject = JSONObject.fromObject(tmp); //定位时间 String loc_time = JSONObject.fromObject(jsonObject.getString("result")).getString("loc_time"); //获取定位代码 161 位定位成功 String error = JSONObject.fromObject(jsonObject.getString("result")).getString("error"); //获取结构化地址 String address = JSONObject.fromObject(jsonObject.getString("content")).getString("formatted_address"); //纬度坐标 String lat = JSONObject.fromObject(JSONObject.fromObject(jsonObject.getString("content")).getString("location")).getString("lat"); //经度坐标 String lng = JSONObject.fromObject(JSONObject.fromObject(jsonObject.getString("content")).getString("location")).getString("lng"); ipEntity = new IpEntity(); ipEntity.setError(error); ipEntity.setIp(ip); ipEntity.setAddress(address); ipEntity.setLoc_time(loc_time); ipEntity.setLat(lat); ipEntity.setLng(lng); } } catch (Exception e) { e.printStackTrace(); return null; }finally{ try { response.close(); httpClient.close(); } catch (IOException e) { e.printStackTrace(); } } return ipEntity;}
3.编写main方法调用 /** * 测试方法 * @param args*/public static void main(String[] args) { IpEntity ipEntity = test.IpTest("59.109.64.160"); if(ipEntity != null){ //判断返回状态吗是否为161 定位成功 if(ipEntity.getError().equals("161")){ System.out.println("定位成功!"); System.out.println("定位ip为:"+ipEntity.getIp()); System.out.println("定位时间:"+ipEntity.getLoc_time()); System.out.println("具体位置:"+ipEntity.getAddress()); System.out.println("经度为:"+ipEntity.getLat()); System.out.println("维度为:"+ipEntity.getLng()); } }}
JAVA代码打包: |