责任与担当 發表於 2023-9-17 00:00:00

如何通过阿里云实现动态域名解析DDNS的方法

<p>
        <span><strong>前言</strong></span></p>
<p>
        该脚本的代码大部分是参考自阿里云的官方帮助文档。<br>
        1, 脚本语言使用的是python, 我个人只是了解python,没有太深入的知识功底<br>
        2, 脚本代码我会尽量详细地添加注释说明,有问题欢迎留言交流,但回复可能不会那么及时。</p>
<p>
        <span><strong>前置条件</strong></span></p>
<p>
        1、域名是在阿里云购买的 (我的域名本身就是阿里云买的,其他的域名我没有测试过)<br>
        2、地址必须是公网地址,不然加了解析也没有用 (这个不用多加解释了)</p>
<p>
        <span><strong>安装阿里云SDK</strong></span></p>
<p>
        需要安装三个SDK库,一个是阿里云核心SDK库,一个是阿里云域名SDK库,一个是DNS库<br>
        阿里云核心SDK库:pip install aliyun-python-sdk-core<br>
        阿里云域名SDK库:pip install aliyun-python-sdk-domain<br>
        阿里云DNSSDK库:pip install aliyun-python-sdk-alidns<br>
        说明:<br>
        1, 目前官方文档上说的是需要安装前两个SDK库,但我实测确定还需要第三个库!<br>
        2, 如果你使用的是ubuntu系统,并且同时有python2/python3和pip2/pip3,安装时前面的命令请写清楚版本,特别是pip。 我的系统pip默认是2.x,使用pip install xxx 命令安装的库无效,使用 pip3 install xxx 才成功(如果知道如何随意切换python和pip版本,请留言告知,感谢)。</p>
<p>
        脚本的具体功能</p>
<p>
        1, 获取外网ip地址<br>
        2,获取域名解析记录<br>
        3,新增域名解析记录<br>
        3,更新域名解析记录<br>
        4,删除域名解析记录 (并不建议将该功能添加在实际脚本中)<br>
        5,批量操作,如果记录不存在则添加记录,存在则更新记录</p>
