还在用花生壳做动态域名解析?用Python盘它!

最近不开森,用了半年的花生壳拒绝给我服务了。登录花生壳的官网后发现,原来是我没有实名认证啊。我以为又是流量高造成的短暂服务器崩溃。

点开实名认证页面,花生壳很耐心的提示我,不实名认证的后果。

图片[1]-还在用花生壳做动态域名解析?用Python盘它!-瑞驰杂刊

好吧,可以理解。

于是乎我又继续点~~

图片[2]-还在用花生壳做动态域名解析?用Python盘它!-瑞驰杂刊

哇塞好繁琐,用人家的服务就得忍受这点,感觉像个小舔狗,当舔狗是不可能的,永远不可能的,所以单身使我快乐。
按照官网的提示,看了看我的域名,嗯,果然没了。

图片[3]-还在用花生壳做动态域名解析?用Python盘它!-瑞驰杂刊

看来官网还是说话算话的,怎么办呢?家里的NAS访问不了捉?,没法访问家里的服务也捉?。在大数据应用越来越普遍的当下,我是拒绝把个人信息透露到各个网站,尤其这种带人脸+身份证的,简直太恐怖了!

于是乎,动动手,动动脑~~~拒绝当舔狗。

需要准备的资源:

1: 域名,并实名认证

2: 家里有台能实时在线的设备且可以运行python程序

3:域名操作API

为了满足条件3,大家还是去大公司注册域名比较好,我直接在阿里云注册,价格都一样,还有完善的API服务,那我们就以阿里云为例。

解决问题思路:

用花生壳的动态域名解析,无非是解决家里的光猫重启后ip地址会发生变化,而我们又不能每重启一次就背一次ip。在花生壳注册一个域名(免费),在路由器登录并绑定域名,这样我们每次访问这个域名就可以访问到家里的网络了。

如果自己实现这个功能,就需要知道我们当前的ip地址,然后跟现在的域名A记录对比,如果不一致就调用修改DNS记录的API修改A记录。

那我们先解决第一个问题:注册域名、实名认证

现在搞IT的基本都有自己的域名了,如果您对域名还是比较陌生,就看看怎么注册域名并实名认证吧。

首先打开阿里云官网:www.aliyun.com(没有阿里云账号的同学也需要注册哦)

图片[4]-还在用花生壳做动态域名解析?用Python盘它!-瑞驰杂刊

点击域名注册,在输入框输入你想要的域名,挑一个自己喜欢的吧。

图片[5]-还在用花生壳做动态域名解析?用Python盘它!-瑞驰杂刊

有点需要注意,如果想把域名的记录解析到阿里云等服务器提供商,需要去工信部申请备案的,我们这里不用。有的域名不支持备案,那些不支持去查询一下吧。

购买、实名认证官方都有也好的操作流程,自己尝试一下吧。

如果注册好域名了,那么我们就开始下一步吧。

第二个问题:知道我们当前的公网IP

这个问题解决起来不难,我们打开百度,在搜索框里输入ip,回车就看到了自己的公网ip。再就是一堆的开发的API接口可以供我们调用,这个我就不讲了好吧,有疑问可以留言。

然后我们再解决第三个问题:调用API

图片[6]-还在用花生壳做动态域名解析?用Python盘它!-瑞驰杂刊

进入阿里云控制台

图片[7]-还在用花生壳做动态域名解析?用Python盘它!-瑞驰杂刊

在右上角头像处,鼠标悬浮,点击AccessKey管理。

图片[8]-还在用花生壳做动态域名解析?用Python盘它!-瑞驰杂刊

新建用户

图片[9]-还在用花生壳做动态域名解析?用Python盘它!-瑞驰杂刊

注意下面这里打钩。

图片[10]-还在用花生壳做动态域名解析?用Python盘它!-瑞驰杂刊

保存AK信息,此时会下载一个csv文件,里面是AccessKeyIdAccessKeySecret

接着,我们点击授权。

图片[11]-还在用花生壳做动态域名解析?用Python盘它!-瑞驰杂刊

图片[12]-还在用花生壳做动态域名解析?用Python盘它!-瑞驰杂刊

搜索DNS,把这几个都授权了吧。

这样我们完成了1,2,3步,我们就可以撸代码了。

先创建一个项目,创建虚拟环境,安装需要的库。

我们从安装依赖的库开始讲,首先需要安装阿里云的SDK。

pip install aliyun-python-sdk-core
pip install aliyun-python-sdk-core
pip install aliyun-python-sdk-core
pip install aliyun-python-sdk-alidns
pip install aliyun-python-sdk-alidns
pip install aliyun-python-sdk-alidns

