最近不开森,用了半年的花生壳拒绝给我服务了。登录花生壳的官网后发现,原来是我没有实名认证啊。我以为又是流量高造成的短暂服务器崩溃。
点开实名认证页面,花生壳很耐心的提示我,不实名认证的后果。
好吧,可以理解。
于是乎我又继续点~~
看来官网还是说话算话的,怎么办呢?家里的NAS访问不了捉?,没法访问家里的服务也捉?。在大数据应用越来越普遍的当下,我是拒绝把个人信息透露到各个网站,尤其这种带人脸+身份证的,简直太恐怖了!
于是乎,动动手,动动脑~~~拒绝当舔狗。
需要准备的资源:
1: 域名,并实名认证
2: 家里有台能实时在线的设备且可以运行python程序
3:域名操作API
为了满足条件3,大家还是去大公司注册域名比较好,我直接在阿里云注册,价格都一样,还有完善的API服务,那我们就以阿里云为例。
解决问题思路:
用花生壳的动态域名解析,无非是解决家里的光猫重启后ip地址会发生变化,而我们又不能每重启一次就背一次ip。在花生壳注册一个域名(免费),在路由器登录并绑定域名,这样我们每次访问这个域名就可以访问到家里的网络了。
如果自己实现这个功能,就需要知道我们当前的ip地址,然后跟现在的域名A记录对比,如果不一致就调用修改DNS记录的API修改A记录。
那我们先解决第一个问题:注册域名、实名认证
现在搞IT的基本都有自己的域名了,如果您对域名还是比较陌生,就看看怎么注册域名并实名认证吧。
首先打开阿里云官网:www.aliyun.com(没有阿里云账号的同学也需要注册哦)
点击域名注册,在输入框输入你想要的域名,挑一个自己喜欢的吧。
有点需要注意,如果想把域名的记录解析到阿里云等服务器提供商,需要去工信部申请备案的,我们这里不用。有的域名不支持备案,那些不支持去查询一下吧。
购买、实名认证官方都有也好的操作流程,自己尝试一下吧。
如果注册好域名了,那么我们就开始下一步吧。
第二个问题:知道我们当前的公网IP
这个问题解决起来不难,我们打开百度,在搜索框里输入ip,回车就看到了自己的公网ip。再就是一堆的开发的API接口可以供我们调用,这个我就不讲了好吧,有疑问可以留言。
然后我们再解决第三个问题:调用API
进入阿里云控制台
在右上角头像处,鼠标悬浮,点击AccessKey管理。
新建用户
注意下面这里打钩。
保存AK信息,此时会下载一个csv文件,里面是AccessKeyId和AccessKeySecret。
接着,我们点击授权。
搜索DNS,把这几个都授权了吧。
这样我们完成了1,2,3步,我们就可以撸代码了。
先创建一个项目,创建虚拟环境,安装需要的库。
我们从安装依赖的库开始讲,首先需要安装阿里云的SDK。
pip install aliyun-python-sdk-corepip install aliyun-python-sdk-corepip install aliyun-python-sdk-core
pip install aliyun-python-sdk-alidnspip install aliyun-python-sdk-alidnspip 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/
都装好之后就可以真的撸代码了。
我们先调用添加域名接口,为我们刚申请的域名增加一个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跑。
-->
暂无评论内容