<p>
        脚本代码</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlighterbash" id="highlighter_965342">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                        <div class="line number2 index1 alt1">
                                                                2</div>
                                                        <div class="line number3 index2 alt2">
                                                                3</div>
                                                        <div class="line number4 index3 alt1">
                                                                4</div>
                                                        <div class="line number5 index4 alt2">
                                                                5</div>
                                                        <div class="line number6 index5 alt1">
                                                                6</div>
                                                        <div class="line number7 index6 alt2">
                                                                7</div>
                                                        <div class="line number8 index7 alt1">
                                                                8</div>
                                                        <div class="line number9 index8 alt2">
                                                                9</div>
                                                        <div class="line number10 index9 alt1">
                                                                10</div>
                                                        <div class="line number11 index10 alt2">
                                                                11</div>
                                                        <div class="line number12 index11 alt1">
                                                                12</div>
                                                        <div class="line number13 index12 alt2">
                                                                13</div>
                                                        <div class="line number14 index13 alt1">
                                                                14</div>
                                                        <div class="line number15 index14 alt2">
                                                                15</div>
                                                        <div class="line number16 index15 alt1">
                                                                16</div>
                                                        <div class="line number17 index16 alt2">
                                                                17</div>
                                                        <div class="line number18 index17 alt1">
                                                                18</div>
                                                        <div class="line number19 index18 alt2">
                                                                19</div>
                                                        <div class="line number20 index19 alt1">
                                                                20</div>
                                                        <div class="line number21 index20 alt2">
                                                                21</div>
                                                        <div class="line number22 index21 alt1">
                                                                22</div>
                                                        <div class="line number23 index22 alt2">
                                                                23</div>
                                                        <div class="line number24 index23 alt1">
                                                                24</div>
                                                        <div class="line number25 index24 alt2">
                                                                25</div>
                                                        <div class="line number26 index25 alt1">
                                                                26</div>
                                                        <div class="line number27 index26 alt2">
                                                                27</div>
                                                        <div class="line number28 index27 alt1">
                                                                28</div>
                                                        <div class="line number29 index28 alt2">
                                                                29</div>
                                                        <div class="line number30 index29 alt1">
                                                                30</div>
                                                        <div class="line number31 index30 alt2">
                                                                31</div>
                                                        <div class="line number32 index31 alt1">
                                                                32</div>
                                                        <div class="line number33 index32 alt2">
                                                                33</div>
                                                        <div class="line number34 index33 alt1">
                                                                34</div>
                                                        <div class="line number35 index34 alt2">
                                                                35</div>
                                                        <div class="line number36 index35 alt1">
                                                                36</div>
                                                        <div class="line number37 index36 alt2">
                                                                37</div>
                                                        <div class="line number38 index37 alt1">
                                                                38</div>
                                                        <div class="line number39 index38 alt2">
                                                                39</div>
                                                        <div class="line number40 index39 alt1">
                                                                40</div>
                                                        <div class="line number41 index40 alt2">
                                                                41</div>
                                                        <div class="line number42 index41 alt1">
                                                                42</div>
                                                        <div class="line number43 index42 alt2">
                                                                43</div>
                                                        <div class="line number44 index43 alt1">
                                                                44</div>
                                                        <div class="line number45 index44 alt2">
                                                                45</div>
                                                        <div class="line number46 index45 alt1">
                                                                46</div>
                                                        <div class="line number47 index46 alt2">
                                                                47</div>
                                                        <div class="line number48 index47 alt1">
                                                                48</div>
                                                        <div class="line number49 index48 alt2">
                                                                49</div>
                                                        <div class="line number50 index49 alt1">
                                                                50</div>
                                                        <div class="line number51 index50 alt2">
                                                                51</div>
                                                        <div class="line number52 index51 alt1">
                                                                52</div>
                                                        <div class="line number53 index52 alt2">
                                                                53</div>
                                                        <div class="line number54 index53 alt1">
                                                                54</div>
                                                        <div class="line number55 index54 alt2">
                                                                55</div>
                                                        <div class="line number56 index55 alt1">
                                                                56</div>
                                                        <div class="line number57 index56 alt2">
                                                                57</div>
                                                        <div class="line number58 index57 alt1">
                                                                58</div>
                                                        <div class="line number59 index58 alt2">
                                                                59</div>
                                                        <div class="line number60 index59 alt1">
                                                                60</div>
                                                        <div class="line number61 index60 alt2">
                                                                61</div>
                                                        <div class="line number62 index61 alt1">
                                                                62</div>
                                                        <div class="line number63 index62 alt2">
                                                                63</div>
                                                        <div class="line number64 index63 alt1">
                                                                64</div>
                                                        <div class="line number65 index64 alt2">
                                                                65</div>
                                                        <div class="line number66 index65 alt1">
                                                                66</div>
                                                        <div class="line number67 index66 alt2">
                                                                67</div>
                                                        <div class="line number68 index67 alt1">
                                                                68</div>
                                                        <div class="line number69 index68 alt2">
                                                                69</div>
                                                        <div class="line number70 index69 alt1">
                                                                70</div>
                                                        <div class="line number71 index70 alt2">
                                                                71</div>
                                                        <div class="line number72 index71 alt1">
                                                                72</div>
                                                        <div class="line number73 index72 alt2">
                                                                73</div>
                                                        <div class="line number74 index73 alt1">
                                                                74</div>
                                                        <div class="line number75 index74 alt2">
                                                                75</div>
                                                        <div class="line number76 index75 alt1">
                                                                76</div>
                                                        <div class="line number77 index76 alt2">
                                                                77</div>
                                                        <div class="line number78 index77 alt1">
                                                                78</div>
                                                        <div class="line number79 index78 alt2">
                                                                79</div>
                                                        <div class="line number80 index79 alt1">
                                                                80</div>
                                                        <div class="line number81 index80 alt2">
                                                                81</div>
                                                        <div class="line number82 index81 alt1">
                                                                82</div>
                                                        <div class="line number83 index82 alt2">
                                                                83</div>
                                                        <div class="line number84 index83 alt1">
                                                                84</div>
                                                        <div class="line number85 index84 alt2">
                                                                85</div>
                                                        <div class="line number86 index85 alt1">
                                                                86</div>
                                                        <div class="line number87 index86 alt2">
                                                                87</div>
                                                        <div class="line number88 index87 alt1">
                                                                88</div>
                                                        <div class="line number89 index88 alt2">
                                                                89</div>
                                                        <div class="line number90 index89 alt1">
                                                                90</div>
                                                        <div class="line number91 index90 alt2">
                                                                91</div>
                                                        <div class="line number92 index91 alt1">
                                                                92</div>
                                                        <div class="line number93 index92 alt2">
                                                                93</div>
                                                        <div class="line number94 index93 alt1">
                                                                94</div>
                                                        <div class="line number95 index94 alt2">
                                                                95</div>
                                                        <div class="line number96 index95 alt1">
                                                                96</div>
                                                        <div class="line number97 index96 alt2">
                                                                97</div>
                                                        <div class="line number98 index97 alt1">
                                                                98</div>
                                                        <div class="line number99 index98 alt2">
                                                                99</div>
                                                        <div class="line number100 index99 alt1">
                                                                100</div>
                                                        <div class="line number101 index100 alt2">
                                                                101</div>
                                                        <div class="line number102 index101 alt1">
                                                                102</div>
                                                        <div class="line number103 index102 alt2">
                                                                103</div>
                                                        <div class="line number104 index103 alt1">
                                                                104</div>
                                                        <div class="line number105 index104 alt2">
                                                                105</div>
                                                        <div class="line number106 index105 alt1">
                                                                106</div>
                                                        <div class="line number107 index106 alt2">
                                                                107</div>
                                                        <div class="line number108 index107 alt1">
                                                                108</div>
                                                        <div class="line number109 index108 alt2">
                                                                109</div>
                                                        <div class="line number110 index109 alt1">
                                                                110</div>
                                                        <div class="line number111 index110 alt2">
                                                                111</div>
                                                        <div class="line number112 index111 alt1">
                                                                112</div>
                                                        <div class="line number113 index112 alt2">
                                                                113</div>
                                                        <div class="line number114 index113 alt1">
                                                                114</div>
                                                        <div class="line number115 index114 alt2">
                                                                115</div>
                                                        <div class="line number116 index115 alt1">
                                                                116</div>
                                                        <div class="line number117 index116 alt2">
                                                                117</div>
                                                        <div class="line number118 index117 alt1">
                                                                118</div>
                                                        <div class="line number119 index118 alt2">
                                                                119</div>
                                                        <div class="line number120 index119 alt1">
                                                                120</div>
                                                        <div class="line number121 index120 alt2">
                                                                121</div>
                                                        <div class="line number122 index121 alt1">
                                                                122</div>
                                                        <div class="line number123 index122 alt2">
                                                                123</div>
                                                        <div class="line number124 index123 alt1">
                                                                124</div>
                                                        <div class="line number125 index124 alt2">
                                                                125</div>
                                                        <div class="line number126 index125 alt1">
                                                                126</div>
                                                        <div class="line number127 index126 alt2">
                                                                127</div>
                                                        <div class="line number128 index127 alt1">
                                                                128</div>
                                                        <div class="line number129 index128 alt2">
                                                                129</div>
                                                        <div class="line number130 index129 alt1">
                                                                130</div>
                                                        <div class="line number131 index130 alt2">
                                                                131</div>
                                                        <div class="line number132 index131 alt1">
                                                                132</div>
                                                        <div class="line number133 index132 alt2">
                                                                133</div>
                                                        <div class="line number134 index133 alt1">
                                                                134</div>
                                                        <div class="line number135 index134 alt2">
                                                                135</div>
                                                        <div class="line number136 index135 alt1">
                                                                136</div>
                                                        <div class="line number137 index136 alt2">
                                                                137</div>
                                                        <div class="line number138 index137 alt1">
                                                                138</div>
                                                        <div class="line number139 index138 alt2">
                                                                139</div>
                                                        <div class="line number140 index139 alt1">
                                                                140</div>
                                                        <div class="line number141 index140 alt2">
                                                                141</div>
                                                        <div class="line number142 index141 alt1">
                                                                142</div>
                                                        <div class="line number143 index142 alt2">
                                                                143</div>
                                                        <div class="line number144 index143 alt1">
                                                                144</div>
                                                        <div class="line number145 index144 alt2">
                                                                145</div>
                                                        <div class="line number146 index145 alt1">
                                                                146</div>
                                                        <div class="line number147 index146 alt2">
                                                                147</div>
                                                        <div class="line number148 index147 alt1">
                                                                148</div>
                                                        <div class="line number149 index148 alt2">
                                                                149</div>
                                                        <div class="line number150 index149 alt1">
                                                                150</div>
                                                        <div class="line number151 index150 alt2">
                                                                151</div>
                                                        <div class="line number152 index151 alt1">
                                                                152</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="bash preprocessor bold">#!/usr/bin/env python</code>
