获取 TP-Link 路由器 WAN 口 IPv6,DDNS 更新至阿里云域名解析

前置条件:

1、需先使用浏览器开发者工具获取 TP-Link 路由器登录相应的请求信息;

2、安装阿里云CLI工具,参考文档:https://help.aliyun.com/zh/cli/install-cli-on-linux

DDNS_IPv6.sh

#!/bin/bash

ROUTER_IP="192.168.1.1"
PASSWORD="qKL8r6vPPxxxxxx"
LOGIN_PAYLOAD="{\"method\":\"do\",\"login\":{\"password\":\"$PASSWORD\"}}"

# 获取 stok
RESPONSE=$(curl -s -X POST http://$ROUTER_IP/ \
    -H "Accept: application/json, text/javascript, */*; q=0.01" \
    -H "Accept-Encoding: gzip, deflate" \
    -H "Accept-Language: zh-CN,zh;q=0.9" \
    -H "Cache-Control: no-cache" \
    -H "Connection: keep-alive" \
    -H "Content-Type: application/json; charset=UTF-8" \
    -H "Origin: http://$ROUTER_IP" \
    -H "Pragma: no-cache" \
    -H "Referer: http://$ROUTER_IP/" \
    -H "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36" \
    -H "X-Requested-With: XMLHttpRequest" \
    --data "$LOGIN_PAYLOAD")

# 提取 stok
STOK=$(echo $RESPONSE | grep -oP '(?<="stok":")[^"]+')

# 检查是否成功获取 stok
if [ -z "$STOK" ]; then
    echo "Failed to get stok."
    exit 1
fi

#echo "Successfully obtained stok: $STOK"

# 创建 JSON payload 文件
cat <<EOF > payload.json
{
    "protocol": {"name": ["wanv6", "pppoev6", "wan"]},
    "firewall": {"name": ["ipv6_firewall"]},
    "network": {"name": ["wan_status", "wanv6_status", "iface_mac", "lan"]},
    "online_check": {"name": "wanv6"},
    "method": "get"
}
EOF

# 使用获取到的 stok 进行后续请求
URL="http://$ROUTER_IP/stok=$STOK/ds"
RESPONSE=$(curl -s -X POST $URL \
    -H "Accept: application/json, text/javascript, */*; q=0.01" \
    -H "Accept-Encoding: gzip, deflate" \
    -H "Accept-Language: zh-CN,zh;q=0.9" \
    -H "Cache-Control: no-cache" \
    -H "Connection: keep-alive" \
    -H "Content-Type: application/json; charset=UTF-8" \
    -H "Origin: http://$ROUTER_IP" \
    -H "Pragma: no-cache" \
    -H "Referer: http://$ROUTER_IP/" \
    -H "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36" \
    -H "X-Requested-With: XMLHttpRequest" \
    --data @payload.json)

# 提取 ip6addr 字段的信息
IP6ADDR=$(echo $RESPONSE | jq -r '.network.wanv6_status.ip6addr')

# echo "The ip6addr is: $IP6ADDR"

if [ ! -e /root/IPv6.txt ]; then
  touch /root/IPv6.txt
fi

IP6ADDR_OLD=$(cat /root/IPv6.txt)
# echo $IP6ADDR_OLD

# 使用 aliyun alidns 命令更新域名 IPv6 记录
# 获取 RecordId: aliyun alidns DescribeDomainRecords --DomainName 你的域名.com
if [ "$IP6ADDR" != "$IP6ADDR_OLD" ];then
  /usr/local/bin/aliyun alidns UpdateDomainRecord --RecordId 905668450158xxxxxx --RR wills-home --Type AAAA --Value $IP6ADDR --Line default &>> /tmp/aliyunDDNSIPv6.logs
  echo >> /tmp/aliyunDDNSIPv6.logs
  echo -n "$IP6ADDR" > /root/IPv6.txt
fi

Dockerfile

构建镜像

启动容器

Last updated