程序员在WEB开发或者其他一些开发中,经常会使用IP地址查询的功能,即通过用户的IP,去查询用户所在的地区。
本文给出一种方法,利用互联网上现有的资源,让各位可以自己实现IP地址查询的功能。
本文是教程(一),介绍的功能是如何获取本机的外网IP和地理位置,如果想知道如何获取任意IP的地理位置,请看后续教程。
读者可以先打开这个链接:http://www.ip138.com/,我们会发现有几行重要的字:
您的IP是:[131.23.132.323] 来自:xx省xx
这个就是我们所需要的信息,我们通过浏览器查看网页源代码,结果惊奇的发现,源码里没有这一段,这是为什么?
分析一下,网页里的内容有两个来源,一个是来自于浏览器最初从服务器获取的html源码中的内容,还有一个是浏览器加载页面之后,由页面向服务器发送请求获取的数据,既然页面源码中没有这段数据,那一定是通过AJAX请求获得的数据。
通过抓包工具(这里用的是firebug)我们发现,其实这段信息,是在网页加载之后,页面向服务器发送的异步请求(AJAX)返回的数据。
这个AJAX请求规格如下:
url:http://iframe.ip138.com/ic.asp
返回数据:
1. <html>
2. <head>
3. <meta http-equiv="content-type" content="text/html; charset=gb2312">
4. <title> 您的IP地址 </title>
5. </head>
6. <body style="margin:0px"><center>您的IP是:[131.23.132.323] 来自:xx省xx市 电信</center></body></html>
问题已经解决了,我们只需要向
http://iframe.ip138.com/ic.asp发送一个简单的url请求,就可以获得如上的返回数据,通过解析html源代码,取出<center>和</center>之间的部分,即可获得本机IP和地理信息:“您的IP是:[131.23.132.323] 来自:xx省xx市 电信”,再经过简单的处理,即可获得规则的IP和地址。
下面给出源码:
1. import java.io.IOException;
2. import java.io.InputStream;
3. import java.io.InputStreamReader;
4. import java.net.HttpURLConnection;
5. import java.net.URL;
6.
7.
8. public class IpGetter {
9.
10. public static void main(String[] args) throws IOException
11. {
12. new IpGetter();
13.
14. new IpGetter().getInfo();
15. "不规则结果"+info);
16.
17. String ip=IpGetter.getIp(info);
18. String address=IpGetter.getAddress(info);
19.
20. "IP:"+ip);
21. "Address:"+address);
22. }
23.
24. /**
25. * 取出ajax响应中<center>和</center>之间的部分,即为我们要的结果(不规则字符串)
26. * @return
27. * @throws IOException
28. */
29. public String getInfo() throws IOException
30. {
31. "http://iframe.ip138.com/ic.asp", "gb2312");
32. int index1=info.indexOf("<center>")+8;
33. int index2=info.indexOf("</center>");
34. info=info.substring(index1,index2);
35. return info;
36. }
37.
38. /**
39. * 从不规则字符串中(getInfo()的结果),抽取出IP部分
40. * @param info
41. */
42. public static String getIp(String info)
43. {
44. int index1=info.indexOf("[")+1;
45. int index2=info.indexOf("]");
46. String ip=info.substring(index1,index2);
47. return ip;
48. }
49.
50. /**
51. * 从不规则字符串中(getInfo()的结果),抽取出地址部分
52. * @param info
53. */
54. public static String getAddress(String info)
55. {
56. int index1=info.indexOf("来自:");
57. 4);
58. return address;
59. }
60.
61. /**
62. * 抓取某个网页的源代码
63. * @param urlstr 要抓取网页的地址
64. * @param charset 网页所使用的编码 如"utf-8","gbk"
65. * @return
66. * @throws IOException
67. */
68. public String fetchHtml(String urlstr, String charset)
69. throws IOException {
70. new URL(urlstr);
71. HttpURLConnection con = (HttpURLConnection) url.openConnection();
72. InputStream is = con.getInputStream();
73. new InputStreamReader(is, charset);
74. "";
75. int read;
76. while ((read = isr.read()) != -1) {
77. char) read;
78. }
79. isr.close();
80. return result;
81. }
82.
83. }