</div>
                                                                <div class="line number2 index1 alt1">
                                                                        <code class="bash comments">#coding=utf-8</code>
</div>
                                                                <div class="line number3 index2 alt2">
                                                                         </div>
                                                                <div class="line number4 index3 alt1">
                                                                        <code class="bash comments"># 加载核心SDK</code>
</div>
                                                                <div class="line number5 index4 alt2">
                                                                        <code class="bash plain">from aliyunsdkcore.client </code><code class="bash functions">import</code> <code class="bash plain">AcsClient</code>
</div>
                                                                <div class="line number6 index5 alt1">
                                                                        <code class="bash plain">from aliyunsdkcore.acs_exception.exceptions </code><code class="bash functions">import</code> <code class="bash plain">ClientException</code>
</div>
                                                                <div class="line number7 index6 alt2">
                                                                        <code class="bash plain">from aliyunsdkcore.acs_exception.exceptions </code><code class="bash functions">import</code> <code class="bash plain">ServerException</code>
</div>
                                                                <div class="line number8 index7 alt1">
                                                                         </div>
                                                                <div class="line number9 index8 alt2">
                                                                        <code class="bash comments"># 加载获取 、 新增、 更新、 删除接口</code>
</div>
                                                                <div class="line number10 index9 alt1">
                                                                        <code class="bash plain">from aliyunsdkalidns.request.v20150109 </code><code class="bash functions">import</code> <code class="bash plain">DescribeSubDomainRecordsRequest, AddDomainRecordRequest, UpdateDomainRecordRequest, DeleteDomainRecordRequest</code>
</div>
                                                                <div class="line number11 index10 alt2">
                                                                         </div>
                                                                <div class="line number12 index11 alt1">
                                                                        <code class="bash comments"># 加载内置模块</code>
</div>
                                                                <div class="line number13 index12 alt2">
                                                                        <code class="bash functions">import</code> <code class="bash plain">json,urllib</code>
</div>
                                                                <div class="line number14 index13 alt1">
                                                                         </div>
                                                                <div class="line number15 index14 alt2">
                                                                        <code class="bash comments"># AccessKey 和 Secret 建议使用 RAM 子账户的 KEY 和 SECRET 增加安全性</code>
