欢迎查看我的摸爬滚打DDNS之三
摸爬滚打DDNS之一
摸爬滚打DDNS之二
摸爬滚打DDNS之三(完整版)
一、问题由来
昨天家里停电了,来电后IP地址改变了。但是并没有更新到域名解析数据上。所以感觉之前写的代码有一丝丝的不稳定。
今天重新写一个直接点的。直接查询域名服务器的解析地址,与本地公网IP地址比对,不同后执行修改解析Api自动修改解析地址。
本机环境
Ubuntu 20.04
注意:看本文之前请查看我前两篇文章,本文基于上述两篇文章编写。
获取IP发邮件
个人服务器实现阿里云DDNS(动态域名解析)
二、具体实施
1.阿里云获取解析地址api
只需要填写域名即可
在你的服务器上安装此sdk
2.修改代码
首先修改代码删除其他我们不需要的数据,只留下解析IP。
import json
my_ip=str(response, encoding='utf-8')
c = json.loads(my_ip)
onlineIP=c['DomainRecords']['Record'][0]['Value']
print(onlineIP)
我们将前面文章内的存储文件通过python的方法读取出来,做对比。
file = open('check_ip.text')
#打开存储IP的文件
localIP = file.readline().strip('\n')
file.close()
print(localIP)
if onlineIP != localIP:
# 对比是否有区别
如果两个文件内的IP地址不一样,则掉用调用阿里云修改解析地址的API进行修改。
整体代码下载
#!/usr/bin/env python3
#coding=utf-8
import json
from urllib.request import urlopen
from json import load
from aliyunsdkcore.client import AcsClient
from aliyunsdkcore.acs_exception.exceptions import ClientException
from aliyunsdkcore.acs_exception.exceptions import ServerException
from aliyunsdkcore.auth.credentials import AccessKeyCredential
from aliyunsdkcore.auth.credentials import StsTokenCredential
from aliyunsdkalidns.request.v20150109.DescribeDomainRecordsRequest import DescribeDomainRecordsRequest
from aliyunsdkalidns.request.v20150109.UpdateDomainRecordRequest import UpdateDomainRecordRequest
credentials = AccessKeyCredential('your-access-key-id', 'your-access-key-secret')
# use STS Token
# credentials = StsTokenCredential('<your-access-key-id>', '<your-access-key-secret>', '<your-sts-token>')
client = AcsClient(region_id='cn-qingdao', credential=credentials)
request = DescribeDomainRecordsRequest()
request.set_accept_format('json')
request.set_DomainName("你的域名")
response = client.do_action_with_exception(request)
# python2: print(response)
my_ip=str(response, encoding='utf-8')
c = json.loads(my_ip)
onlineIP=c['DomainRecords']['Record'][0]['Value']
print(onlineIP)
file = open('check_ip.text')
#打开存储IP的文件
localIP = file.readline().strip('\n')
file.close()
print(localIP)
if onlineIP != localIP:
# 对比是否有区别
print("Mismatch")
my_ip = load(urlopen('https://api.ipify.org/?format=json'))['ip']
credentials = AccessKeyCredential('your-access-key-id', 'your-access-key-secret')
# use STS Token
# credentials = StsTokenCredential('<your-access-key-id>', '<your-access-key-secret>', '<your-sts-token>')
client = AcsClient(region_id='cn-hangzhou', credential=credentials)
request = UpdateDomainRecordRequest()
request.set_accept_format('json')
request.set_RecordId("8888888888")
request.set_RR("@")
request.set_Type("A")
request.set_Value(my_ip)
response = client.do_action_with_exception(request)
# python2: print(response)
print(str(response, encoding='utf-8'))
else:
print("Match with online")
‘your-access-key-id’, 'your-access-key-secret’记得替换成自己的。
保存在/usr/local/bin/test.py下,写进checkIP.sh文件。
将python3 test.py 写在If上面即可。