欢迎光临散文网 会员登陆 & 注册

家里云通过dnspod、宝塔实现ddns

2022-05-22 19:44 作者:三九刀  | 我要投稿

大致原理:通过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里缩进也是语法的一部分,复制容易造成缩进缺失


有问题请评论区留言,作为哔哩哔哩重度用户,我会看的

家里云通过dnspod、宝塔实现ddns的评论 (共 条)

分享到微博请遵守国家法律