</div>
                                                                <div class="line number16 index15 alt1">
                                                                        <code class="bash plain">ID = </code><code class="bash string">'xxxxxxx'</code>
</div>
                                                                <div class="line number17 index16 alt2">
                                                                        <code class="bash plain">SECRET = </code><code class="bash string">'xxxxxx'</code>
</div>
                                                                <div class="line number18 index17 alt1">
                                                                         </div>
                                                                <div class="line number19 index18 alt2">
                                                                        <code class="bash comments"># 地区节点 可选地区取决于你的阿里云帐号等级,普通用户只有四个,分别是杭州、上海、深圳、河北,具体参考官网API</code>
</div>
                                                                <div class="line number20 index19 alt1">
                                                                        <code class="bash plain">regionId = </code><code class="bash string">'cn-hangzhou'</code>
</div>
                                                                <div class="line number21 index20 alt2">
                                                                         </div>
                                                                <div class="line number22 index21 alt1">
                                                                        <code class="bash comments"># 配置认证信息</code>
</div>
                                                                <div class="line number23 index22 alt2">
                                                                        <code class="bash plain">client = AcsClient(ID, SECRET, regionId)</code>
</div>
                                                                <div class="line number24 index23 alt1">
                                                                         </div>
                                                                <div class="line number25 index24 alt2">
                                                                        <code class="bash comments"># 设置主域名</code>
</div>
                                                                <div class="line number26 index25 alt1">
                                                                        <code class="bash plain">DomainName = </code><code class="bash string">'example.com'</code>
</div>
                                                                <div class="line number27 index26 alt2">
                                                                         </div>
                                                                <div class="line number28 index27 alt1">
                                                                        <code class="bash comments"># 子域名列表 列表参数可根据实际需求增加或减少值</code>
</div>
                                                                <div class="line number29 index28 alt2">
                                                                        <code class="bash plain">SubDomainList = [</code><code class="bash string">'a'</code><code class="bash plain">, </code><code class="bash string">'b'</code><code class="bash plain">, </code><code class="bash string">'c'</code><code class="bash plain">]</code>
</div>
                                                                <div class="line number30 index29 alt1">
                                                                         </div>
                                                                <div class="line number31 index30 alt2">
                                                                        <code class="bash comments"># 获取外网IP  三个地址返回的ip地址格式各不相同,3322 的是最纯净的格式, 备选1为 json格式 备选2 为curl方式获取 两个备选地址都需要对获取值作进一步处理才能使用</code>
</div>
                                                                <div class="line number32 index31 alt1">
                                                                        <code class="bash plain">def getIp():</code>
</div>
                                                                <div class="line number33 index32 alt2">
                                                                        <code class="bash spaces">  </code><code class="bash comments"># 备选地址: 1, http://pv.sohu.com/cityjson?ie=utf-8  2,curl -L tool.lu/ip</code>
</div>
                                                                <div class="line number34 index33 alt1">
                                                                        <code class="bash spaces">  </code><code class="bash plain">with urllib.request.urlopen(</code><code class="bash string">'http://www.3322.org/dyndns/getip'</code><code class="bash plain">) as response:</code>
</div>
                                                                <div class="line number35 index34 alt2">
                                                                        <code class="bash spaces">    </code><code class="bash plain">html = response.</code><code class="bash functions">read</code><code class="bash plain">()</code>
</div>
                                                                <div class="line number36 index35 alt1">
                                                                        <code class="bash spaces">    </code><code class="bash plain">ip = str(html, encoding=</code><code class="bash string">'utf-8'</code><code class="bash plain">).replace(</code><code class="bash string">"\n"</code><code class="bash plain">, </code><code class="bash string">""</code><code class="bash plain">)</code>
</div>
                                                                <div class="line number37 index36 alt2">
                                                                        <code class="bash spaces">  </code><code class="bash keyword">return</code> <code class="bash plain">ip</code>
</div>
                                                                <div class="line number38 index37 alt1">
                                                                         </div>
                                                                <div class="line number39 index38 alt2">
                                                                        <code class="bash comments"># 查询记录</code>
</div>
                                                                <div class="line number40 index39 alt1">
                                                                        <code class="bash plain">def getDomainInfo(SubDomain):</code>
</div>
                                                                <div class="line number41 index40 alt2">
                                                                        <code class="bash spaces">  </code><code class="bash plain">request = DescribeSubDomainRecordsRequest.DescribeSubDomainRecordsRequest()</code>
</div>
                                                                <div class="line number42 index41 alt1">
                                                                        <code class="bash spaces">  </code><code class="bash plain">request.set_accept_format(</code><code class="bash string">'json'</code><code class="bash plain">)</code>
</div>
                                                                <div class="line number43 index42 alt2">
                                                                         </div>
                                                                <div class="line number44 index43 alt1">
                                                                        <code class="bash spaces">  </code><code class="bash comments"># 设置要查询的记录类型为 A记录  官网支持A / CNAME / MX / AAAA / TXT / NS / SRV / CAA / URL隐性(显性)转发 如果有需要可将该值配置为参数传入</code>
</div>
                                                                <div class="line number45 index44 alt2">
                                                                        <code class="bash spaces">  </code><code class="bash plain">request.set_Type(</code><code class="bash string">"A"</code><code class="bash plain">)</code>
