略呸 發表於 2020-6-7 20:53:00

python+阿里云实现动态域名解析(DDNS)

<h1>前言</h1>
<p>最近发现家里的移动宽带能够获取公网ipv6地址了,刚好前段时间配了台win10的机子做家用NAS(只能局域网进行文件共享),现在就想利用这个公网ipv6地址实现外网访问,但是电脑每次重启获取的ipv6地址都是变化的,所以需要实现动态域名解析(DDNS)功能。</p>
<p>具体情况</p>
<p>1、可以获取公网ipv6地址,但是ipv4的地址是内网的;</p>
<p>2、在阿里云买了一个1块钱1年的域名,刚可以利用起来;</p>
<p>3、电脑获取的ipv6地址在每次重启后都会自动变化,直接通过域名解析每次重启后域名访问就不行了。</p>
<h2>前期准备</h2>
<p>1、一个域名(我直接买的阿里的域名,1块钱1年,需要备案)<br>2、给域名添加解析记录</p>
<p>3、安装阿里云pythonSDK:</p>
<p>阿里云核心SDK库:pip install aliyun-python-sdk-core</p>
<p>阿里云域名SDK库:pip install aliyun-python-sdk-domain(我在看其他博客的时候有写到这个,但是我没找到怎么使用,所以没有用这个),用的下面这个</p>
<p>阿里云域名库:aliyunsdkalidns.zip(直接pip我没有安装成功,需要的可以百度云下载:https://pan.baidu.com/s/1i9-7xpNzFQGdXiTtjqCXLQ,提取码:pr76)</p>
<h2>实现思路</h2>
<p>1、获取阿里云的accessKeyId和accessSecret<br>2、获取当前电脑的公网ipv6地址和域名解析的ipv6地址<br>3、判断当前点奥的公网ipv6地址和域名解析的ipv6地址是否一直<br>4、ip不一致时,更新域名解析记录</p>
<p>5、添加win10系统的定时任务执行</p>
<h2>实现步骤</h2>
<p>获取accessKeyId和accessSecret</p>
<p>这个可以直接在阿里云控制台的个人中心获取,不清楚的可以直接百度</p>
<h3>获取本机ipv6地址</h3>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)">1</span> <span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 获取本机临时IPv6地址</span>
<span style="color: rgba(0, 128, 128, 1)">2</span> <span style="color: rgba(0, 0, 255, 1)">def</span><span style="color: rgba(0, 0, 0, 1)"> get_local_ip():
</span><span style="color: rgba(0, 128, 128, 1)">3</span>   child = subprocess.Popen(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">ipconfig</span><span style="color: rgba(128, 0, 0, 1)">"</span>, shell=True, stdout=<span style="color: rgba(0, 0, 0, 1)">subprocess.PIPE)
</span><span style="color: rgba(0, 128, 128, 1)">4</span>   out = child.communicate()<span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 保存ipconfig中的所有信息</span>
<span style="color: rgba(0, 128, 128, 1)">5</span>   ipv6_pattern = <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">(({1,4}:){7}{1,4})</span><span style="color: rgba(128, 0, 0, 1)">'</span>
<span style="color: rgba(0, 128, 128, 1)">6</span>   m =<span style="color: rgba(0, 0, 0, 1)"> re.findall(ipv6_pattern, str(out))
</span><span style="color: rgba(0, 128, 128, 1)">7</span>   address = m
</span><span style="color: rgba(0, 128, 128, 1)">8</span>   <span style="color: rgba(0, 0, 255, 1)">return</span> address</pre>
</div>
<h3>获取域名当前解析ip(利用"nslookup+域名"的方式)</h3>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)">1</span> <span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 获取当前域名对应的ip地址</span>
<span style="color: rgba(0, 128, 128, 1)">2</span> <span style="color: rgba(0, 0, 255, 1)">def</span><span style="color: rgba(0, 0, 0, 1)"> get_internet_ip():
</span><span style="color: rgba(0, 128, 128, 1)">3</span>   child = subprocess.Popen(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">nslookup nideyuming</span><span style="color: rgba(128, 0, 0, 1)">"</span>, shell=True, stdout=<span style="color: rgba(0, 0, 0, 1)">subprocess.PIPE)
</span><span style="color: rgba(0, 128, 128, 1)">4</span>   out = child.communicate()<span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 保存nslookup获取的所有信息</span>
<span style="color: rgba(0, 128, 128, 1)">5</span>   ipv6_pattern = <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">(({1,4}:){7}{1,4})</span><span style="color: rgba(128, 0, 0, 1)">'</span>
<span style="color: rgba(0, 128, 128, 1)">6</span>   m =<span style="color: rgba(0, 0, 0, 1)"> re.findall(ipv6_pattern, str(out))
</span><span style="color: rgba(0, 128, 128, 1)">7</span>   address = m<span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 拿到ipv6地址</span>
<span style="color: rgba(0, 128, 128, 1)">8</span>   <span style="color: rgba(0, 0, 255, 1)">return</span> address</pre>
</div>
<p>利用UpdateDomainRecordRequest这个action执行域名解析更新操作,但是在执行这个action的时候需要传RecordId参数,需要先通过DescribeDomainRecordsRequest这个action获得RecordId。</p>
<p>获取<span style="font-family: 宋体">RecordId</span><em id="__mceDel"><br></em></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)"> 1</span> <span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 获取recordid</span>
<span style="color: rgba(0, 128, 128, 1)"> 2</span> <span style="color: rgba(0, 0, 255, 1)">def</span><span style="color: rgba(0, 0, 0, 1)"> get_recordid(client):
</span><span style="color: rgba(0, 128, 128, 1)"> 3</span>   request =<span style="color: rgba(0, 0, 0, 1)"> DescribeDomainRecordsRequest()
</span><span style="color: rgba(0, 128, 128, 1)"> 4</span>   request.set_accept_format(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">json</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)"> 5</span>   request.set_DomainName(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">nideyuming</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)#这个地方传你的域名信息
</span><span style="color: rgba(0, 128, 128, 1)"> 6</span>   response =<span style="color: rgba(0, 0, 0, 1)"> client.do_action_with_exception(request)
</span><span style="color: rgba(0, 128, 128, 1)"> 7</span>   response = str(response, encoding=<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">utf-8</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)"> 8</span>   result =<span style="color: rgba(0, 0, 0, 1)"> json.loads(response)
</span><span style="color: rgba(0, 128, 128, 1)"> 9</span>   recordid = result[<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">DomainRecords</span><span style="color: rgba(128, 0, 0, 1)">"</span>][<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Record</span><span style="color: rgba(128, 0, 0, 1)">"</span>][<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">RecordId</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">]
</span><span style="color: rgba(0, 128, 128, 1)">10</span>   <span style="color: rgba(0, 0, 255, 1)">return</span> recordid</pre>
</div>
<h3>更新域名解析</h3>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)"> 1</span> <span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 更新域名解析</span>
<span style="color: rgba(0, 128, 128, 1)"> 2</span> <span style="color: rgba(0, 0, 255, 1)">def</span><span style="color: rgba(0, 0, 0, 1)"> update_record(client, priority, ttl, record_type, value, rr, record_id):
</span><span style="color: rgba(0, 128, 128, 1)"> 3</span>   request =<span style="color: rgba(0, 0, 0, 1)"> UpdateDomainRecordRequest()
</span><span style="color: rgba(0, 128, 128, 1)"> 4</span>   request.set_accept_format(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">json</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)"> 5</span> <span style="color: rgba(0, 0, 0, 1)">    request.set_Priority(priority)
</span><span style="color: rgba(0, 128, 128, 1)"> 6</span> <span style="color: rgba(0, 0, 0, 1)">    request.set_TTL(ttl)
</span><span style="color: rgba(0, 128, 128, 1)"> 7</span> <span style="color: rgba(0, 0, 0, 1)">    request.set_Value(value)
</span><span style="color: rgba(0, 128, 128, 1)"> 8</span> <span style="color: rgba(0, 0, 0, 1)">    request.set_Type(record_type)
</span><span style="color: rgba(0, 128, 128, 1)"> 9</span> <span style="color: rgba(0, 0, 0, 1)">    request.set_RR(rr)
</span><span style="color: rgba(0, 128, 128, 1)">10</span> <span style="color: rgba(0, 0, 0, 1)">    request.set_RecordId(record_id)
</span><span style="color: rgba(0, 128, 128, 1)">11</span>   response =<span style="color: rgba(0, 0, 0, 1)"> client.do_action_with_exception(request)
</span><span style="color: rgba(0, 128, 128, 1)">12</span>   response = str(response, encoding=<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">utf-8</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)">13</span>   <span style="color: rgba(0, 0, 255, 1)">return</span> response</pre>
</div>
<p>判断上面2步获取的ip是否相同,如果相同就不需要更新域名解析ip了,如果不同就执行更新操作</p>
<h3>执行</h3>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)"> 1</span> <span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 函数调用</span>
<span style="color: rgba(0, 128, 128, 1)"> 2</span> <span style="color: rgba(0, 0, 255, 1)">def</span><span style="color: rgba(0, 0, 0, 1)"> run_result(client, priority, ttl, record_type, value, rr, record_id):
</span><span style="color: rgba(0, 128, 128, 1)"> 3</span>   <span style="color: rgba(0, 0, 255, 1)">if</span> get_local_ip() ==<span style="color: rgba(0, 0, 0, 1)"> get_internet_ip():
</span><span style="color: rgba(0, 128, 128, 1)"> 4</span>         <span style="color: rgba(0, 0, 255, 1)">print</span>(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">解析地址未发生变化,不修改!</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)"> 5</span>         <span style="color: rgba(0, 0, 255, 1)">pass</span>
<span style="color: rgba(0, 128, 128, 1)"> 6</span>   <span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)">:
</span><span style="color: rgba(0, 128, 128, 1)"> 7</span>         result =<span style="color: rgba(0, 0, 0, 1)"> update_record(client, priority, ttl, record_type, value, rr, record_id)
</span><span style="color: rgba(0, 128, 128, 1)"> 8</span>         result =<span style="color: rgba(0, 0, 0, 1)"> json.loads(result)
</span><span style="color: rgba(0, 128, 128, 1)"> 9</span>         <span style="color: rgba(0, 0, 255, 1)">print</span>(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">新的RecordId是:%s</span><span style="color: rgba(128, 0, 0, 1)">"</span> % result[<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">RecordId</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">])
</span><span style="color: rgba(0, 128, 128, 1)">10</span>
<span style="color: rgba(0, 128, 128, 1)">11</span>
<span style="color: rgba(0, 128, 128, 1)">12</span> <span style="color: rgba(0, 0, 255, 1)">if</span> <span style="color: rgba(128, 0, 128, 1)">__name__</span> == <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">__main__</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">:
</span><span style="color: rgba(0, 128, 128, 1)">13</span>   client = AcsClient(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">youraccessKeyId</span><span style="color: rgba(128, 0, 0, 1)">'</span>, <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">youraccessSecret</span><span style="color: rgba(128, 0, 0, 1)">'</span>, <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">cn-chengdu</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)">14</span>   record_id =<span style="color: rgba(0, 0, 0, 1)"> get_recordid(client)
</span><span style="color: rgba(0, 128, 128, 1)">15</span>   ip =<span style="color: rgba(0, 0, 0, 1)"> get_local_ip()
</span><span style="color: rgba(0, 128, 128, 1)">16</span>   run_result(client, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">5</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">600</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">AAAA</span><span style="color: rgba(128, 0, 0, 1)">"</span>, ip, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">@</span><span style="color: rgba(128, 0, 0, 1)">"</span>, record_id)</pre>
</div>
<p>为了简单,我把所有代码放到一个.py文件里了,整体代码如下:</p>
<h3>完整代码</h3>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)"> 1</span> <span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)">!/usr/bin/env python</span>
<span style="color: rgba(0, 128, 128, 1)"> 2</span> <span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> coding=utf-8</span>
<span style="color: rgba(0, 128, 128, 1)"> 3</span>
<span style="color: rgba(0, 128, 128, 1)"> 4</span> <span style="color: rgba(0, 0, 255, 1)">from</span> aliyunsdkcore.client <span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> AcsClient
</span><span style="color: rgba(0, 128, 128, 1)"> 5</span> <span style="color: rgba(0, 0, 255, 1)">from</span> aliyunsdkalidns.request.v20150109.DescribeDomainRecordsRequest <span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> DescribeDomainRecordsRequest
</span><span style="color: rgba(0, 128, 128, 1)"> 6</span> <span style="color: rgba(0, 0, 255, 1)">from</span> aliyunsdkalidns.request.v20150109.UpdateDomainRecordRequest <span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> UpdateDomainRecordRequest
</span><span style="color: rgba(0, 128, 128, 1)"> 7</span> <span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> json
</span><span style="color: rgba(0, 128, 128, 1)"> 8</span> <span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> subprocess
</span><span style="color: rgba(0, 128, 128, 1)"> 9</span> <span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> re
</span><span style="color: rgba(0, 128, 128, 1)">10</span>
<span style="color: rgba(0, 128, 128, 1)">11</span>
<span style="color: rgba(0, 128, 128, 1)">12</span> <span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 获取当前域名对应的ip地址</span>
<span style="color: rgba(0, 128, 128, 1)">13</span> <span style="color: rgba(0, 0, 255, 1)">def</span><span style="color: rgba(0, 0, 0, 1)"> get_internet_ip():
</span><span style="color: rgba(0, 128, 128, 1)">14</span>   child = subprocess.Popen(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">nslookup nideyuming</span><span style="color: rgba(128, 0, 0, 1)">"</span>, shell=True, stdout=<span style="color: rgba(0, 0, 0, 1)">subprocess.PIPE)
</span><span style="color: rgba(0, 128, 128, 1)">15</span>   out = child.communicate()<span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 保存nslookup获取的所有信息</span>
<span style="color: rgba(0, 128, 128, 1)">16</span>   ipv6_pattern = <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">(({1,4}:){7}{1,4})</span><span style="color: rgba(128, 0, 0, 1)">'</span>
<span style="color: rgba(0, 128, 128, 1)">17</span>   m =<span style="color: rgba(0, 0, 0, 1)"> re.findall(ipv6_pattern, str(out))
</span><span style="color: rgba(0, 128, 128, 1)">18</span>   address = m<span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 拿到ipv6地址</span>
<span style="color: rgba(0, 128, 128, 1)">19</span>   <span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> address
</span><span style="color: rgba(0, 128, 128, 1)">20</span>
<span style="color: rgba(0, 128, 128, 1)">21</span>
<span style="color: rgba(0, 128, 128, 1)">22</span> <span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 获取本机临时IPv6地址</span>
<span style="color: rgba(0, 128, 128, 1)">23</span> <span style="color: rgba(0, 0, 255, 1)">def</span><span style="color: rgba(0, 0, 0, 1)"> get_local_ip():
</span><span style="color: rgba(0, 128, 128, 1)">24</span>   child = subprocess.Popen(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">ipconfig</span><span style="color: rgba(128, 0, 0, 1)">"</span>, shell=True, stdout=<span style="color: rgba(0, 0, 0, 1)">subprocess.PIPE)
</span><span style="color: rgba(0, 128, 128, 1)">25</span>   out = child.communicate()<span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 保存ipconfig中的所有信息</span>
<span style="color: rgba(0, 128, 128, 1)">26</span>   ipv6_pattern = <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">(({1,4}:){7}{1,4})</span><span style="color: rgba(128, 0, 0, 1)">'</span>
<span style="color: rgba(0, 128, 128, 1)">27</span>   m =<span style="color: rgba(0, 0, 0, 1)"> re.findall(ipv6_pattern, str(out))
</span><span style="color: rgba(0, 128, 128, 1)">28</span>   address = m
</span><span style="color: rgba(0, 128, 128, 1)">29</span>   <span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> address
</span><span style="color: rgba(0, 128, 128, 1)">30</span>
<span style="color: rgba(0, 128, 128, 1)">31</span>
<span style="color: rgba(0, 128, 128, 1)">32</span> <span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 获取recordid</span>
<span style="color: rgba(0, 128, 128, 1)">33</span> <span style="color: rgba(0, 0, 255, 1)">def</span><span style="color: rgba(0, 0, 0, 1)"> get_recordid(client):
</span><span style="color: rgba(0, 128, 128, 1)">34</span>   request =<span style="color: rgba(0, 0, 0, 1)"> DescribeDomainRecordsRequest()
</span><span style="color: rgba(0, 128, 128, 1)">35</span>   request.set_accept_format(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">json</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)">36</span>   request.set_DomainName(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">nideyuming</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)#传你的域名
</span><span style="color: rgba(0, 128, 128, 1)">37</span>   response =<span style="color: rgba(0, 0, 0, 1)"> client.do_action_with_exception(request)
</span><span style="color: rgba(0, 128, 128, 1)">38</span>   response = str(response, encoding=<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">utf-8</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)">39</span>   result =<span style="color: rgba(0, 0, 0, 1)"> json.loads(response)
</span><span style="color: rgba(0, 128, 128, 1)">40</span>   recordid = result[<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">DomainRecords</span><span style="color: rgba(128, 0, 0, 1)">"</span>][<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Record</span><span style="color: rgba(128, 0, 0, 1)">"</span>][<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">RecordId</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">]
</span><span style="color: rgba(0, 128, 128, 1)">41</span>   <span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> recordid
</span><span style="color: rgba(0, 128, 128, 1)">42</span>
<span style="color: rgba(0, 128, 128, 1)">43</span>
<span style="color: rgba(0, 128, 128, 1)">44</span> <span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 更新域名解析</span>
<span style="color: rgba(0, 128, 128, 1)">45</span> <span style="color: rgba(0, 0, 255, 1)">def</span><span style="color: rgba(0, 0, 0, 1)"> update_record(client, priority, ttl, record_type, value, rr, record_id):
</span><span style="color: rgba(0, 128, 128, 1)">46</span>   request =<span style="color: rgba(0, 0, 0, 1)"> UpdateDomainRecordRequest()
</span><span style="color: rgba(0, 128, 128, 1)">47</span>   request.set_accept_format(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">json</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)">48</span> <span style="color: rgba(0, 0, 0, 1)">    request.set_Priority(priority)
</span><span style="color: rgba(0, 128, 128, 1)">49</span> <span style="color: rgba(0, 0, 0, 1)">    request.set_TTL(ttl)
</span><span style="color: rgba(0, 128, 128, 1)">50</span> <span style="color: rgba(0, 0, 0, 1)">    request.set_Value(value)
</span><span style="color: rgba(0, 128, 128, 1)">51</span> <span style="color: rgba(0, 0, 0, 1)">    request.set_Type(record_type)
</span><span style="color: rgba(0, 128, 128, 1)">52</span> <span style="color: rgba(0, 0, 0, 1)">    request.set_RR(rr)
</span><span style="color: rgba(0, 128, 128, 1)">53</span> <span style="color: rgba(0, 0, 0, 1)">    request.set_RecordId(record_id)
</span><span style="color: rgba(0, 128, 128, 1)">54</span>   response =<span style="color: rgba(0, 0, 0, 1)"> client.do_action_with_exception(request)
</span><span style="color: rgba(0, 128, 128, 1)">55</span>   response = str(response, encoding=<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">utf-8</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)">56</span>   <span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> response
</span><span style="color: rgba(0, 128, 128, 1)">57</span>
<span style="color: rgba(0, 128, 128, 1)">58</span>
<span style="color: rgba(0, 128, 128, 1)">59</span> <span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 函数调用</span>
<span style="color: rgba(0, 128, 128, 1)">60</span> <span style="color: rgba(0, 0, 255, 1)">def</span><span style="color: rgba(0, 0, 0, 1)"> run_result(client, priority, ttl, record_type, value, rr, record_id):
</span><span style="color: rgba(0, 128, 128, 1)">61</span>   <span style="color: rgba(0, 0, 255, 1)">if</span> get_local_ip() ==<span style="color: rgba(0, 0, 0, 1)"> get_internet_ip():
</span><span style="color: rgba(0, 128, 128, 1)">62</span>         <span style="color: rgba(0, 0, 255, 1)">print</span>(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">解析地址未发生变化,不修改!</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)">63</span>         <span style="color: rgba(0, 0, 255, 1)">pass</span>
<span style="color: rgba(0, 128, 128, 1)">64</span>   <span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)">:
</span><span style="color: rgba(0, 128, 128, 1)">65</span>         result =<span style="color: rgba(0, 0, 0, 1)"> update_record(client, priority, ttl, record_type, value, rr, record_id)
</span><span style="color: rgba(0, 128, 128, 1)">66</span>         result =<span style="color: rgba(0, 0, 0, 1)"> json.loads(result)
</span><span style="color: rgba(0, 128, 128, 1)">67</span>         <span style="color: rgba(0, 0, 255, 1)">print</span>(<span style="color: rgba(128, 0, 0, 1)">"已更新解析地址,</span><span style="color: rgba(128, 0, 0, 1)">新的RecordId是:%s</span><span style="color: rgba(128, 0, 0, 1)">"</span> % result[<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">RecordId</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">])
</span><span style="color: rgba(0, 128, 128, 1)">68</span>
<span style="color: rgba(0, 128, 128, 1)">69</span>
<span style="color: rgba(0, 128, 128, 1)">70</span> <span style="color: rgba(0, 0, 255, 1)">if</span> <span style="color: rgba(128, 0, 128, 1)">__name__</span> == <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">__main__</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">:
</span><span style="color: rgba(0, 128, 128, 1)">71</span>   client = AcsClient(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">youraccessKeyId</span><span style="color: rgba(128, 0, 0, 1)">'</span>, <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">youraccessSecret</span><span style="color: rgba(128, 0, 0, 1)">'</span>, <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">cn-chengdu</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)#这儿传你的accessKeyId、accessSecret和区域ID(region_id)
</span><span style="color: rgba(0, 128, 128, 1)">72</span>   record_id =<span style="color: rgba(0, 0, 0, 1)"> get_recordid(client)
</span><span style="color: rgba(0, 128, 128, 1)">73</span>   ip =<span style="color: rgba(0, 0, 0, 1)"> get_local_ip()
</span><span style="color: rgba(0, 128, 128, 1)">74</span>   run_result(client, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">5</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">600</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">AAAA</span><span style="color: rgba(128, 0, 0, 1)">"</span>, ip, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">@</span><span style="color: rgba(128, 0, 0, 1)">"</span>, record_id)</pre>
</div>
<p>以上,执行该.py文件,就会自动更新当前电脑的公网ipv6地址到域名解析</p>
<h3>电脑执行.py脚本</h3>
<p>我配置了1个开机执行的任务,一个每天早上9点执行的定时任务。这块儿的资料网上很多,这儿写下2个要注意的点。</p>
<p>1、<span style="text-decoration: line-through">创建了一个开机自动执行的任务,这儿我最开始选择的只在用户登录是运行,重启电脑后发行没有自动执行,改成不管用户是否登录都有运行就ok了</span></p>
<p>1、原来的方法有点问题,重启确实会自动执行,但是如果是关机再开机就没有执行了,我最后的处理方式是在该定时任务上新加了一个用户登录时执行的触发器,并设置win10开机自动登录。具体方法是在运行框输入netplwiz,在弹窗窗口中取消勾选“要使用本计算机,用户必须输入用户名和密码”项并保存,保存的时候会让输入账号的用户名和密码。之后开机就会自动登录并触发该任务了。</p>
<p><img src="https://img2020.cnblogs.com/blog/1399915/202006/1399915-20200607202536360-1982125421.png"></p>
<p>&nbsp;</p>
<p>&nbsp;2、操作里面直接填写python.exe和要执行的.py脚本的据对路径就ok了</p>
<p><img src="https://img2020.cnblogs.com/blog/1399915/202006/1399915-20200607202353167-362347032.png"></p>
<p>&nbsp;</p>
<p>&nbsp;以上,重启下电脑,自动执行脚本成功,登录阿里云查看域名解析ip也已经变成本机最新获取的ipv6地址了。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<pre><br><br></pre>
<p>&nbsp;</p><br><br>
来源:https://www.cnblogs.com/fanzhiping/p/13062142.html
頁: [1]
查看完整版本: python+阿里云实现动态域名解析(DDNS)