Java实现阿里云的域名解析动态的IP

/ Java / 没有评论 / 1451浏览

Java实现阿里云的域名解析动态的IP

前言:给本办公室做的一个小系统,在阿里云注册的域名,由于电脑每天都要重启,所以会重新分配IP。于是老是要在阿里云的管理后台修改域名绑定的IP,再解析,终于觉得不耐烦了,尤其是人不在的时候,办公室的妹子们不懂怎么使用,于是做了一个动态解析。

由于对阿里云的接口不熟悉,也是捣鼓了2天半才搞成,主要原因是“百度”的锅,因为在“百度”上查不到好的答案和资料。答案过时,jar包资源缺失,最终在“谷歌”上面找到了方案。

网上找到的代码 (过时)

import java.io.BufferedReader;  
import java.io.IOException;  
import java.io.InputStream;  
import java.io.InputStreamReader;  
import java.net.InetAddress;  
import java.net.URL;  
import java.net.URLConnection;  
import java.util.Date;  
import java.util.List;  

import com.aliyun.api.AliyunClient;  
import com.aliyun.api.AliyunConstants;  
import com.aliyun.api.DefaultAliyunClient;  
import com.aliyun.api.dns.dns20150109.request.DescribeSubDomainRecordsRequest;  
import com.aliyun.api.dns.dns20150109.request.UpdateDomainRecordRequest;  
import com.aliyun.api.dns.dns20150109.response.DescribeSubDomainRecordsResponse;  
import com.aliyun.api.dns.dns20150109.response.UpdateDomainRecordResponse;  
import com.aliyun.api.domain.Record;  

public class DemoListDomains {  
  private static AliyunClient client;  

  static {  
    String serverUrl = "http://dns.aliyuncs.com/";  
    String accessKeyId = "yourId";  
    String accessKeySecret = "yourSecret";  

    client = new DefaultAliyunClient(serverUrl, accessKeyId, accessKeySecret, AliyunConstants.FORMAT_JSON);  
  }  

  public static void main(String[] args) {  

    while(true){  

      try {  
        // 获取域名信息  
        DescribeSubDomainRecordsRequest ddi_req = new DescribeSubDomainRecordsRequest();  
        ddi_req.setTimestamp(new Date().getTime());  
        DescribeSubDomainRecordsResponse ddi_resp = new DescribeSubDomainRecordsResponse();  
        ddi_req.setSubDomain("your域名");  
        ddi_resp = client.execute(ddi_req);  

        List<Record> list = ddi_resp.getDomainRecords();  
        boolean changed = false;  
        for (Record record : list) {  
          String ip = getMyIPOutter();// 获得本机公网IP  

          System.out.println("old_ip : " + record.getValue());  
          System.out.println("outter_ip : " + ip);  
          if (!ip.equals(record.getValue())) {  
            // 根据传入参数修改解析记录  
            UpdateDomainRecordRequest udr_req = new UpdateDomainRecordRequest();  
            udr_req.setTimestamp(new Date().getTime());  
            udr_req.setRecordId(record.getRecordId());  
            udr_req.setrR(record.getrR());  
            udr_req.setValue(ip);  
            udr_req.setType(record.getType());  
            udr_req.settTL(record.gettTL());  
            udr_req.setPriority(record.getPriority());  
            udr_req.setLine(record.getLine());  

            UpdateDomainRecordResponse udr_resp = new UpdateDomainRecordResponse();  
            udr_resp = client.execute(udr_req);  
            if (udr_resp.getErrorCode() == null) {  
              System.out.println("success");  
              changed = true;  
            } else {  
              System.out.println("error");  
            }  
          }  

        }  
        if (!changed) {  
          System.out.println("need not change");  
        }  
      } catch (Exception e) {  
        e.printStackTrace();  
        System.out.println("error");  
      }  
      try {  
        Thread.sleep(5000);  

      } catch (InterruptedException e) {  
        e.printStackTrace();  
      }  
    }  

  }  

  private static String getMyIPOutter() throws IOException {  
    InputStream ins = null;  
    try {  
      URL url = new URL("http://1212.ip138.com/ic.asp");  
      URLConnection con = url.openConnection();  
      ins = con.getInputStream();  
      InputStreamReader isReader = new InputStreamReader(ins, "GB2312");  
      BufferedReader bReader = new BufferedReader(isReader);  
      StringBuffer webContent = new StringBuffer();  
      String str = null;  
      while ((str = bReader.readLine()) != null) {  
        if (str.contains("您的IP是:[")) {  
          webContent.append(str);  
          break;  
        }  
      }  
      int start = webContent.indexOf("[") + 1;  
      int end = webContent.indexOf("]");  
      return webContent.substring(start, end);  
    } finally {  
      if (ins != null) {  
        ins.close();  
      }  
    }  
  }  