</div>
                                                                <div class="line number46 index45 alt1">
                                                                         </div>
                                                                <div class="line number47 index46 alt2">
                                                                        <code class="bash spaces">  </code><code class="bash comments"># 指定查记的域名 格式为 'test.example.com'</code>
</div>
                                                                <div class="line number48 index47 alt1">
                                                                        <code class="bash spaces">  </code><code class="bash plain">request.set_SubDomain(SubDomain)</code>
</div>
                                                                <div class="line number49 index48 alt2">
                                                                         </div>
                                                                <div class="line number50 index49 alt1">
                                                                        <code class="bash spaces">  </code><code class="bash plain">response = client.do_action_with_exception(request)</code>
</div>
                                                                <div class="line number51 index50 alt2">
                                                                        <code class="bash spaces">  </code><code class="bash plain">response = str(response, encoding=</code><code class="bash string">'utf-8'</code><code class="bash plain">)</code>
</div>
                                                                <div class="line number52 index51 alt1">
                                                                         </div>
                                                                <div class="line number53 index52 alt2">
                                                                        <code class="bash spaces">  </code><code class="bash comments"># 将获取到的记录转换成json对象并返回</code>
</div>
                                                                <div class="line number54 index53 alt1">
                                                                        <code class="bash spaces">  </code><code class="bash keyword">return</code> <code class="bash plain">json.loads(response)</code>
</div>
                                                                <div class="line number55 index54 alt2">
                                                                         </div>
                                                                <div class="line number56 index55 alt1">
                                                                        <code class="bash comments"># 新增记录 (默认都设置为A记录,通过配置set_Type可设置为其他记录)</code>
</div>
                                                                <div class="line number57 index56 alt2">
                                                                        <code class="bash plain">def addDomainRecord(client,value,rr,domainname):</code>
</div>
                                                                <div class="line number58 index57 alt1">
                                                                        <code class="bash spaces">  </code><code class="bash plain">request = AddDomainRecordRequest.AddDomainRecordRequest()</code>
</div>
                                                                <div class="line number59 index58 alt2">
                                                                        <code class="bash spaces">  </code><code class="bash plain">request.set_accept_format(</code><code class="bash string">'json'</code><code class="bash plain">)</code>
</div>
                                                                <div class="line number60 index59 alt1">
                                                                         </div>
                                                                <div class="line number61 index60 alt2">
                                                                        <code class="bash spaces">  </code><code class="bash comments"># request.set_Priority('1') # MX 记录时的必选参数</code>
</div>
                                                                <div class="line number62 index61 alt1">
                                                                        <code class="bash spaces">  </code><code class="bash plain">request.set_TTL(</code><code class="bash string">'600'</code><code class="bash plain">)    </code><code class="bash comments"># 可选值的范围取决于你的阿里云账户等级,免费版为 600 - 86400 单位为秒 </code>
</div>
                                                                <div class="line number63 index62 alt2">
                                                                        <code class="bash spaces">  </code><code class="bash plain">request.set_Value(value)   </code><code class="bash comments"># 新增的 ip 地址</code>
</div>
                                                                <div class="line number64 index63 alt1">
                                                                        <code class="bash spaces">  </code><code class="bash plain">request.set_Type(</code><code class="bash string">'A'</code><code class="bash plain">)    </code><code class="bash comments"># 记录类型</code>
</div>
                                                                <div class="line number65 index64 alt2">
                                                                        <code class="bash spaces">  </code><code class="bash plain">request.set_RR(rr)      </code><code class="bash comments"># 子域名名称 </code>
</div>
                                                                <div class="line number66 index65 alt1">
                                                                        <code class="bash spaces">  </code><code class="bash plain">request.set_DomainName(domainname) </code><code class="bash comments">#主域名</code>
</div>
                                                                <div class="line number67 index66 alt2">
                                                                         </div>
                                                                <div class="line number68 index67 alt1">
                                                                        <code class="bash spaces">  </code><code class="bash comments"># 获取记录信息,返回信息中包含 TotalCount 字段,表示获取到的记录条数 0 表示没有记录, 其他数字为多少表示有多少条相同记录,正常有记录的值应该为1,如果值大于1则应该检查是不是重复添加了相同的记录</code>
</div>
                                                                <div class="line number69 index68 alt2">
                                                                        <code class="bash spaces">  </code><code class="bash plain">response = client.do_action_with_exception(request)</code>
</div>
                                                                <div class="line number70 index69 alt1">
                                                                        <code class="bash spaces">  </code><code class="bash plain">response = str(response, encoding=</code><code class="bash string">'utf-8'</code><code class="bash plain">)</code>
</div>
                                                                <div class="line number71 index70 alt2">
                                                                        <code class="bash spaces">  </code><code class="bash plain">relsult = json.loads(response)</code>
</div>
                                                                <div class="line number72 index71 alt1">
                                                                        <code class="bash spaces">  </code><code class="bash keyword">return</code> <code class="bash plain">relsult</code>
</div>
                                                                <div class="line number73 index72 alt2">
                                                                         </div>
                                                                <div class="line number74 index73 alt1">
                                                                        <code class="bash comments"># 更新记录</code>
</div>
                                                                <div class="line number75 index74 alt2">
                                                                        <code class="bash plain">def updateDomainRecord(client,value,rr,record_id):</code>
</div>
                                                                <div class="line number76 index75 alt1">
                                                                        <code class="bash spaces">  </code><code class="bash plain">request = UpdateDomainRecordRequest.UpdateDomainRecordRequest()</code>
</div>
                                                                <div class="line number77 index76 alt2">
                                                                        <code class="bash spaces">  </code><code class="bash plain">request.set_accept_format(</code><code class="bash string">'json'</code><code class="bash plain">)</code>
</div>
                                                                <div class="line number78 index77 alt1">
                                                                         </div>
                                                                <div class="line number79 index78 alt2">
                                                                        <code class="bash spaces">  </code><code class="bash comments"># request.set_Priority('1')</code>
</div>
                                                                <div class="line number80 index79 alt1">
                                                                        <code class="bash spaces">  </code><code class="bash plain">request.set_TTL(</code><code class="bash string">'600'</code><code class="bash plain">)</code>
</div>
                                                                <div class="line number81 index80 alt2">
                                                                        <code class="bash spaces">  </code><code class="bash plain">request.set_Value(value) </code><code class="bash comments"># 新的ip地址</code>
</div>
                                                                <div class="line number82 index81 alt1">
                                                                        <code class="bash spaces">  </code><code class="bash plain">request.set_Type(</code><code class="bash string">'A'</code><code class="bash plain">)</code>
</div>
                                                                <div class="line number83 index82 alt2">
                                                                        <code class="bash spaces">  </code><code class="bash plain">request.set_RR(rr)</code>
</div>
                                                                <div class="line number84 index83 alt1">
                                                                        <code class="bash spaces">  </code><code class="bash plain">request.set_RecordId(record_id) </code><code class="bash comments"># 更新记录需要指定 record_id ,该字段为记录的唯一标识,可以在获取方法的返回信息中得到该字段的值</code>
</div>
                                                                <div class="line number85 index84 alt2">
                                                                         </div>
                                                                <div class="line number86 index85 alt1">
                                                                        <code class="bash spaces">  </code><code class="bash plain">response = client.do_action_with_exception(request)</code>
</div>
                                                                <div class="line number87 index86 alt2">
                                                                        <code class="bash spaces">  </code><code class="bash plain">response = str(response, encoding=</code><code class="bash string">'utf-8'</code><code class="bash plain">)</code>
</div>
                                                                <div class="line number88 index87 alt1">
                                                                        <code class="bash spaces">  </code><code class="bash keyword">return</code> <code class="bash plain">response</code>
</div>
                                                                <div class="line number89 index88 alt2">
                                                                         </div>
                                                                <div class="line number90 index89 alt1">
                                                                        <code class="bash comments"># 删除记录</code>
</div>
                                                                <div class="line number91 index90 alt2">
                                                                        <code class="bash plain">def delDomainRecord(client,subdomain):</code>
</div>
                                                                <div class="line number92 index91 alt1">
                                                                        <code class="bash spaces">  </code><code class="bash plain">info = getDomainInfo(subdomain)</code>
</div>
                                                                <div class="line number93 index92 alt2">
                                                                        <code class="bash spaces">  </code><code class="bash keyword">if</code> <code class="bash plain">info[</code><code class="bash string">'TotalCount'</code><code class="bash plain">] == 0:</code>
</div>
                                                                <div class="line number94 index93 alt1">
                                                                        <code class="bash spaces">    </code><code class="bash plain">print(</code><code class="bash string">'没有相关的记录信息,删除失败!'</code><code class="bash plain">)</code>
</div>
                                                                <div class="line number95 index94 alt2">
                                                                        <code class="bash spaces">  </code><code class="bash keyword">elif</code> <code class="bash plain">info[</code><code class="bash string">"TotalCount"</code><code class="bash plain">] == 1:</code>
</div>
                                                                <div class="line number96 index95 alt1">
                                                                        <code class="bash spaces">    </code><code class="bash plain">print(</code><code class="bash string">'准备删除记录'</code><code class="bash plain">)</code>
</div>
                                                                <div class="line number97 index96 alt2">
                                                                        <code class="bash spaces">    </code><code class="bash plain">request = DeleteDomainRecordRequest.DeleteDomainRecordRequest()</code>
</div>
                                                                <div class="line number98 index97 alt1">
                                                                        <code class="bash spaces">    </code><code class="bash plain">request.set_accept_format(</code><code class="bash string">'json'</code><code class="bash plain">)</code>
</div>
                                                                <div class="line number99 index98 alt2">
                                                                         </div>
                                                                <div class="line number100 index99 alt1">
                                                                        <code class="bash spaces">    </code><code class="bash plain">record_id = info[</code><code class="bash string">"DomainRecords"</code><code class="bash plain">][</code><code class="bash string">"Record"</code><code class="bash plain">][</code><code class="bash string">"RecordId"</code><code class="bash plain">]</code>