然后再安装requests库

<span class="code-snippet_outer"><span class="code-snippet__attribute">pip</span> install requests</span>
<span class="code-snippet_outer"><span class="code-snippet__attribute">pip</span> install requests</span>
pip install requests

如果安装速度慢,可以考虑切换到阿里云pip源。在pip install *** 后面加上 -i https://mirrors.aliyun.com/pypi/simple/

比如:

<span class="code-snippet_outer"> pip install requests -i <span class="code-snippet__symbol">https:</span>/<span class="code-snippet__regexp">/mirrors.aliyun.com/pypi</span><span class="code-snippet__regexp">/simple/</span></span>
<span class="code-snippet_outer"> pip install requests -i <span class="code-snippet__symbol">https:</span>/<span class="code-snippet__regexp">/mirrors.aliyun.com/pypi</span><span class="code-snippet__regexp">/simple/</span></span>
 pip install requests -i https://mirrors.aliyun.com/pypi/simple/

都装好之后就可以真的撸代码了。

图片[13]-还在用花生壳做动态域名解析?用Python盘它!-瑞驰杂刊

我们先调用添加域名接口,为我们刚申请的域名增加一个A记录,二级域名就叫home好了。

<span class="code-snippet_outer"><span class="code-snippet__comment">#!/usr/bin/env python</span></span>
<span class="code-snippet_outer"><span class="code-snippet__comment">#!/usr/bin/env python</span></span>
#!/usr/bin/env python
<span class="code-snippet_outer"><span class="code-snippet__comment">#coding=utf-8</span></span>
<span class="code-snippet_outer"><span class="code-snippet__comment">#coding=utf-8</span></span>
#coding=utf-8
<span class="code-snippet_outer"><span class="code-snippet__keyword">from</span> aliyunsdkcore.client <span class="code-snippet__keyword">import</span> AcsClient</span>
<span class="code-snippet_outer"><span class="code-snippet__keyword">from</span> aliyunsdkcore.client <span class="code-snippet__keyword">import</span> AcsClient</span>
from aliyunsdkcore.client import AcsClient
<span class="code-snippet_outer"><span class="code-snippet__keyword">from</span> aliyunsdkcore.acs_exception.exceptions <span class="code-snippet__keyword">import</span> ClientException</span>
<span class="code-snippet_outer"><span class="code-snippet__keyword">from</span> aliyunsdkcore.acs_exception.exceptions <span class="code-snippet__keyword">import</span> ClientException</span>
from aliyunsdkcore.acs_exception.exceptions import ClientException
<span class="code-snippet_outer"><span class="code-snippet__keyword">from</span> aliyunsdkcore.acs_exception.exceptions <span class="code-snippet__keyword">import</span> ServerException</span>
<span class="code-snippet_outer"><span class="code-snippet__keyword">from</span> aliyunsdkcore.acs_exception.exceptions <span class="code-snippet__keyword">import</span> ServerException</span>
from aliyunsdkcore.acs_exception.exceptions import ServerException
<span class="code-snippet_outer"><span class="code-snippet__keyword">from</span> aliyunsdkalidns.request.v20150109.AddDomainRecordRequest <span class="code-snippet__keyword">import</span> AddDomainRecordRequest</span>
<span class="code-snippet_outer"><span class="code-snippet__keyword">from</span> aliyunsdkalidns.request.v20150109.AddDomainRecordRequest <span class="code-snippet__keyword">import</span> AddDomainRecordRequest</span>
from aliyunsdkalidns.request.v20150109.AddDomainRecordRequest import AddDomainRecordRequest
<span class="code-snippet_outer">client = AcsClient(<span class="code-snippet__string">'<accessKeyId>'</span>, <span class="code-snippet__string">'<accessSecret>'</span>, <span class="code-snippet__string">'cn-hangzhou'</span>)</span>
<span class="code-snippet_outer">client = AcsClient(<span class="code-snippet__string">'<accessKeyId>'</span>, <span class="code-snippet__string">'<accessSecret>'</span>, <span class="code-snippet__string">'cn-hangzhou'</span>)</span>
client = AcsClient('<accessKeyId>', '<accessSecret>', 'cn-hangzhou')
<span class="code-snippet_outer">request = AddDomainRecordRequest()</span>
<span class="code-snippet_outer">request = AddDomainRecordRequest()</span>
request = AddDomainRecordRequest()
<span class="code-snippet_outer">request.set_accept_format(<span class="code-snippet__string">'json'</span>)</span>
<span class="code-snippet_outer">request.set_accept_format(<span class="code-snippet__string">'json'</span>)</span>
request.set_accept_format('json')
<span class="code-snippet_outer">request.set_DomainName(<span class="code-snippet__string">"abc.com"</span>)</span>
<span class="code-snippet_outer">request.set_DomainName(<span class="code-snippet__string">"abc.com"</span>)</span>
request.set_DomainName("abc.com")
<span class="code-snippet_outer">request.set_RR(<span class="code-snippet__string">"home"</span>)</span>
<span class="code-snippet_outer">request.set_RR(<span class="code-snippet__string">"home"</span>)</span>
request.set_RR("home")
<span class="code-snippet_outer">request.set_Type(<span class="code-snippet__string">"A"</span>)</span>
<span class="code-snippet_outer">request.set_Type(<span class="code-snippet__string">"A"</span>)</span>
request.set_Type("A")
<span class="code-snippet_outer">request.set_Value(<span class="code-snippet__string">"8.8.8.8"</span>)</span>
<span class="code-snippet_outer">request.set_Value(<span class="code-snippet__string">"8.8.8.8"</span>)</span>
request.set_Value("8.8.8.8")
<span class="code-snippet_outer">response = client.do_action_with_exception(request)</span>
<span class="code-snippet_outer">response = client.do_action_with_exception(request)</span>
response = client.do_action_with_exception(request)
<span class="code-snippet_outer"><span class="code-snippet__comment"># python2: print(response) </span></span>
<span class="code-snippet_outer"><span class="code-snippet__comment"># python2:  print(response) </span></span>
# python2: print(response)
<span class="code-snippet_outer">print(str(response, encoding=<span class="code-snippet__string">'utf-8'</span>))</span>
<span class="code-snippet_outer">print(str(response, encoding=<span class="code-snippet__string">'utf-8'</span>))</span>
print(str(response, encoding='utf-8'))

