DDNS No-IP自动更新IPv6地址的的Python脚本

DDNS No-IP自动更新IPv6地址的的Python脚本

目前No-IP的更新工具暂不支持更新ipv6,而我的公网ip来自手机热点,所以公网ip并非是固定的,有需要更新ip的需求。因此写了个脚本。参考官网的协议完成

官网协议地址:https://www.noip.com/integrate/request

源码供参考,如果有帮到您的话可以给一个赞吗:

import socket
import base64
import os
import re
import time

class netParam:
    def __init__(self):
        self.host = "dynupdate.no-ip.com"
        self.usrname = "xxxxxxxx@xxxxxx.com"
        self.passwd = "xxxxxxxxxxxxxxxx"
        self.domain = "xxxxxxxxxxx.ddns.net"
        self.timeval = 5 * 60
        self.server_port = 80

def getIPv6Address():
    output = os.popen("ipconfig /all").read()
    # print(output)
    result = re.findall(r"(([a-f0-9]{1,4}:){7}[a-f0-9]{1,4})", output, re.I)
    return result[0][0]

def getip(domain):
    address = socket.getaddrinfo(domain, 'http')
    return address[0][4][0]

if __name__ == "__main__":

    param = netParam()
    tcp_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    tcp_sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)  # 不经过WAIT_TIME,直接关闭
    tcp_sock.setblocking(False)                                     # 设置非阻塞编程
    tcp_sock.settimeout(1)
    link_statu = False
    send_data_len = 0
    old_ipv6addr = ""
    fisrt_flag = True

	# 按协议,对usrname:passwd进行base64编码
    raw_key = param.usrname + ":" + param.passwd
    print("raw key: " + raw_key)

    encode_key = base64.b64encode(raw_key.encode("utf-8"))
    encode_key = str(encode_key)[2:len(str(encode_key)) - 1]
    print("encode key: " + encode_key)

	#构造请求头部的内容,由于本机ip可能变化,因此这里没有直接把GET方法写进去,而是放在循环体中做
    requestParam = ""
    #requestParam += "GET /nic/update?hostname=" + param.domain + ""
    requestParam += "Host: dynupdate.no-ip.com\r\n"
    requestParam += "Authorization: Basic " + encode_key + "\r\n"
    requestParam += "User-Agent: None\r\n\r\n"
    print("request:\n" + requestParam)

    while(True):
    	# 每次运行等待timeval(此处是5分钟)的间隔,避免频繁更新
        if (True != fisrt_flag):
            time.sleep(param.timeval)

        fisrt_flag = False

		# 获取ipv6地址,若地址没有发生改变,则不上报更新
        ipv6addr = getIPv6Address()
        if ('2' != ipv6addr[0] or '4' != ipv6addr[1] or '0' != ipv6addr[2]):
            print("ipv6 addr invalid!")
            continue

        if (0 != len(ipv6addr)):
            print("ipv6 addr: " + ipv6addr)
            if (ipv6addr == old_ipv6addr):
                print("ip not change, continue")
                continue

		# 构造请求的头部GET方法内容
        requestHead = "GET "
        requestHead += "/nic/update?hostname=" + param.domain + "&myip=" + ipv6addr + " HTTP/1.1\r\n"

		# 建立tcp连接
        if (False == link_statu):
            server_ip = getip(param.host)
            print("server ip is :" + server_ip)

            try:
                tcp_sock.connect((server_ip, param.server_port))
                print("connect server success")
                link_statu = True
            except Exception as err:
                print("connect server failed, exception:", err)
                continue

		# 发送数据
        send_data = requestHead + requestParam
        send_data_len = 0

        while send_data_len < len(send_data):
            time.sleep(0.1)
            try:
                send_data_len += tcp_sock.send(send_data[send_data_len:].encode())
                print("send " + str(send_data_len) + " data")
            except Exception as err:
                print("send data error, exception: ", err)
                print("close tcp socket")
                tcp_sock.close()
                link_statu = False
                break

        if (send_data_len != len(send_data)):
            continue

        print("send data:" + send_data)
    
    	# 检查结果,更新成功则把当前ip记录为旧ip
        if (True == link_statu):
            try:
                recv_data = tcp_sock.recv(2048)
                print("server reply:\n" + str(recv_data))
            except Exception as err:
                print("recv data error, exception: ", err)
                tcp_sock.close()
                link_statu = False

        if (-1 != str(recv_data).find("HTTP/1.1 200 OK")):
            old_ipv6addr = ipv6addr
            print("update ip success")

    print("end")

  • 15
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
ddns-scripts是一种开源软件,用于管理动态DNS(DDNS)的配置和更新。 DDNS是一种用于动态IP地址的服务,允许用户通过域名访问其网络设备,而不必担心IP地址的变化。ddns-scripts通过与DDNS提供商交互,实现自动更新动态IP地址,并将其映射到相应的域名上。它支持多种常见的DDNS协议和服务提供商,包括DynDNS、No-IPDNSPod等。 ddns-scripts的主要功能包括配置文件管理、域名更新、状态查询和日志记录。用户可以通过编辑配置文件指定需要更新的域名和相应的DDNS参数,如用户名、密码和主机名等。当IP地址发生变化时,ddns-scripts会自动通过相应的协议和API更新域名的DNS记录。 此外,ddns-scripts还提供了状态查询功能,可以显示当前的DDNS状态和日志记录,以便用户了解更新过程和结果。用户也可以通过命令行界面手动触发更新操作或查看更新状态。 ddns-scripts是基于OpenWrt项目的脚本,并在OpenWrt系统上特别常见和受欢迎。它可以方便地与路由器、服务器或其他网络设备集成,通过定期检测IP地址变化和自动更新域名,为用户提供稳定可靠的DDNS服务。 总之,ddns-scripts是一种功能强大的动态DNS管理工具,通过自动更新IP地址和域名的映射关系,帮助用户轻松实现通过域名访问其网络设备的需求。它简单易用,支持多种协议和服务提供商,是管理DDNS的理想选择。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值