</div>
                                                                <div class="line number101 index100 alt2">
                                                                        <code class="bash spaces">    </code><code class="bash plain">request.set_RecordId(record_id) </code><code class="bash comments"># 删除记录需要指定 record_id ,该字段为记录的唯一标识,可以在获取方法的返回信息中得到该字段的值</code>
</div>
                                                                <div class="line number102 index101 alt1">
                                                                        <code class="bash spaces">    </code><code class="bash plain">result = client.do_action_with_exception(request)</code>
</div>
                                                                <div class="line number103 index102 alt2">
                                                                        <code class="bash spaces">    </code><code class="bash plain">print(</code><code class="bash string">'删除成功,返回信息:'</code><code class="bash plain">)</code>
</div>
                                                                <div class="line number104 index103 alt1">
                                                                        <code class="bash spaces">    </code><code class="bash plain">print(result)</code>
</div>
                                                                <div class="line number105 index104 alt2">
                                                                        <code class="bash spaces">  </code><code class="bash keyword">else</code><code class="bash plain">:</code>
</div>
                                                                <div class="line number106 index105 alt1">
                                                                        <code class="bash spaces">    </code><code class="bash comments"># 正常不应该有多条相同的记录,如果存在这种情况,应该手动去网站检查核实是否有操作失误</code>
</div>
                                                                <div class="line number107 index106 alt2">
                                                                        <code class="bash spaces">    </code><code class="bash plain">print(</code><code class="bash string">"存在多个相同子域名解析记录值,请核查后再操作!"</code><code class="bash plain">)</code>
</div>
                                                                <div class="line number108 index107 alt1">
                                                                         </div>
                                                                <div class="line number109 index108 alt2">
                                                                        <code class="bash comments"># 有记录则更新,没有记录则新增</code>
</div>
                                                                <div class="line number110 index109 alt1">
                                                                        <code class="bash plain">def setDomainRecord(client,value,rr,domainname):</code>
</div>
                                                                <div class="line number111 index110 alt2">
                                                                        <code class="bash spaces">  </code><code class="bash plain">info = getDomainInfo(rr + </code><code class="bash string">'.'</code> <code class="bash plain">+ domainname)</code>
</div>
                                                                <div class="line number112 index111 alt1">
                                                                        <code class="bash spaces">  </code><code class="bash keyword">if</code> <code class="bash plain">info[</code><code class="bash string">'TotalCount'</code><code class="bash plain">] == 0:</code>
</div>
                                                                <div class="line number113 index112 alt2">
                                                                        <code class="bash spaces">    </code><code class="bash plain">print(</code><code class="bash string">'准备添加新记录'</code><code class="bash plain">)</code>
</div>
                                                                <div class="line number114 index113 alt1">
                                                                        <code class="bash spaces">    </code><code class="bash plain">add_result = addDomainRecord(client,value,rr,domainname)</code>
</div>
                                                                <div class="line number115 index114 alt2">
                                                                        <code class="bash spaces">    </code><code class="bash plain">print(add_result)</code>
</div>
                                                                <div class="line number116 index115 alt1">
                                                                        <code class="bash spaces">  </code><code class="bash keyword">elif</code> <code class="bash plain">info[</code><code class="bash string">"TotalCount"</code><code class="bash plain">] == 1:</code>
</div>
                                                                <div class="line number117 index116 alt2">
                                                                        <code class="bash spaces">    </code><code class="bash plain">print(</code><code class="bash string">'准备更新已有记录'</code><code class="bash plain">)</code>
</div>
                                                                <div class="line number118 index117 alt1">
                                                                        <code class="bash spaces">    </code><code class="bash plain">record_id = info[</code><code class="bash string">"DomainRecords"</code><code class="bash plain">][</code><code class="bash string">"Record"</code><code class="bash plain">][</code><code class="bash string">"RecordId"</code><code class="bash plain">]</code>
</div>
                                                                <div class="line number119 index118 alt2">
                                                                        <code class="bash spaces">    </code><code class="bash plain">cur_ip = getIp()</code>
</div>
                                                                <div class="line number120 index119 alt1">
                                                                        <code class="bash spaces">    </code><code class="bash plain">old_ip = info[</code><code class="bash string">"DomainRecords"</code><code class="bash plain">][</code><code class="bash string">"Record"</code><code class="bash plain">][</code><code class="bash string">"Value"</code><code class="bash plain">]</code>
</div>
                                                                <div class="line number121 index120 alt2">
                                                                        <code class="bash spaces">    </code><code class="bash keyword">if</code> <code class="bash plain">cur_ip == old_ip:</code>
</div>
                                                                <div class="line number122 index121 alt1">
                                                                        <code class="bash spaces">      </code><code class="bash plain">print (</code><code class="bash string">"新ip与原ip相同,无法更新!"</code><code class="bash plain">)</code>
</div>
                                                                <div class="line number123 index122 alt2">
                                                                        <code class="bash spaces">    </code><code class="bash keyword">else</code><code class="bash plain">:</code>
</div>
                                                                <div class="line number124 index123 alt1">
                                                                        <code class="bash spaces">      </code><code class="bash plain">update_result = updateDomainRecord(client,value,rr,record_id)</code>