把上面的<accessKeyId>,<accessSecret>换成你的csv里的参数。去掉尖括号。

把abc.com换成你刚刚注册的域名。

执行一下,是不是成功了,执行成功之后会返回一个记录ID,把这个存好了,后面有用,登录控制台,看看域名解析是不是增加了一个home,记录值为8.8.8.8。

接下来就是查询域名的记录了,通过接口调用查询域名当前的记录值是多少。

<span class="code-snippet_outer"><span class="code-snippet__comment">#!/usr/bin/env python</span></span>
<span class="code-snippet_outer"><span class="code-snippet__comment">#!/usr/bin/env python</span></span>
#!/usr/bin/env python
<span class="code-snippet_outer"><span class="code-snippet__comment">#coding=utf-8</span></span>
<span class="code-snippet_outer"><span class="code-snippet__comment">#coding=utf-8</span></span>
#coding=utf-8
<span class="code-snippet_outer"><span class="code-snippet__keyword">from</span> aliyunsdkcore.client <span class="code-snippet__keyword">import</span> AcsClient</span>
<span class="code-snippet_outer"><span class="code-snippet__keyword">from</span> aliyunsdkcore.client <span class="code-snippet__keyword">import</span> AcsClient</span>
from aliyunsdkcore.client import AcsClient
<span class="code-snippet_outer"><span class="code-snippet__keyword">from</span> aliyunsdkcore.acs_exception.exceptions <span class="code-snippet__keyword">import</span> ClientException</span>
<span class="code-snippet_outer"><span class="code-snippet__keyword">from</span> aliyunsdkcore.acs_exception.exceptions <span class="code-snippet__keyword">import</span> ClientException</span>
from aliyunsdkcore.acs_exception.exceptions import ClientException
<span class="code-snippet_outer"><span class="code-snippet__keyword">from</span> aliyunsdkcore.acs_exception.exceptions <span class="code-snippet__keyword">import</span> ServerException</span>
<span class="code-snippet_outer"><span class="code-snippet__keyword">from</span> aliyunsdkcore.acs_exception.exceptions <span class="code-snippet__keyword">import</span> ServerException</span>
from aliyunsdkcore.acs_exception.exceptions import ServerException
<span class="code-snippet_outer"><span class="code-snippet__keyword">from</span> aliyunsdkalidns.request.v20150109.DescribeDomainRecordInfoRequest <span class="code-snippet__keyword">import</span> DescribeDomainRecordInfoRequest</span>
<span class="code-snippet_outer"><span class="code-snippet__keyword">from</span> aliyunsdkalidns.request.v20150109.DescribeDomainRecordInfoRequest <span class="code-snippet__keyword">import</span> DescribeDomainRecordInfoRequest</span>
from aliyunsdkalidns.request.v20150109.DescribeDomainRecordInfoRequest import DescribeDomainRecordInfoRequest
<span class="code-snippet_outer">client = AcsClient(<span class="code-snippet__string">'你的KeyID'</span>, <span class="code-snippet__string">'你的Secret'</span>, <span class="code-snippet__string">'cn-hangzhou'</span>)</span>
<span class="code-snippet_outer">client = AcsClient(<span class="code-snippet__string">'你的KeyID'</span>, <span class="code-snippet__string">'你的Secret'</span>, <span class="code-snippet__string">'cn-hangzhou'</span>)</span>
client = AcsClient('你的KeyID''你的Secret''cn-hangzhou')
<span class="code-snippet_outer">request = DescribeDomainRecordInfoRequest()</span>
<span class="code-snippet_outer">request = DescribeDomainRecordInfoRequest()</span>
request = DescribeDomainRecordInfoRequest()
<span class="code-snippet_outer">request.set_accept_format(<span class="code-snippet__string">'json'</span>)</span>
<span class="code-snippet_outer">request.set_accept_format(<span class="code-snippet__string">'json'</span>)</span>
request.set_accept_format('json')
<span class="code-snippet_outer">request.set_RecordId(<span class="code-snippet__string">"你的记录id"</span>)</span>
<span class="code-snippet_outer">request.set_RecordId(<span class="code-snippet__string">"你的记录id"</span>)</span>
request.set_RecordId("你的记录id")
<span class="code-snippet_outer">response = client.do_action_with_exception(request)</span>
<span class="code-snippet_outer">response = client.do_action_with_exception(request)</span>
response = client.do_action_with_exception(request)
<span class="code-snippet_outer"><span class="code-snippet__comment"># python2: print(response) </span></span>
<span class="code-snippet_outer"><span class="code-snippet__comment"># python2:  print(response) </span></span>
# python2: print(response)
<span class="code-snippet_outer">print(str(response, encoding=<span class="code-snippet__string">'utf-8'</span>))</span>
<span class="code-snippet_outer">print(str(response, encoding=<span class="code-snippet__string">'utf-8'</span>))</span>
print(str(response, encoding='utf-8'))

