家里云通过dnspod、宝塔实现ddns
大致原理:通过dnspod提供的api对比记录值和本机ip,如果发现记录值和本机ip不同则修改记录值。
参考代码(python):
# 编写思路
# 1.先查询有没有记录
# 2.如果没有记录就直接添加记录(循环)
# 3.如果有就判断记录值和现在ip地址是否一致
# 4.如果不一致就更改(循环)
import requests
import json
import time
import re
import os
# api规范要求
headers = {
'UserAgent': 'DDNS/1.0.0(sanjiudao@qq.com)'
}
# 公共参数
login_token = ''
format = 'json'
lang = 'cn'
error_on_empty = 'no'
data = {
'login_token': login_token,
'format': format,
'lang': lang,
'error_on_empty': error_on_empty
}
def getIp(s):
# 获取本机ip
if s == 'w':
ipStr = os.popen("ipconfig").read()
elif s == 'l':
ipStr = os.popen("ifconfig").read()
ips = re.findall(r"(([a-f0-9]{1,4}:){7}[a-f0-9]{1,4})", ipStr, re.I)
return ips[0][0]
def recordProcess(jsonStr):
global ip
global recordId
jsonDatas = json.loads(jsonStr)
for jsonData in jsonDatas['records']:
if jsonData['name'] == '@' and jsonData['type'] == 'AAAA':
recordId = jsonData['id']
if jsonData['value'] == ip:
return 'ok'
return 'different'
return 'none'
recordId = ''
ip = getIp('l')
print(ip)
# 获取域名记录列表
# 接口参数
domain = ''
temp = {'domain': domain}
temp.update(data)
url = 'https://dnsapi.cn/Record.List'
r = requests.post(url, headers=headers, data=temp)
recordProcessResult = recordProcess(r.text)
print(recordProcessResult)
temp.clear()
if recordProcessResult == 'none':
# 新增记录
temp = {
'domain': domain,
'record_type': 'AAAA',
'record_line': '默认',
'value': ip,
'ttl': '600'
}
temp.update(data)
url = 'https://dnsapi.cn/Record.Create'
r = requests.post(url, headers=headers, data=temp)
print(r.text)
elif recordProcessResult == 'different':
# 修改记录
temp = {
'domain': domain,
'record_id': recordId,
'record_type': 'AAAA',
'record_line': '默认',
'value': ip,
'ttl': '600'
}
temp.update(data)
url = 'https://dnsapi.cn/Record.Modify'
r = requests.post(url, headers=headers, data=temp)
print(r.text)
temp.clear()
用宝塔的计划任务重复执行上面代码即可实现
参考代码记录的是ipv6地址
login_token写自己的token
domain写自己的域名就可以跑了
因为只是自己用所以代码很粗糙,可以根据自己需求修改
这里只是提供一种实现思路
文件下载连接:
ddns.py https://www.aliyundrive.com/s/cttqW2QZwGK 点击链接保存,或者复制本段内容,打开「阿里云盘」APP ,无需下载极速在线查看,视频原画倍速播放。
注:文件里的代码与文章代码有些许不同,主要是获取本机ip的方法有异。
文件里通过访问 6.ipw.cn 来获取ip地址。
建议使用文件,因为python里缩进也是语法的一部分,复制容易造成缩进缺失
有问题请评论区留言,作为哔哩哔哩重度用户,我会看的