• 阿里云域名动态解析


    前景说明:

    你有一个阿里云的域名,想让它解析到你家用宽带动态ip上。

    解决思路:

    1、定时查看宽带的ip;

    2、发现变化时,通过阿里云提供的sdk修改域名解析

    一、阿里云控制台创建AccessKey

    官方文档:创建阿里云AccessKey_访问控制(RAM)-阿里云帮助中心 (aliyun.com)

    二、阿里云 云解析

    官方文档:云解析_SDK中心-阿里云OpenAPI开发者门户 (aliyun.com)

    官方接口:UpdateDomainRecord_云解析_API调试-阿里云OpenAPI开发者门户 (aliyun.com)

    DescribeDomainRecordInfo_云解析_API调试-阿里云OpenAPI开发者门户

    三、上代码

    1、pom.xml引包
    1. <dependencies>
    2. <dependency>
    3. <groupId>com.aliyun</groupId>
    4. <artifactId>alidns20150109</artifactId>
    5. <version>3.1.0</version>
    6. </dependency>
    7. <dependency>
    8. <groupId>com.aliyun</groupId>
    9. <artifactId>credentials-java</artifactId>
    10. <version>0.3.0</version>
    11. </dependency>
    12. </dependencies>
    2、获取外网ip的方法
    1. package com.chhuang;
    2. import java.io.BufferedReader;
    3. import java.io.IOException;
    4. import java.io.InputStreamReader;
    5. import java.net.URL;
    6. import java.util.ArrayList;
    7. import java.util.List;
    8. import java.util.concurrent.*;
    9. import java.util.regex.Pattern;
    10. public class ExternalIPUtil {
    11. /**
    12. * IP 地址校验的正则表达式
    13. */
    14. private static final Pattern IPV4_PATTERN = Pattern.compile("^(([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\.){3}([01]?\\d\\d?|2[0-4]\\d|25[0-5])$");
    15. /**
    16. * 获取 IP 地址的服务列表
    17. */
    18. private static final String[] IPV4_SERVICES = {
    19. "http://checkip.amazonaws.com/",
    20. "https://ipv4.icanhazip.com/",
    21. "http://bot.whatismyipaddress.com/"
    22. // and so on ...
    23. };
    24. // 线程池的 ExecutorService.invokeAny(callables) 方法用于并发执行多个线程,并拿到最快的执行成功的线程的返回值,
    25. // 只要有一个执行成功,其他失败的任务都会忽略。但是如果全部失败,
    26. // 例如本机根本就没有连外网,那么就会抛出 ExecutionException 异常。
    27. public static String get() throws ExecutionException, InterruptedException {
    28. List> callables = new ArrayList<>();
    29. for (String ipService : IPV4_SERVICES) {
    30. callables.add(() -> get(ipService));
    31. }
    32. ExecutorService executorService = Executors.newCachedThreadPool();
    33. try {
    34. // 返回第一个成功获取的 IP
    35. return executorService.invokeAny(callables);
    36. } finally {
    37. executorService.shutdown();
    38. }
    39. }
    40. private static String get(String url) throws IOException {
    41. try (BufferedReader in = new BufferedReader(new InputStreamReader(new URL(url).openStream()))) {
    42. String ip = in.readLine();
    43. if (IPV4_PATTERN.matcher(ip).matches()) {
    44. return ip;
    45. } else {
    46. throw new IOException("invalid IPv4 address: " + ip);
    47. }
    48. }
    49. }
    50. }
    3、使用云解析
    1. package com.chhuang;
    2. import com.aliyun.alidns20150109.Client;
    3. import com.aliyun.alidns20150109.models.DescribeDomainRecordInfoRequest;
    4. import com.aliyun.alidns20150109.models.DescribeDomainRecordInfoResponse;
    5. import com.aliyun.alidns20150109.models.UpdateDomainRecordRequest;
    6. import com.aliyun.tea.TeaException;
    7. import com.aliyun.teaopenapi.models.Config;
    8. import com.aliyun.teautil.Common;
    9. import com.aliyun.teautil.models.RuntimeOptions;
    10. import java.util.Random;
    11. /**
    12. * Hello world!
    13. *
    14. */
    15. public class App {
    16. private static final String APP_ALIBABA_ID = "你自己的ALIBABA_CLOUD_ACCESS_KEY_ID";
    17. private static final String SECURITY_ALIBABA_KEY = "你自己的ALIBABA_CLOUD_ACCESS_KEY_SECRET";
    18. /**
    19. * 使用AK&SK初始化账号Client
    20. * @return Client
    21. * @throws Exception
    22. */
    23. public static Client createClient() throws Exception {
    24. // 工程代码泄露可能会导致 AccessKey 泄露,并威胁账号下所有资源的安全性。以下代码示例仅供参考。
    25. // 建议使用更安全的 STS 方式,更多鉴权访问方式请参见:https://help.aliyun.com/document_detail/378657.html。
    26. Config config = new Config()
    27. .setAccessKeyId(APP_ALIBABA_ID)
    28. .setAccessKeySecret(SECURITY_ALIBABA_KEY);
    29. // Endpoint 请参考 https://api.aliyun.com/product/Alidns
    30. config.endpoint = "alidns.cn-hangzhou.aliyuncs.com";
    31. return new Client(config);
    32. }
    33. public static void main( String[] args ) throws Exception {
    34. while (true) {
    35. Random random = new Random();
    36. Thread.sleep((random.nextInt(600) + 600) * 1000);
    37. // 获取外网ip
    38. String ip = ExternalIPUtil.get();
    39. System.out.println("ip=" + ip);
    40. // 更新域名解析
    41. updateDomain(ip);
    42. }
    43. }
    44. private static void updateDomain(String ip) throws Exception {
    45. Client client = App.createClient();
    46. // 获取解析记录的详细信息
    47. DescribeDomainRecordInfoRequest describeDomainRecordInfoRequest = new DescribeDomainRecordInfoRequest()
    48. .setRecordId("你自己域名解析记录的recordId");
    49. RuntimeOptions runtime = new RuntimeOptions();
    50. try {
    51. // 复制代码运行请自行打印 API 的返回值
    52. DescribeDomainRecordInfoResponse response = client.describeDomainRecordInfoWithOptions(describeDomainRecordInfoRequest, runtime);
    53. String value = response.getBody().getValue();
    54. // 判断 ip 是否需要修改
    55. if (!ip.equals(value)) {
    56. UpdateDomainRecordRequest updateDomainRecordRequest = new UpdateDomainRecordRequest()
    57. .setRecordId("你自己域名解析记录的recordId") // 通过阿里云后台,DescribeDomainRecords 获取解析记录
    58. .setRR("www")
    59. .setType("A")
    60. .setValue(ip)
    61. .setTTL(600L);
    62. // 复制代码运行请自行打印 API 的返回值
    63. client.updateDomainRecordWithOptions(updateDomainRecordRequest, runtime);
    64. }
    65. } catch (TeaException error) {
    66. // 此处仅做打印展示,请谨慎对待异常处理,在工程项目中切勿直接忽略异常。
    67. // 错误 message
    68. error.printStackTrace();
    69. // 诊断地址
    70. System.out.println(error.getData().get("Recommend"));
    71. Common.assertAsString(error.message);
    72. } catch (Exception _error) {
    73. _error.printStackTrace();
    74. TeaException error = new TeaException(_error.getMessage(), _error);
    75. // 此处仅做打印展示,请谨慎对待异常处理,在工程项目中切勿直接忽略异常。
    76. // 诊断地址
    77. System.out.println(error.getData().get("Recommend"));
    78. Common.assertAsString(error.message);
    79. }
    80. }
    81. }

  • 相关阅读:
    Java集合框架详解(四)——Map接口、HashMap类、LinkedHashMap类
    【C++】C++调用Python
    2022最新IDEA配置Maven及Tomcat--详细、简单,适合初学者
    ElasticSearch教程(详解版)
    开启更高效之路,美创科技暗数据发现和数据分类分级系统全新升级
    黑马点评回顾 redis实现共享session
    造车新势力“蔚小理”变弱了?不,他们已走过幼年期
    与MySQL的纠缠(卸载与安装)
    (2) ESP32获取图像电脑端显示,并跟踪对应颜色
    02--Spring中AOP
  • 原文地址:https://blog.csdn.net/ihchenchen/article/details/138121530