上面让你保存的id,在这用上了。看看返回了什么,一大串字符串,是字典的格式,我们需要用json反序列化一下拿到字典,取到里面的Value就是了。

稍微改下上面的代码:

<span class="code-snippet_outer">client = AcsClient(<span class="code-snippet__string">'你的Key'</span>, <span class="code-snippet__string">'你的Secret'</span>, <span class="code-snippet__string">'cn-hangzhou'</span>)</span>
<span class="code-snippet_outer">client = AcsClient(<span class="code-snippet__string">'你的Key'</span>, <span class="code-snippet__string">'你的Secret'</span>, <span class="code-snippet__string">'cn-hangzhou'</span>)</span>
client = AcsClient('你的Key', '你的Secret', 'cn-hangzhou')
<span class="code-snippet_outer">record_request = DescribeDomainRecordInfoRequest()</span>
<span class="code-snippet_outer">record_request = DescribeDomainRecordInfoRequest()</span>
record_request = DescribeDomainRecordInfoRequest()
<span class="code-snippet_outer">record_request.set_accept_format(<span class="code-snippet__string">'json'</span>)</span>
<span class="code-snippet_outer">record_request.set_accept_format(<span class="code-snippet__string">'json'</span>)</span>
record_request.set_accept_format('json')
<span class="code-snippet_outer">record_request.set_RecordId(<span class="code-snippet__string">'你的记录ID'</span>)</span>
<span class="code-snippet_outer">record_request.set_RecordId(<span class="code-snippet__string">'你的记录ID'</span>)</span>
record_request.set_RecordId('你的记录ID')
<span class="code-snippet_outer">response = client.do_action_with_exception(record_request)</span>
<span class="code-snippet_outer">response = client.do_action_with_exception(record_request)</span>
response = client.do_action_with_exception(record_request)
<span class="code-snippet_outer"><span class="code-snippet__keyword">if</span> response:</span>
<span class="code-snippet_outer"><span class="code-snippet__keyword">if</span> response:</span>
if response:
<span class="code-snippet_outer"> response = str(response, encoding=<span class="code-snippet__string">'utf-8'</span>)</span>
<span class="code-snippet_outer">    response = str(response, encoding=<span class="code-snippet__string">'utf-8'</span>)</span>
response = str(response, encoding='utf-8')
<span class="code-snippet_outer"> response = json.loads(response)</span>
<span class="code-snippet_outer">    response = json.loads(response)</span>
response = json.loads(response)
<span class="code-snippet_outer"> record_ip = response[<span class="code-snippet__string">'Value'</span>]</span>
<span class="code-snippet_outer">    record_ip = response[<span class="code-snippet__string">'Value'</span>]</span>
record_ip = response['Value']
<span class="code-snippet_outer"> print(record_ip)</span>
<span class="code-snippet_outer">    print(record_ip)</span>
    print(record_ip)

