最近想注册一个域名,使用万网尝试了很多域名,基本都已被注册。之前听说双拼域名很火,所以想写个脚本,看看哪些双拼域名还未被注册。
一、查询接口
网上搜索了一下,万网的域名查询接口比较简单易用,查询URL格式为: http://panda.www.net.cn/cgi-bin/check.cgi?area_domain=aaa.com
返回值及含义:
210 : Domain name is available
211 : Domain name is not available
212 : Domain name is invalid
214 : Unknown error
二、编程思路
1. DomainGenerator读取文件pinyin.txt,获取所有可用的拼音字母。遍历拼音字母, 组装成双拼域名。这个拼音列表是从网上搜索来的,可能会有纰漏。
2. 创建域名检测线程DomainRunner,每个线程采用httpclient调用万网的域名查询接口。
3. 每个线程调用DomainValidator检查返回结果。
4. 线程ResultRunner将可用域名写入domain.txt文件。
三、核心代码
DomainGenerator.java, 启动类,读取拼音列表,组装需要检测的域名,创建检测线程和结果处理线程。
package com.learnworld; import java.util.List; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileReader; import java.io.FileWriter; import java.util.ArrayList; import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.atomic.AtomicInteger; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import org.apache.http.impl.conn.PoolingHttpClientConnectionManager; public class DomainGenerator { public static void main(String[] args){ // pinyin list, read from pinyin.txt List<String> items = new ArrayList<String>(); // domain list, which need to check ArrayBlockingQueue<String> taskQueue = new ArrayBlockingQueue<String>(163620); // available domain list, which need to save into file LinkedBlockingQueue<String> resultQueue = new LinkedBlockingQueue<String>(); // counter, need to count unavailable domain statistical information AtomicInteger count = new AtomicInteger(0); // Httpclient initialization PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager(); cm.setMaxTotal(20); cm.setDefaultMaxPerRoute(20); CloseableHttpClient httpClient = HttpClients.custom().setConnectionManager(cm).build(); try { // pinyin.txt, used to save all available pinyin BufferedReader reader = new BufferedReader(new FileReader("pinyin.txt")); // domain.txt, used to save all available domain result BufferedWriter writer = new BufferedWriter(new FileWriter("domain.txt")); String item = null; while((item = reader.readLine()) != null){ items.add(item); } // generate domain list for (String item1 : items){ for (String item2 : items) { taskQueue.offer(item1 + item2 + ".com"); } } int domainThreadNum = 3; CountDownLatch downLatch = new CountDownLatch(domainThreadNum); ExecutorService executor = Executors.newFixedThreadPool(domainThreadNum + 1); // start domain check thread for(int i = 0; i < domainThreadNum; i++){ executor.execute(new DomainRunner(taskQueue, resultQueue, downLatch, count, httpClient)); } // start result handle thread executor.execute(new ResultRunner(resultQueue, writer)); downLatch.await(); System.out.println("All tasks are done!"); // TODO, suggest use volatile flag to control ResultRunner executor.shutdownNow(); reader.close(); writer.close(); httpClient.close(); } catch (Exception e) { e.printStackTrace(); } } }
DomainRunner:域名检测线程,从域名domainQueue中读取域名,调用接口进行检测。 如果域名可用,将结果放入resultQueue中等待写入文件。
package com.learnworld; import java.io.IOException; import java.util.Calendar; import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.CountDownLatch; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.atomic.AtomicInteger; import org.apache.http.HttpEntity; import org.apache.http.client.config.RequestConfig; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.protocol.BasicHttpContext; import org.apache.http.protocol.HttpContext; import org.apache.http.util.EntityUtils; public class DomainRunner implements Runnable { private ArrayBlockingQueue<String> domainQueue; private LinkedBlockingQueue<String> resultQueue; private CountDownLatch downLatch; private AtomicInteger count; private CloseableHttpClient httpClient; public DomainRunner(ArrayBlockingQueue<String> domainQueue, LinkedBlockingQueue<String> resultQueue, CountDownLatch downLatch, AtomicInteger count, CloseableHttpClient httpClient) { super(); this.domainQueue = domainQueue; this.resultQueue = resultQueue; this.downLatch = downLatch; this.count = count; this.httpClient = httpClient; } @Override public void run() { String domain = null; while ((domain = domainQueue.poll()) != null) { boolean isDomainAvailable = false; RequestConfig requestConfig = RequestConfig.custom() .setSocketTimeout(5000) .setConnectTimeout(5000) .setConnectionRequestTimeout(5000) .build(); HttpGet httpGet = new HttpGet("http://panda.www.net.cn/cgi-bin/check.cgi?area_domain=" + domain); httpGet.setConfig(requestConfig); httpGet.setHeader("Connection", "close"); HttpContext context = new BasicHttpContext(); CloseableHttpResponse response = null; try { response = httpClient.execute(httpGet, context); HttpEntity entity = response.getEntity(); int status = response.getStatusLine().getStatusCode(); if (status >= 200 && status < 300) { String resultXml = EntityUtils.toString(entity); isDomainAvailable = DomainValidator.isAvailableDomainForResponse(resultXml); EntityUtils.consumeQuietly(entity); } else { System.out.println(domain + " check error."); } } catch (Exception e) { e.printStackTrace(); } finally { try { httpGet.releaseConnection(); if (response != null) { response.close(); } } catch (IOException e) { e.printStackTrace(); } } // result handle if(isDomainAvailable) { resultQueue.offer(domain); } else { int totalInvalid = count.addAndGet(1); if (totalInvalid % 100 == 0) { System.out.println(totalInvalid + " " + Calendar.getInstance().getTime()); } } } downLatch.countDown(); } }
DomainValidator: 对万网返回结果进行检查,判断域名是否可用。
package com.learnworld; public class DomainValidator { public static boolean isAvailableDomainForResponse(String responseXml){ if(responseXml == null || responseXml.isEmpty()){ return false; } if(responseXml.contains("<original>210")){ return true; } else if(responseXml.contains("<original>211") || responseXml.contains("<original>212") || responseXml.contains("<original>214")){ return false; } else { System.out.println("api callback error!"); try { Thread.sleep(60000); } catch (InterruptedException e) { e.printStackTrace(); } return false; } } }
ResultRunner: 结果处理线程,将可用域名写入文件domain.txt中。
package com.learnworld; import java.io.BufferedWriter; import java.util.concurrent.LinkedBlockingQueue; public class ResultRunner implements Runnable{ private LinkedBlockingQueue<String> resultQueue; BufferedWriter writer; public ResultRunner(LinkedBlockingQueue<String> resultQueue, BufferedWriter writer) { super(); this.resultQueue = resultQueue; this.writer = writer; } @Override public void run() { String result = null; try { while ((result = resultQueue.take()) != null) { writer.write(result); writer.newLine(); writer.flush(); } } catch (Exception e) { e.printStackTrace(); } } }
四、总结
1. 第一版程序采用单线程处理,性能很差,每100个域名大概需要90s左右,主要原因是网络IO延迟比较大。将代码修改为多线程处理,创建两个检测线程,每100个域名大概需要30s左右。
2. 提高检测线程数会加快处理性能,但建议不超过三个,原因有两个:
1) 万网采用了阿里云的过滤技术,如果一段时间内某个IP的请求数很高,就会将该IP加入屏蔽列表。 我开始采用了100个线程,不到1分钟就被屏蔽。
2)当请求数很高时,网络连接不能得到及时释放,很多TCP连接处于TIME_WAIT状态,进而出现BindException错误。
3. 我遍历了所有的双拼域名,目前约有1万个域名尚未被注册,结果见附件。我又遍历了四位及以下的纯英文字母域名,已经全部被注册。
需要注册双拼域名的童鞋要抓紧了~~
相关推荐
本软件能快速扫描域名注册情况,批量导出导入,速度快,站长朋友不可多得的好工具,如今查找已备案域名比较困难,此工具配合已备案域名查询网】效果极佳。 版本介绍: ===========================================...
虚拟主机域名查询、二级域名查询、整站目录扫描(多线程)、网站批量扫描(多线程) 自动检测网站排名、自动读取\修改Cookies、自动检测注入点! 2:综合上传功能介绍 动网论坛上传漏洞功能、动力系统上传漏洞功能、...
弱口令批量扫描工具是一款支持批量多线程检查,可快速发现弱密码、弱口令账号,密码支持和用户名结合进行检查,大大提高成功率,支持自定义服务端口和字典。可进行单IP或域名,也可进行段扫描。
七:N种批量查询工具(百度收录/反链批量查询,PR值批量查询,出站链接批量查询,雅虎反链批量查询,ALEXA批量查询,未注册域名批量查询.支持结果过滤/导出功能) 八:网页综合检测工具(查网页关键字密度,搜索引擎模拟抓取等...
Cscan分为检测存活主机、非检测存活主机两个版本 程序采用多线程批量扫描大型内网IP段C段存活主机(支持上万个C段) 插件含C段旁注扫描、子域名扫描、Ftp密码爆破、Mysql密码爆、系统密码爆破、存活主机扫描、Web信息...
Cscan分为检测存活主机、非检测存活主机两个版本 程序采用多线程批量扫描大型内网IP段C段存活主机(支持上万个C段) 插件含C段旁注扫描、子域名扫描、Ftp密码爆破、Mysql密码爆、系统密码爆破、存活主机扫描、Web信息...
支持单IP单端口快速扫描,指定IP地址段和端口范围批量扫描,使用多线程提高扫描性能。用于检测指定的端口是否开放,并给出开放端口的相关信息。 Quick Start Features 快速扫描: 在输入域名/IP地址和端口,点击右下...
超级弱口令检查工具是一款Windows平台的弱口令审计工具,支持批量多线程检查,可快速发现弱密码、弱口令账号,密码支持和用户名结合进行检查,大大提高成功率,支持自定义服务端口和字典。 工具采用C#开发,需要安装...
1. ssh_thread.py 是一个批量执行命令的脚本,支持直接执行ssh命令及文件传输,支持多线程 使用说明如下: -h,-H,--help 帮助页面 -C, --cmd 执行命令模式 -M, --command 执行命令模式 -S, --sendfile ...
3.修正程序批量检测查询到域名的时候无反映的BUG! Domain4.2(明小子)10.01.16更新版主要更新内容如下: 1.删除所有无关数据 2.优化急速代码 3.改变启动线程 4.增加SQL数据批量导出功能 5.加入几个优化进程...
3.修正程序批量检测查询到域名的时候无反映的BUG! Domain4.2(明小子)10.01.16更新版主要更新内容如下: 1.删除所有无关数据 2.优化急速代码 3.改变启动线程 4.增加SQL数据批量导出功能 5.加入几个优化进程...
Ladon一款用于大型网络渗透的多线程插件化综合扫描神器,含端口扫描、服务识别、网络资产、密码爆破、高危漏洞检测以及一键GetShell,支持批量A段/B段/C段以及跨网段扫描,支持URL、主机、域名列表扫描。5.7版本内置...
K8Cscan5.4 20191101最新版Ladon程序简介K8Cscan一个专用于大型内网渗透的高并发插件化扫描神器,包含信息收集,网络资产,入侵扫描,密码爆破,突破利用,支持批量A段/ B段/ C段以及跨网段扫描。5.4版本内置28个...
弱口令检测、端口扫描(协议识别,组件识别)、web目录扫描、子域名扫描、等保模拟定级、自动化运维、Windows基线核查、多线程Linux、MySql、Redis、Pgsql、SqlServer、Oracle、h3c、华为批量执行命令、等保工具...
11.iP/域名多线程快速扫描 13.SQL注入功能 14.MD5加密解密功能 16.查询二级域名 17.Webshell验证+Arp欺骗功能 18.FTP强力爆破 21.编码转换机制 ——————————————————————————– 二...
草根站长工具箱是一款为了方便国内站长查询网站...支持导出)五长尾词挖掘工具(可同时多线程挖掘百度,谷歌,搜搜,雅虎,淘宝站点热门长尾词.支持结果过滤/导出功能)七网页综合检测工具(查网页关键字密度,搜索引擎模拟抓取
ssh_thread.py 是一个批量执行命令的脚本,支持直接执行ssh命令及文件传输,支持多线程 ###2. check_ping.py 多进程检测ping,并取值 ###3. check_ip138.py 通过ip138检测IP(域名)归属地 ###4. vps_baidu.py 使用...
Ladon一款用于大型网络渗透的多线程插件化综合扫描神器,含端口扫描、服务识别、网络资产、密码爆破、高危漏洞检测以及一键GetShell,支持批量A段/B段/C段以及跨网段扫描,支持URL、主机、域名列表扫描。7.0版本内置...
Ladon一种用于大型网络渗透性的多线程插件化综合扫描神器,包括端口扫描,服务识别,网络资产,密码爆破,高危漏洞检测以及一键GetShell,支持批量A段/ B段/ C段以及跨7.2版本内置94个功能模块,外部模块18个,通过...