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

admin
admin
admin
67
文章
2
评论
2020年4月11日11:11:13 评论 141 3935字阅读13分7秒

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

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

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

好吧,可以理解。

于是乎我又继续点~~

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

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

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

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

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

需要准备的资源:

1: 域名,并实名认证

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

3:域名操作API

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

解决问题思路:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

进入阿里云控制台

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

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

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

新建用户

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

注意下面这里打钩。

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

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

接着,我们点击授权。

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

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

搜索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/

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

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

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

#!/usr/bin/env python#coding=utf-8
from aliyunsdkcore.client import AcsClientfrom aliyunsdkcore.acs_exception.exceptions import ClientExceptionfrom aliyunsdkcore.acs_exception.exceptions import ServerExceptionfrom 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 AcsClientfrom aliyunsdkcore.acs_exception.exceptions import ClientExceptionfrom aliyunsdkcore.acs_exception.exceptions import ServerExceptionfrom 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跑。

admin
  • 本文由 发表于 2020年4月11日11:11:13
  • 除非特殊声明,本站文章均为原创,转载请务必保留本文链接
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: