异想之旅:本人原创博客完全手敲,绝对非搬运,全网不可能有重复;本人无团队,仅为技术爱好者进行分享,所有内容不牵扯广告。本人所有文章仅在CSDN、掘金和个人博客(一定是异想之旅域名)发布,除此之外全部是盗文!
先说需求:我在家里有一台服务器,但是没有静态IP。之前使用的是花生壳免费的服务,但是后来收费了,就想到自己实现一个。
参考资料:
大体的实现思路:
- 获取当前的服务器IP
- 检测是否与阿里云的记录相等
- 进行更改或一段时间后进行下一次检测
当然,还要加上缓存等东西
保证DNS上有一个这个主机的A解析,然后改好开头四个变量,挂到服务器就好了(获取AccessToken:RAM 访问控制)
主机 = "yxzlownserveraddress"
域名 = "yxzl.top"
AccessKey = "AccessKey"
SecretKey = "SecretKey"
import json
import requests
import time
from aliyunsdkcore.client import AcsClient
from aliyunsdkalidns.request.v20150109.DescribeDomainRecordsRequest import DescribeDomainRecordsRequest
from aliyunsdkalidns.request.v20150109.UpdateDomainRecordRequest import UpdateDomainRecordRequest
client = AcsClient(AccessKey, SecretKey) # 初始化
记录ID = 旧的IP = ""
page_number = 1
while True:
request = DescribeDomainRecordsRequest()
request.set_accept_format("json")
request.set_DomainName(域名)
request.set_PageNumber(page_number)
request.set_PageSize(100)
response = client.do_action_with_exception(request)
text = str(response, encoding="utf-8")
print(json.loads(text))
for i in json.loads(text)["DomainRecords"]["Record"]:
if i["RR"] == 主机:
记录ID = i["RecordId"]
旧的IP = i["Value"]
break
if 记录ID:
break
page_number += 1
while True:
try:
新的IP = requests.get("http://ip.3322.net/").text
if 新的IP != 旧的IP:
# 更改记录
try:
request = UpdateDomainRecordRequest()
request.set_accept_format("json")
request.set_RecordId(记录ID)
request.set_RR(主机)
request.set_Type("A")
request.set_Value(新的IP)
response = client.do_action_with_exception(request)
print("%s\tIP发生了变化(%s -> %s),已进行更新。" % (time.strftime(
"%Y-%m-%d %H:%M:%S", time.localtime()), 旧的IP, 新的IP))
except:
print("%s\tIP发生了变化(%s -> %s),但更新失败。" % (time.strftime(
"%Y-%m-%d %H:%M:%S", time.localtime()), 旧的IP, 新的IP))
else:
print("%s\tIP相同(%s),未进行更改。" %
(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()), 新的IP))
旧的IP = 新的IP
except Exception as e:
print("%s\t发生错误:%s" % (time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()), e))
# raise e
pass
time.sleep(90)