打印出来IP了吧。

嗯,如果这时候我再拿到公网的IP做一下对比,是不是就能发现我们家里的ip是否变动了?

上面简单讲了怎么拿到公网ip,其实在百度上随便搜下就有很多免费的接口,比如:https://ip-api.com/json/?lang=zh-CN

我们就拿这个举例,打开浏览器访问下上面这个接口,是不是又返回了一大堆json字符串?

解析它:

<span class="code-snippet_outer">IP_api = 'https://ip-api.com/json/?lang=zh-CN'</span>
<span class="code-snippet_outer">IP_api = 'https://ip-api.com/json/?lang=zh-CN'</span>
IP_api = 'https://ip-api.com/json/?lang=zh-CN'
<span class="code-snippet_outer">response = requests.get(url=IP_api)</span>
<span class="code-snippet_outer">response = requests.get(url=IP_api)</span>
response = requests.get(url=IP_api)
<span class="code-snippet_outer">real_ip = json.loads(response.text)</span>
<span class="code-snippet_outer">real_ip = json.loads(response.text)</span>
real_ip = json.loads(response.text)
<span class="code-snippet_outer">real_ip = real_ip['query']</span>
<span class="code-snippet_outer">real_ip = real_ip['query']</span>
real_ip = real_ip['query']
<span class="code-snippet_outer">print(real_ip)</span>
<span class="code-snippet_outer">print(real_ip)</span>
print(real_ip)

拿到IP了吧。

那我们再校验对比一下:

<span class="code-snippet_outer"><span class="code-snippet__keyword">if</span> response:</span>
<span class="code-snippet_outer"><span class="code-snippet__keyword">if</span> response:</span>
if response:
<span class="code-snippet_outer"> response = str(response, encoding=<span class="code-snippet__string">'utf-8'</span>)</span>
<span class="code-snippet_outer">    response = str(response, encoding=<span class="code-snippet__string">'utf-8'</span>)</span>
response = str(response, encoding='utf-8')
<span class="code-snippet_outer"> response = json.loads(response)</span>
<span class="code-snippet_outer">    response = json.loads(response)</span>
response = json.loads(response)
<span class="code-snippet_outer"> record_ip = response[<span class="code-snippet__string">'Value'</span>]</span>
<span class="code-snippet_outer">    record_ip = response[<span class="code-snippet__string">'Value'</span>]</span>
record_ip = response['Value']
<span class="code-snippet_outer"> <span class="code-snippet__keyword">if</span> record_ip <span class="code-snippet__keyword">and</span> real_ip == ip:</span>
<span class="code-snippet_outer">    <span class="code-snippet__keyword">if</span> record_ip <span class="code-snippet__keyword">and</span> real_ip == ip:</span>
if record_ip and real_ip == ip:
<span class="code-snippet_outer"> <span class="code-snippet__keyword">print</span>(<span class="code-snippet__string">"IP 无需变动"</span>)</span>
<span class="code-snippet_outer">        <span class="code-snippet__keyword">print</span>(<span class="code-snippet__string">"IP 无需变动"</span>)</span>
print("IP 无需变动")
<span class="code-snippet_outer"> <span class="code-snippet__keyword">else</span>:</span>
<span class="code-snippet_outer">    <span class="code-snippet__keyword">else</span>:</span>
else:
<span class="code-snippet_outer"> <span class="code-snippet__keyword">print</span>(<span class="code-snippet__string">"这里需要调用updateDNS接口"</span>)</span>
<span class="code-snippet_outer">        <span class="code-snippet__keyword">print</span>(<span class="code-snippet__string">"这里需要调用updateDNS接口"</span>)</span>
print("这里需要调用updateDNS接口")

嗯,调用updateDNS接口交给你们了。

最后,我们需要在家里的一台设备上爬这个脚本,每小时或者几分钟执行一次,看大家的需求了。长期运行的设备有:路由器、NAS,这些都是小功率设备,如果用台式机跑就费电,可以用树莓派或者ESP8266、ESP32跑。

-->
© 版权声明
THE END
扫码关注微信公众号,更多精彩
点赞0打赏 分享
It doesn't matter how slow you are, as long as you're determined to get there, you'll get there.
不管你有多慢,都不要紧,只要你有决心,你最终都会到达想去的地方
四月 11

本站历史上的今天

评论 共2条

    暂无评论内容