C段查询雏形之在Java中反查一个IP上的所有域名(旁站查询)

本文涉及的产品
.cn 域名,1个 12个月
简介:

这里使用了两个接口来反查IP,分别是“站长工具”和“爱站”的接口,两者各有千秋,结合起来查询就较为准确了。

注:我目前只写了个初始版本,还不太完善,但是可以基本使用了,代码中关键地方有注释,所以我就不多解释了

算法核心:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
package  NmapTest;
 
import  java.io.BufferedReader;
import  java.io.IOException;
import  java.io.InputStream;
import  java.io.InputStreamReader;
import  java.io.OutputStream;
import  java.net.HttpURLConnection;
import  java.net.MalformedURLException;
import  java.net.URL;
import  java.util.HashSet;
import  java.util.Set;
import  java.util.regex.Matcher;
import  java.util.regex.Pattern;
 
public  class  SearchDomainByIP {
     /**
      * IP反查(旁站查询),综合两个接口的结果
      * @param ip 待查IP
     
      * @return 返回结果集
      * */
     public  Set<String> getDomains(String ip){
         Set<String> set =  new  HashSet<String>();
         set = getDomainByChinaz(searchDomainByChinaz(ip));   //chinaz接口
         
         try 
             String[] domainByAiZhan = searchDomainByAiZhan(ip,  1 false ).split( " " );   //aizhan接口
             for (String s : domainByAiZhan){
                 if (!s.equals( "" ))
                     set.add(s);
             }
         catch  (IOException e) {
             // TODO Auto-generated catch block
             e.printStackTrace();
         }
         
         return  set;
     }
     
