最近不开森,用了半年的花生壳拒绝给我服务了。登录花生壳的官网后发现,原来是我没有实名认证啊。我以为又是流量高造成的短暂服务器崩溃。
点开实名认证页面,花生壳很耐心的提示我,不实名认证的后果。
好吧,可以理解。
于是乎我又继续点~~
看来官网还是说话算话的,怎么办呢?家里的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-core
pip install aliyun-python-sdk-alidns
然后再安装requests库
pip install requests
如果安装速度慢,可以考虑切换到阿里云pip源。在pip install *** 后面加上 -i https://mirrors.aliyun.com/pypi/simple/
比如:
pip install requests -i https://mirrors.aliyun.com/pypi/simple/
都装好之后就可以真的撸代码了。
我们先调用添加域名接口,为我们刚申请的域名增加一个A记录,二级域名就叫home好了。
#!/usr/bin/env python
#coding=utf-8
from aliyunsdkcore.client import AcsClient
from aliyunsdkcore.acs_exception.exceptions import ClientException
from aliyunsdkcore.acs_exception.exceptions import ServerException
from aliyunsdkalidns.request.v20150109.AddDomainRecordRequest import AddDomainRecordRequest
client = AcsClient('<accessKeyId>', '<accessSecret>', 'cn-hangzhou')
request = AddDomainRecordRequest()
request.set_accept_format('json')
request.set_DomainName("abc.com")
request.set_RR("home")
request.set_Type("A")
request.set_Value("8.8.8.8")
response = client.do_action_with_exception(request)
# python2: print(response)
print(str(response, encoding='utf-8'))
把上面的<accessKeyId>,<accessSecret>换成你的csv里的参数。去掉尖括号。
把abc.com换成你刚刚注册的域名。
执行一下,是不是成功了,执行成功之后会返回一个记录ID,把这个存好了,后面有用,登录控制台,看看域名解析是不是增加了一个home,记录值为8.8.8.8。
接下来就是查询域名的记录了,通过接口调用查询域名当前的记录值是多少。
#!/usr/bin/env python
#coding=utf-8
from aliyunsdkcore.client import AcsClient
from aliyunsdkcore.acs_exception.exceptions import ClientException
from aliyunsdkcore.acs_exception.exceptions import ServerException
from aliyunsdkalidns.request.v20150109.DescribeDomainRecordInfoRequest import DescribeDomainRecordInfoRequest
client = AcsClient('你的KeyID', '你的Secret', 'cn-hangzhou')
request = DescribeDomainRecordInfoRequest()
request.set_accept_format('json')
request.set_RecordId("你的记录id")
response = client.do_action_with_exception(request)
# python2: print(response)
print(str(response, encoding='utf-8'))
上面让你保存的id,在这用上了。看看返回了什么,一大串字符串,是字典的格式,我们需要用json反序列化一下拿到字典,取到里面的Value就是了。
稍微改下上面的代码:
client = AcsClient('你的Key', '你的Secret', 'cn-hangzhou')
record_request = DescribeDomainRecordInfoRequest()
record_request.set_accept_format('json')
record_request.set_RecordId('你的记录ID')
response = client.do_action_with_exception(record_request)
if response:
response = str(response, encoding='utf-8')
response = json.loads(response)
record_ip = response['Value']
print(record_ip)
打印出来IP了吧。
嗯,如果这时候我再拿到公网的IP做一下对比,是不是就能发现我们家里的ip是否变动了?
上面简单讲了怎么拿到公网ip,其实在百度上随便搜下就有很多免费的接口,比如:http://ip-api.com/json/?lang=zh-CN
我们就拿这个举例,打开浏览器访问下上面这个接口,是不是又返回了一大堆json字符串?
解析它:
IP_api = 'http://ip-api.com/json/?lang=zh-CN'
response = requests.get(url=IP_api)
real_ip = json.loads(response.text)
real_ip = real_ip['query']
print(real_ip)
拿到IP了吧。
那我们再校验对比一下:
if response:
response = str(response, encoding='utf-8')
response = json.loads(response)
record_ip = response['Value']
if record_ip and real_ip == ip:
print("IP 无需变动")
else:
print("这里需要调用updateDNS接口")
嗯,调用updateDNS接口交给你们了。
最后,我们需要在家里的一台设备上爬这个脚本,每小时或者几分钟执行一次,看大家的需求了。长期运行的设备有:路由器、NAS,这些都是小功率设备,如果用台式机跑就费电,可以用树莓派或者ESP8266、ESP32跑。
- 最新
- 最热
只看作者