据我所知,目前.sv域名好像没有公开的whois服务器,查询whois的话只有去注册局官网查询。
自己写代码查询不是多此一举吗?非也非也,如果你自己通过curl查询到whois,然后配合strpos函数,不就可以监控.sv域名的删除情况了吗。
这种查询方式应该在同类后缀中通用。
我的方法只是坚持能用即可,不能和大佬们的高大上方法相比。
工作原理
我们可以看到官网首页就是查询域名的输入框,后面跟了一个Consultar按钮,打开F12,查看这个按钮的点击触发。
可以看到,这个按钮触发的是 BuscarDominio() 这个function,直接在F12里面搜索这个方法,搜到后可以看到官网的代码如下:
/// BUSCAR DOMINIOS en la base de datos
function BuscarDominio() {
//alert("Hola");
Nombre = document.getElementById('nombre').value;
idE = document.getElementById('ID').value;
//alert(idE);
if(Nombre != ''){
objReq = new getRequestObject();
objReq.onreadystatechange = procesaMadre;
objReq.open("POST",'https://svnet.sv/accion/procesos.php',true);
objReq.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
accion = 2;
var param = 'key=Buscar';
param += '&ID='+idE;
param += '&nombre='+Nombre;
objReq.send(param);
//alert(param);
} else{
document.getElementById('DivResultado').innerHTML='Escribe un nombre de dominio';
}
}
可以看到这个为带参数post请求指定地址。
带的参数为:
accion = 2;
key=Buscar;
ID= 214547854782423654 //这是个固定值
nombre= 域名前缀
知道所带的参数后,新建一个sv.php文件,将以下代码复制进去
<?php
header('Content-Type','application/x-www-form-urlencoded');
$domain = $_GET['domain'];
$tld = explode(".",$domain);
$tld = $tld[0];
$data = array(
"accion" => "2",
"key"=>"Buscar",
"ID"=>"214547854782423654",
"nombre"=>"$tld",
"enviar"=>"Consultar"
);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://svnet.sv/accion/procesos.php");
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
curl_setopt($ch, CURLOPT_FRESH_CONNECT, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADER, false);
$result = curl_exec($ch);
//未完,下面接着讲解,下面的代码跟在这后面的
?>
例如我查询的域名是8.sv,官网首页的查询只需要输入8即可,但是我的代码里面进行了分割,所以https://www.lzhs.com/sv.php?domain=8.sv,还是以这种格式,这里就获取到了所有8前缀的sv可注册情况
代码获取的页面
注册局的页面
到这一步说白了就是:代码获取到的就是注册局没有css的页面。
然后打开F12查看源代码,你会发现没有注册的域名就是没注册,注册了的域名注册局都给了每个域名一个ID
如上图所示8.org.sv是可以注册的,点击没啥反应。
然后8.sv是已经被注册了的,点击进去后是whois的页面
先F12查看注册局是怎么查whois的
好像被水印挡住了,不过没影响,你们自己也可以手动去看,这里模糊可以看到方式为onclick=”Whois(29312)”
到这一步就是说明注册局有一个function为whois的方法,跟的参数为域名的id
老规矩F12查看该方法怎么使用的,代码如下
/// BUSCAR DOMINIOS en la base de datos
function Whois(ID) {
//alert("Hola");
ID = ID;
//alert(ID);
//alert(idE);
if(ID > 0){
objReq = new getRequestObject();
objReq.onreadystatechange = procesaMadre;
objReq.open("POST",'accion/procesos.php',true);
objReq.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
accion = 2;
var param = 'key=Whois';
param += '&ID='+ID;
objReq.send(param);
//alert(param);
} else{
document.getElementById('DivResultado').innerHTML='Escribe un nombre de dominio';
}
}
可以看到这个function所需的参数,whois的id我们直接进行匹配就行了,用到php的preg_match_all函数
preg_match_all("/<strong>$domain<\/strong> <button type=\"button\" class=\"btn btn-warning\" onClick=\"Whois\((.*?)\)\">/",$result,$domainid);
这就把已注册的sv域名id匹配出来了。
跟着注册局提供的方法进行查询返回结果
$domainid = $domainid[1][0];
$data = array(
"key"=>"Whois",
"ID"=>"$domainid",
);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://svnet.sv/accion/procesos.php");
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
curl_setopt($ch, CURLOPT_FRESH_CONNECT, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADER, false);
$result = curl_exec($ch);
$res = substr($result, strripos($result, '<div class="alert blanco">'));
echo "<div style = 'margin-left:-900px'>".$res."</div>";
最终的结果如下
最后一步,判断域名是否注册
if (strpos($res,"egistrad")) {
echo "域名已注册";
//自定义代码,可以设置自动按时刷新页面,反复查询是否删除
}else {
echo "域名未注册";
//自定义代码
}
到此,整个sv域名查询whois的方法就结束了。
多谢大佬的文章,拜读并实践后发现 第一次post只需要nombre,ID,key。第二次ID,key