     /**
      * 使用站长工具的接口,IP反查域名
      * @param ip 待查IP
     
      * @return 返回包含结果的字符串
      * */
     private  String searchDomainByChinaz(String ip){
         try  {
             URL url =  new  URL( "http://s.tool.chinaz.com/same" );
             HttpURLConnection connection = (HttpURLConnection) url.openConnection();
             
             connection.setRequestMethod( "POST" );
             connection.setRequestProperty( "Content-Type" "application/x-www-form-urlencoded" );
             connection.setDoInput( true );
             connection.setDoOutput( true );
             connection.setUseCaches( false );
             
             String str =  "s="  + ip;   //POST参数
             OutputStream outputStream = connection.getOutputStream();
             outputStream.write(str.getBytes( "UTF-8" ));
             outputStream.flush();   //开始请求
             outputStream.close();
             
             //返回数据包
             if (connection.getResponseCode() ==  200 ){
                 InputStream inputStream = connection.getInputStream();
                 BufferedReader reader =  new  BufferedReader( new  InputStreamReader(inputStream));
                 String line =  "" ;
                 String reg =  "\\s*<ul><li><span>1.</span>(.*)?" ;   //匹配到目标行
 
                 while ((line = reader.readLine()) !=  null ){
                     if (line.matches(reg)){
                         inputStream.close();
                         reader.close();
                         connection.disconnect();
                         return  line.replaceFirst( "\\s*<ul><li><span>1.</span>" "" );   //返回包含目标的字符串
                     }
 
                 }              
             }
                             
         catch  (MalformedURLException e) {
             e.printStackTrace();
         catch  (IOException e) {
             e.printStackTrace();
         }
     
         return  "" ;
     }
 
     /**
      * 正则匹配出需要的一个个域名
      * @param data 包含所有结果的字符串
     
      * @return 目标域名的List集合
      * */
     private  Set<String> getDomainByChinaz(String data){
         String reg =  "target=_blank>(.*?)</a></li>" ;   //准确匹配出查到的域名
         Pattern pattern = Pattern.compile(reg);
         Matcher matcher = pattern.matcher(data);
         
         Set<String> set =  new  HashSet<String>();
         while (matcher.find()){
             set.add(matcher.group( 1 ));
         }
         
         return  set;
     }
     
     /**
      * 使用爱站网的接口,IP反查域名
      * @param ip 待查IP
      * @param currentPage 当前页
      * @param checkNum 判断域名总数是否已获取
     
      * @return 返回包含结果的字符串
      * @throws IOException 
      * */
     private  String searchDomainByAiZhan(String ip, int  currentPage, boolean  checkNum)  throws  IOException{
         URL url =  new  URL( "http://dns.aizhan.com/"  + ip +  "/"  + currentPage + "/" );
         HttpURLConnection connection = (HttpURLConnection) url.openConnection();
         connection.setRequestMethod( "GET" );
         connection.setConnectTimeout( 10000 );   //毫秒
         connection.setReadTimeout( 10000 );
         
         InputStream inputStream = connection.getInputStream();  
         BufferedReader reader =  new  BufferedReader( new  InputStreamReader(inputStream));
         String line =  "" ;
         String numReg =  "共有  <font color=\"#FF0000\" id=\"yhide\">(\\d*)?</font> 个域名解析到该IP" ;
         String domainReg =  "\\s*<td class=\"dns-links\">\\s*" ;   //匹配到目标行的上一行
         
         int  domainNumber =  0 ;   //查到的域名总数
         String domainNames =  "" ;   //查到的所有域名的字符串集
         boolean  point =  false ;   //从false置为true时,表示已经找到目标行的上一行了,下一次循环即可取出目标行       
         
         Pattern pattern = Pattern.compile(numReg);
         Matcher matcher =  null ;
         while ((line = reader.readLine()) !=  null ){         
             //查域名总数
             if (!checkNum){
                 matcher = pattern.matcher(line);
                 if (matcher.find()){
                     domainNumber = Integer.valueOf(matcher.group( 1 ));
                     checkNum =  true ;
                 }
             }
             //查域名
             if (point){
                 pattern = Pattern.compile( "target=\"_blank\">(.*)?</a>" );
                 matcher = pattern.matcher(line);
                 if (matcher.find()){
//                  System.out.println(matcher.group(1));  
                     domainNames = domainNames + matcher.group( 1 ) +  " "
                     point =  false ;
                 }
             }
             else  if (line.matches(domainReg)){
                 point =  true ;
             }
 
         }
         inputStream.close();
         reader.close();
         connection.disconnect();
         
         //如果当前页下一页还有内容,则进行递归调用查询
         if (domainNumber > ( 20  * currentPage)){
             try  {
                 Thread.sleep( 1000 );   //线程休息1秒钟
             catch  (InterruptedException e) {
                 e.printStackTrace();
             }
             return  domainNames + searchDomainByAiZhan(ip,currentPage+ 1 , true );
         }
         else {
             return  domainNames;
         }  
     }
}

调用测试:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package  NmapTest;
 
import  java.util.HashSet;
import  java.util.Iterator;
import  java.util.Set;
 
public  class  Domains {
 
     /**
      * @param args
      */
     public  static  void  main(String[] args) {
         SearchDomainByIP searchDomain =  new  SearchDomainByIP();
         Set<String> set =  new  HashSet<String>();
         set = searchDomain.getDomains( "162.211.183.152" );
 
         Iterator<String> iterator = set.iterator();
         System.out.println( "一共查到 "  + set.size() +  "个旁站" );
         while (iterator.hasNext()){
             System.out.println(iterator.next());
         }
     }
 
}

输出:

一共查到 55个旁站
www.anhao.ga
www.3ga.cc
www.xiaotwl.cn
wapfeih.com
www.52zyw.net
lgdyw.pw
xxin888.com
www.hksf-expres.com
www.zbhz.top
yk666.cn
www.mfdhw.cn
danshenwl.com
qq67.cn
gjdc.cc
www.5x2y0.com
www.wz288.com
wapzx.org
85pj.cn
www.txbk.cc
yajie520.com
www.wuyunzhu.top
huanyan520.com
lequk.com
www.ddcd.net
ail.so
3pojie.com
www.hacksg.com
www.yin361.cn
www.wapfeih.com
xg-sfkd.com.cn
www.xuexi47.cn
www.huaxia47.com
wz288.com
www.sucaiziyuan.com
wapsog.com
qm6.cc
www.58dh.cn
hacksg.com
zhuilixiang.com
www.xhhzyw.com
www.360360.pw
www.495o.com
surfs.cn
shineky.cn
www.danshenwl.com
52daizi.com
www.hei-tan.com
xg-sfg.cn
www.qqjudian.com
sucaiziyuan.com
moran.cc
lghk.pw
www.huanyan520.com
hongbao.qq.com.mooyu.pub
lexunc.com


PS:通过IP反查域名本身就没有确定的算法,因此有误差再所难免。这也是我使用两个不同接口来查询的意义所在,可以互相弥补,使结果更加精确




本文转自 pangfc 51CTO博客,原文链接:http://blog.51cto.com/983836259/1719263,如需转载请自行联系原作者

相关文章
|
3月前
|
网络协议 安全 Java
Java网络编程入门涉及TCP/IP协议理解与Socket通信。
【6月更文挑战第21天】Java网络编程入门涉及TCP/IP协议理解与Socket通信。TCP/IP协议包括应用层、传输层、网络层和数据链路层。使用Java的`ServerSocket`和`Socket`类,服务器监听端口,接受客户端连接,而客户端连接指定服务器并交换数据。基础示例展示如何创建服务器和发送消息。进阶可涉及多线程、NIO和安全传输。学习这些基础知识能助你构建网络应用。
39 1
|
3月前
|
Java
java提取网站域名
java提取网站域名
61 3
|
18天前
|
域名解析 缓存 负载均衡
在Linux中,自定义解析域名的时候,可以编辑哪个⽂件?是否可以⼀个ip对应多个域名?是否⼀个域名对应多个ip?
在Linux中,自定义解析域名的时候,可以编辑哪个⽂件?是否可以⼀个ip对应多个域名?是否⼀个域名对应多个ip?
|
2月前
|
Linux 网络架构
通过route , tracert , traceroute 查看本地路由配置及访问ip或域名时经过的路由信息
通过route , tracert , traceroute 查看本地路由配置及访问ip或域名时经过的路由信息
86 2
|
3月前
|
网络协议 Java 程序员
TCP/IP协议栈是网络通信基础,Java的`java.net`包提供工具,使开发者能利用TCP/IP创建网络应用
【6月更文挑战第23天】 **TCP/IP协议栈是网络通信基础,它包含应用层(HTTP, FTP等)、传输层(TCP, UDP)、网络层(IP)、数据链路层(帧, MAC地址)和物理层(硬件信号)。Java的`java.net`包提供工具,使开发者能利用TCP/IP创建网络应用,如Socket和ServerSocket用于客户端和服务器通信。**
46 3
|
2月前
|
Web App开发
软件开发常见流程之移动端调试方法,利用Chrome(谷歌浏览器)的模拟手机调试,搭建本地Web服务器,手机和服务器在一个局域网,通过手机访问服务器,使用服务器,利用ip实现域名访问
软件开发常见流程之移动端调试方法,利用Chrome(谷歌浏览器)的模拟手机调试,搭建本地Web服务器,手机和服务器在一个局域网,通过手机访问服务器,使用服务器,利用ip实现域名访问
|
2月前
|
Java Redis 数据安全/隐私保护
Redis13的Java客户端-Jedis快速入门,建立连接的写法,ip地址,设置密码密码,选择库的写法
Redis13的Java客户端-Jedis快速入门,建立连接的写法,ip地址,设置密码密码,选择库的写法
|
3月前
网络编程中的互联网协议 , IP地址 , 域名 , 端口 , 架构 , 网页数据请求 , 响应码
网络编程中的互联网协议 , IP地址 , 域名 , 端口 , 架构 , 网页数据请求 , 响应码
|
3月前
|
运维 Serverless Docker
Serverless 应用引擎产品使用合集之想使用IP地址而不是临时域名进行访问如何解决
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
|
域名解析 缓存 网络协议
【深入分析Java Web】几种域名解析方式-详解
【深入分析Java Web】几种域名解析方式-详解
368 0
下一篇
DDNS