java ip138_判读ip所在地(通过百度ip138的提供的服务) java实现
任務(wù)需要,希望根據(jù)一組ip地址來獲取其真實(shí)所在地。
忽然想起來之前使用百度的服務(wù)是可以通過ip地址查詢真實(shí)地址的,于是迅速在百度的搜索頁中找到了這個(gè)小工具。發(fā)現(xiàn)百度通過調(diào)用www.ip138.com/這個(gè)網(wǎng)站的服務(wù)來獲取真實(shí)地址。
在輸入欄輸入查詢按鈕,并點(diǎn)擊查詢按鈕,發(fā)現(xiàn)這個(gè)查詢服務(wù)是通過ajax實(shí)現(xiàn)的,請(qǐng)求的地址是?https://sp0.baidu.com/8aQDcjqpAAV3otqbppnN2DJv/api.php?query=123.123.192.255&co=&resource_id=6006&t=1433922612109&ie=utf8&oe=gbk&cb=op_aladdin_callback&format=json&tn=baidu&cb=jQuery110206955700272228569_1433922418817&_=1433922418822
返回的信息數(shù)據(jù)如下:
/**/jQuery110206955700272228569_1433922418817({"status":"0","t":"1433922612109","set_cache_time":"","data":[{"location":"北京市 聯(lián)通", "titlecont":"IP地址查詢", "origip":"123.123.192.255", "origipquery":"123.123.192.255", "showlamp":"1", "showLikeShare":1, "shareImage":1, "ExtendedLocation":"", "OriginQuery":"123.123.192.255", "tplt":"ip", "resourceid":"6006", "fetchkey":"123.123.192.255", "appinfo":"", "role_id":0, "disp_type":0}]});
看到返回的信息,就應(yīng)該發(fā)現(xiàn)一些有用的東西了吧。所以我們可以通過模擬向百度的服務(wù)器發(fā)送請(qǐng)求來獲取我們想要的所在地信息
事實(shí)在之后的嘗試中我發(fā)現(xiàn)url后的參數(shù)列表中有一部分完全用不到,于是我就刪減了部分不影響結(jié)果的參數(shù)
以java語言實(shí)現(xiàn)
獲取返回信息的方法
/*** 通過用戶ip獲取用戶所在地
*@paramuserIp
*@return
*/
publicString getUserLocation(String userIp)
{String url= "http://opendata.baidu.com/api.php?query=" +userIp;
url+= "&co=&resource_id=6006&t=1433920989928&ie=utf8&oe=gbk&format=json";
returnHttpRequest.sendGet(url);
}
HttpReqeuest的Get方法(使用urlConnection) 向指定的url發(fā)送get請(qǐng)求
public staticString sendGet(String url) {
String result= "";
BufferedReader in= null;try{
URL realUrl= newURL(url);//打開和URL之間的連接
URLConnection connection =realUrl.openConnection();//設(shè)置通用的請(qǐng)求屬性
connection.setRequestProperty("accept", "*/*");
connection.setRequestProperty("connection", "Keep-Alive");
connection.setRequestProperty("user-agent","Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");//建立實(shí)際的連接
connection.connect();//獲取所有響應(yīng)頭字段
Map> map =connection.getHeaderFields();//遍歷所有的響應(yīng)頭字段
for(String key : map.keySet()) {
System.out.println(key+ "--->" +map.get(key));
}//定義 BufferedReader輸入流來讀取URL的響應(yīng)
in = new BufferedReader(newInputStreamReader(
connection.getInputStream()));
String line;while ((line = in.readLine()) != null) {
result+=line;
}
}catch(Exception e) {
System.out.println("發(fā)送GET請(qǐng)求出現(xiàn)異常!" +e);
e.printStackTrace();
}//使用finally塊來關(guān)閉輸入流
finally{try{if (in != null) {
in.close();
}
}catch(Exception e2) {
e2.printStackTrace();
}
}returnresult;
}
在執(zhí)行g(shù)etUserLocation后返回的就是百度返回的json字符串了,所以也可以用一些json解析的方法來獲取json中的location信息,解析的方式各有不同,不再做過多描述了。
最后需要注意的一點(diǎn),這個(gè)方法本身是基于baidu提供的ip地址獲取服務(wù)接口實(shí)現(xiàn)的,所有當(dāng)百度的服務(wù)接口如果有所修改的話,這個(gè)功能是由失效的可能性的。
總結(jié)
以上是生活随笔為你收集整理的java ip138_判读ip所在地(通过百度ip138的提供的服务) java实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Unity UGUI 数字使用图片显示-
- 下一篇: 可取性、适用性、可行性:内存计算技术的影