在西部数码(West.cn)上通过 API 实现 IPv6 的 DDNS(动态域名解析)更新,核心逻辑是:编写脚本获取当前服务器的 IPv6 地址,并调用西部数码的 DNS API 将该地址更新到指定的域名解析记录中。

了解西部数码 API 接口

西部数码主要使用 V2 API 进行 DNS 管理。你需要关注的两个关键接口是:

1. 查询当前解析记录 (GetRecord)

核心逻辑:

获取当前 IPv6
读取上次保存的 IPv6
相同 → 不更新
不同 → 调用西部数码 API
保存新 IPv6

下面是完整版。

import subprocess
import requests
import re
import os

# ==========================
# 配置
# ==========================

DOMAIN = "example.com"

# 完整子域名
HOSTNAME = "home.example.com"

# 西部数码 域名ApiKey
API_DOMAIN_KEY = "你的ApiKey"

# 网卡名称
INTERFACE = "enp2s0"

# 保存上次IP
LAST_IP_FILE = "/tmp/west_ddns_ipv6.txt"


# ==========================
# 获取IPv6
# ==========================

def get_ipv6():

    cmd = ["ip", "-6", "addr", "show", INTERFACE]

    output = subprocess.check_output(
        cmd,
        encoding="utf-8"
    )

    matches = re.findall(
        r"inet6 ([0-9a-fA-F:]+)/64 scope global",
        output
    )

    if not matches:
        return None

    for ip in matches:

        # 排除本地链路地址
        if ip.startswith("fe80"):
            continue

        return ip

    return None


# ==========================
# 读取旧IP
# ==========================

def load_last_ip():

    if not os.path.exists(LAST_IP_FILE):
        return None

    with open(LAST_IP_FILE, "r") as f:
        return f.read().strip()


# ==========================
# 保存IP
# ==========================

def save_last_ip(ip):

    with open(LAST_IP_FILE, "w") as f:
        f.write(ip)


# ==========================
# 更新DNS
# ==========================

def update_ddns(ipv6):

    url = "https://api.west.cn/API/v2/domain/dns/"

    params = {
        "act": "dnsrec.update",
        "domain": DOMAIN,
        "apidomainkey": API_DOMAIN_KEY,
        "hostname": HOSTNAME,
        "record_value": ipv6
    }

    response = requests.get(
        url,
        params=params,
        timeout=20
    )

    print("状态码:", response.status_code)
    print(response.text)

    if response.status_code == 200:
        save_last_ip(ipv6)
        print("IPv6已保存")


# ==========================
# 主程序
# ==========================

if __name__ == "__main__":

    ipv6 = get_ipv6()

    if not ipv6:
        print("未找到IPv6")
        exit(1)

    print("当前IPv6:", ipv6)

    last_ip = load_last_ip()

    print("上次IPv6:", last_ip)

    # IP没变化
    if ipv6 == last_ip:
        print("IPv6未变化,无需更新")
        exit(0)

    print("IPv6已变化,开始更新DDNS")

    update_ddns(ipv6)

  1. 开机自动运行(推荐)

最稳的是:

systemd

创建:

sudo nano /etc/systemd/system/ddns.service

内容:

[Unit]
Description=West DDNS IPv6

[Service]
ExecStart=/usr/bin/python3 /home/ubuntu/ddns/ddns.py
WorkingDirectory=/home/ubuntu/ddns
Restart=always

[Install]
WantedBy=multi-user.target

启动:

sudo systemctl daemon-reload
sudo systemctl enable ddns
sudo systemctl start ddns

查看:

systemctl status ddns
Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