I'm Sham
一个在通往码农道路上走走停停的行政文员

使用PHP实现Namesilo动态解析DDNS

这里是记录如何通过PHP来更新Namesilo里面的域名解析,实现自动动态更新。

首先当然你得有Namesilo的域名并且添加过解析了,怎么申请和添加解析就不去讲了,网上多的是。

Namesilo官网https://www.namesilo.com/

然后,是申请APIkey,登录账号后,在“My account”里面找到”api manager“,进入后,勾选最底下选项后点击”Generate”,就能生成APIkey了,复制保存好。

下面就是在服务器上新建一个php文件,把下面代码放进去,更改成你的内容后,保存

<?php 

  
//修改后面的APIKEY,域名和子域名前缀即可
  $ipnow = ipnow(); //获取服务器公网IP
  if($ipnow == null || $ipnow == ''){   //判断是否获取成功公网IP
    echo 'IP获取失败,稍后再试';  
  }else{
  
    if(!file_exists(("ipfile.txt")) || filesize("ipfile.txt") ==0){  //判断ip暂存文件是否存在或者是空文件
      $ipfile = fopen("ipfile.txt", "w") or die("Unable to open file!");
      fwrite($ipfile, $ipnow);   //将当前服务器IP写入临时文件,用于后续判断是否更改
      fclose($ipfile);
      echo updatedns($ipnow);
    }else{
      $ipfile = fopen("ipfile.txt", "r") or die("Unable to open file!");
      $iprecord = fread($ipfile,filesize("ipfile.txt"));    //获取ip暂存文件内记录的ip
      //echo $iprecord;
      if($iprecord == $ipnow){  //如果当前IP与记录的一致时,就不执行更新
        echo '现在服务器IP为:'.$iprecord.',没有改变,无需更新!';
        fclose($ipfile);
      }else{  //反之,更新解析中的ip
        $ipfile = fopen("ipfile.txt", "w") or die("Unable to open file!");
        echo updatedns($ipnow);
        fwrite($ipfile, $ipnow);
        fclose($ipfile);
      }
    }
  }
  
  
  
  function updatedns($ipnow){
    $APIkey = "这里换成你的APIKEY"; //你的namesilo apikey
    $domain = "这里放根域名,前面不要加www等前缀,比如baidu.com"; //需要更新的域名
    $rrhosts = ['www','img'];  //需要更新的子域名前缀数组,在方括号里用英文引号和逗号分隔
    $record = "dyn";  //不用改
    $rrttl = 3600;  //不用改
    
    $results = simplexml_load_string(file_get_contents('https://www.namesilo.com/api/dnsListRecords?version=1&type=xml&key='.$APIkey.'&domain='.$domain));   //通过apikey获取到当前域名下面所有解析清单
    $test = json_decode(json_encode($results),true);  //把获取到的数据转变成数组
    $resource_record = $test['reply']['resource_record'];  //筛选只获取解析记录清单数组
    $record_ids = [];
    for($i=0;$i<count($resource_record);$i++){   
      $record_ids[$resource_record[$i]['host']] = $resource_record[$i]['record_id']; //重新拼接变成新数组:[子域名]=>[record_id]
    }
    
    //下面就是循环更新每个子域名解析
    for($ii=0;$ii<count($rrhosts);$ii++){
      $subdomain = $rrhosts[$ii].'.'.$domain;  //拼接成子域名
      $recordid = $record_ids[$subdomain];  //获取当前子域名的record_id
      $rrhost = $rrhosts[$ii];
      return httpGet('https://www.namesilo.com/api/dnsUpdateRecord?version=1&type=xml&key='.$APIkey.'&domain='.$domain.'&rrid='.$recordid.'&rrhost='.$rrhost.'&rrvalue='.$ipnow.'&rrttl='.$rrttl);
    }
  }
  

//获取服务器公网IP
  function ipnow()
  {
    $ipnow = httpGet("http://httpbin.org/ip");  //这个网址是获取服务器IP用的,可以更换成其他的接口
    $ipnow = json_decode($ipnow,true);
    return $ipnow['origin'];
  }

//curl方法
  function httpGet($url){
    $curl = curl_init();
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($curl, CURLOPT_TIMEOUT, 500);
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, true);
    curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, true);
    curl_setopt($curl, CURLOPT_URL, $url);
    curl_setopt($curl, CURLOPT_HTTPHEADER, Array("Content-Type:text/xml; charset=utf-8"));
    $res = curl_exec($curl);
    curl_close($curl);
    return $res;
  }

?>

最后,通过访问这个PHP文件,就能实现更新解析的功能啦。比如可以通过宝塔面板里的计划任务,设置定时访问url来自动执行。

赞(1) 赏杯咖啡!
未经允许不得转载:Sham@双目瞿 » 使用PHP实现Namesilo动态解析DDNS

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

如果你觉得文章好,请赏1杯速溶咖啡给Sham吧!

微信扫一扫打赏