</div>
                                                                <div class="line number125 index124 alt2">
                                                                        <code class="bash spaces">      </code><code class="bash plain">print(</code><code class="bash string">'更新成功,返回信息:'</code><code class="bash plain">)</code>
</div>
                                                                <div class="line number126 index125 alt1">
                                                                        <code class="bash spaces">      </code><code class="bash plain">print(update_result)</code>
</div>
                                                                <div class="line number127 index126 alt2">
                                                                        <code class="bash spaces">  </code><code class="bash keyword">else</code><code class="bash plain">:</code>
</div>
                                                                <div class="line number128 index127 alt1">
                                                                        <code class="bash spaces">    </code><code class="bash comments"># 正常不应该有多条相同的记录,如果存在这种情况,应该手动去网站检查核实是否有操作失误</code>
</div>
                                                                <div class="line number129 index128 alt2">
                                                                        <code class="bash spaces">    </code><code class="bash plain">print(</code><code class="bash string">"存在多个相同子域名解析记录值,请核查删除后再操作!"</code><code class="bash plain">)</code>
</div>
                                                                <div class="line number130 index129 alt1">
                                                                         </div>
                                                                <div class="line number131 index130 alt2">
                                                                         </div>
                                                                <div class="line number132 index131 alt1">
                                                                        <code class="bash plain">IP = getIp()</code>
</div>
                                                                <div class="line number133 index132 alt2">
                                                                         </div>
                                                                <div class="line number134 index133 alt1">
                                                                        <code class="bash comments"># 循环子域名列表进行批量操作</code>
</div>
                                                                <div class="line number135 index134 alt2">
                                                                        <code class="bash keyword">for</code> <code class="bash plain">x </code><code class="bash keyword">in</code> <code class="bash plain">SubDomainList:</code>
</div>
                                                                <div class="line number136 index135 alt1">
                                                                        <code class="bash spaces">  </code><code class="bash plain">setDomainRecord(client,IP,x,DomainName)</code>
</div>
                                                                <div class="line number137 index136 alt2">
                                                                         </div>
                                                                <div class="line number138 index137 alt1">
                                                                        <code class="bash comments"># 删除记录测试</code>
</div>
                                                                <div class="line number139 index138 alt2">
                                                                        <code class="bash comments"># delDomainRecord(client,'b.jsoner.com')</code>
</div>
                                                                <div class="line number140 index139 alt1">
                                                                         </div>
                                                                <div class="line number141 index140 alt2">
                                                                        <code class="bash comments"># 新增或更新记录测试</code>
</div>
                                                                <div class="line number142 index141 alt1">
                                                                        <code class="bash comments"># setDomainRecord(client,'192.168.3.222','a',DomainName)</code>
</div>
                                                                <div class="line number143 index142 alt2">
                                                                         </div>
                                                                <div class="line number144 index143 alt1">
                                                                        <code class="bash comments"># 获取记录测试</code>
</div>
                                                                <div class="line number145 index144 alt2">
                                                                        <code class="bash comments"># print (getDomainInfo(DomainName, 'y'))</code>
</div>
                                                                <div class="line number146 index145 alt1">
                                                                         </div>
                                                                <div class="line number147 index146 alt2">
                                                                        <code class="bash comments"># 批量获取记录测试</code>
</div>
                                                                <div class="line number148 index147 alt1">
                                                                        <code class="bash comments"># for x in SubDomainList:</code>
</div>
                                                                <div class="line number149 index148 alt2">
                                                                        <code class="bash comments">#   print (getDomainInfo(DomainName, x))</code>
</div>
                                                                <div class="line number150 index149 alt1">
                                                                         </div>
                                                                <div class="line number151 index150 alt2">
                                                                        <code class="bash comments"># 获取外网ip地址测试</code>
</div>
                                                                <div class="line number152 index151 alt1">
                                                                        <code class="bash comments"># print ('(' + getIp() + ')')</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
        <div class="codetool" id="codetool">
                <div class="code_n">
                        <textarea></textarea>
</div>
        </div>
</div>
<p>
        可以将以上脚本保存为文件之后,通过定时任务,来实现定期自动更新ip地址,具体如何添加定时任务,系统不同,可能方法也不尽相同,这里就不多说明了。</p>
<p>
        说明</p>
<p>
        1,建议不要将删除记录添加进实际使用的脚本当中。<br>
        2,相同记录是同一个子域名的多条记录,比如 test.example.com。<br>
        脚本并没有验证记录类型,所以同一子域名下的不同类型的记录也会认为是相同记录,比如:<br>
        有两条记录分别是 test.examlpe.com 的 A 记录 和 test.examlpe.com 的 AAAA 记录,会被认为是两条相同的 test.example.com 记录<br>
        可以通过判断获取记录返回的 record_id 来实现精确匹配记录,但我没有这样的需求,也就没有花时间去写。</p>
<p>
        到此这篇关于如何通过阿里云实现动态域名解析DDNS的方法的文章就介绍到这了,更多相关阿里云动态域名解析DDNS内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!</p>
<p>
        原文链接:https://www.cnblogs.com/waylen/archive/2020/07/25/13375373.html</p>
頁: [1]
查看完整版本: 如何通过阿里云实现动态域名解析DDNS的方法