  @SuppressWarnings("unused")  
  private static String getMyIPLocal() throws IOException {  
    InetAddress ia = InetAddress.getLocalHost();  
    return ia.getHostAddress();  
  }  
}  

上面这段代码比较老旧,你用起来就会发现缺失“ AliyunClient”的类,还有老旧的执行方式“ execute”,当前jar包不支持,当时,就是这两个问题把我搞晕了,再次fuck“百度”,手动比中指!!!

实现方案:

  1. 首先你得注册阿里云的域名,并且已实现手动绑定Tomcat服务器IP,涉及到修改Tomcat的配置文件,这里我就不说了,网上能查到 1

  2. 需要的 jar包:

不知道怎么放链接,资源自己去找,百度,谷歌随便了,主要是 aliyun-java-sdk-alidns.jar这个jar包找不到

  1. 代码

3.1 java代码

import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.Timer;
import java.util.TimerTask;

import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

import org.springframework.stereotype.Component;

import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.alidns.model.v20150109.DescribeDomainRecordsRequest;
import com.aliyuncs.alidns.model.v20150109.DescribeDomainRecordsResponse;
import com.aliyuncs.alidns.model.v20150109.UpdateDomainRecordRequest;
import com.aliyuncs.alidns.model.v20150109.UpdateDomainRecordResponse;
import com.aliyuncs.alidns.model.v20150109.DescribeDomainRecordsResponse.Record;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.exceptions.ServerException;
import com.aliyuncs.profile.DefaultProfile;
import com.aliyuncs.profile.IClientProfile;


@Component 
public class DDNSTask implements ServletContextListener{
  private Timer timer = null;  
  private static IAcsClient client = null;
  static {
    String regionId = "cn-hangzhou";
    String accessKeyId = "你自己的"; 
    String accessKeySecret = "你自己的";
    IClientProfile profile = DefaultProfile.getProfile(regionId, accessKeyId, accessKeySecret);  
    client = new DefaultAcsClient(profile);
  }

  private static void aliyunDomain() {
    DescribeDomainRecordsRequest request = new DescribeDomainRecordsRequest();
    request.setDomainName("yourdomain.com");
    DescribeDomainRecordsResponse response;
    try {
      response = client.getAcsResponse(request);
      Record record = response.getDomainRecords().get(0);  
      String old_ip = record.getValue();
      String cur_ip = InetAddress.getLocalHost().toString();
      cur_ip = cur_ip.substring(cur_ip.indexOf("/")+1,cur_ip.length());

      if(!old_ip.equals(cur_ip)){
        UpdateDomainRecordRequest udr_req = new UpdateDomainRecordRequest();
        udr_req.setValue(cur_ip);
        udr_req.setType(record.getType());  
        udr_req.setTTL(record.getTTL());  
        udr_req.setPriority(record.getPriority());  
        udr_req.setLine(record.getLine());  
        udr_req.setRecordId(record.getRecordId());   
        udr_req.setRR(record.getRR());  
        @SuppressWarnings("unused")
        UpdateDomainRecordResponse udr_resp =  client.getAcsResponse(udr_req);
      }else{
        //System.out.println("不需要修改");
      } 
    } catch (ServerException e1) {
      e1.printStackTrace();
    } catch (ClientException e1) {
      e1.printStackTrace();
    } catch (UnknownHostException e) {
      e.printStackTrace();
    }       
  }

  @Override
  public void contextDestroyed(ServletContextEvent event) {
    timer.cancel();  
  }

  @Override
  public void contextInitialized(ServletContextEvent event) {
    timer = new Timer(true);  
    timer.schedule(new exportHistoryBean(event.getServletContext()), 0,  10 * 1000);  
  }	

  static class exportHistoryBean extends TimerTask {
    @SuppressWarnings("unused")
    private ServletContext context;

    public exportHistoryBean(ServletContext context) {
      this.context = context;  
    }

    @Override
    public void run() {  
      aliyunDomain();
    }
  }
}

3.2 web.xml写的监听,启动tomcat就会执行任务

<listener>  
  <listener-class>com.cskn.web.common.LoginSessionListener</listener-class>  
</listener>

效果:启动tomcat就会执行心跳更新任务,每10秒查询一次IP,如果之前的IP跟当前IP不同,就会修改解析,否则不执行。

2