openwrt路由器通过脚本进行华为域名API自动更新WAN口的域名解析

大家好，动态域名解析应该都不陌生吧，很多路由器甚至集成 ddns 动态域名解析服务，但是没有华为域名的解析服务，所以我们只能自己用脚本调用 API 进行华为的域名解析。
这里推荐一个管理路由器的软件WinSCP 工具放百度网盘了。
有了这软件很多操作就不用敲代码了，很方便用 scp 协议登入就行

1，准备工作
开始之前我们需要获得一些必要的参数，大家先登入自己的云控制台，创建一个 iam 账户，管理员账号似乎不行，我调试的时候一直报错，在统一身份认证服务里面。

创建好后打开控制台的修改域名解析界面，多个域名的要单独打开其中一个域名，我们可以获得这个域名的 zone_id，每个域名都有单独的 zone_id，如下图所示。
提取出域名 zone_id 备用。

2，获得 recordset_id
由于每个域名下面有很多个解析记录，每个解析记录都有一个 recordset_id, 我们需要打开华为的 API 调试工具查看一下域名下的每个解析记录的 id, 地址 API 调试，要先登入华为账号才能用，界面如下，在 zone_id 那里填入你刚才获得的一串字符。

输入 zone_id 点击调试，在右边的界面选取你需要解析的那个域名的 recordset_id 就是最上面那个，注意别选错了，我这边设置的是 ipv6 的解析，也就是 AAAA。

3，最后需要准备的数据大概如下：
adminname='hw123456789' 管理员账号
username='123456' 新建的账号
password='123456' 新建账号的密码
zoneid='ff80808287asdadadasd7d1b56243'
recordsetid='ff80808287asdasdad3b1d031404c4'
domain='jxyblog.top' 需要修改解析的域名，我直接使用根域名
4，先进行路由器端口 IP 地址获取调试
不然待会儿运行脚本会出错
ssh 登入路由器界面，运行以下命令看看能不能正常获得 wan 口的 ipv6 地址，我的是 pppoe 拨号的。
ifconfig pppoe-pppoe | grep 'inet6' | grep 'Globa' | awk '{print $3}' | cut -d'/' -f1
ip -6 addr show pppoe-pppoe | grep 'inet6' | grep 'dynamic'| grep -oE 'inet6 [0-9a-fA-F:]+(/[0-9]+)?' | awk '{print $2}' | cut -d'/' -f1
上面两个都可以获得 wan 口 IP，第一个用的是系统自带的 ifconfig 命令，第二个用的是上面安装的 curl

正常的话出来是下面图片这样的，就一个单独的完整 IP，有很多种打印 IP 的方式自己可以研究一下 grep 命令。

如果不是的话先单独输入 ifconfig 查看所有端口，我的是 pppoe-pppoe，然后过滤只显示带 inet6 的行，NR==1 打印第一行，print $3 打印第三列，自己慢慢改，调试出单独的 ipv6 地址就行了。

5，路由器要安装的软件，打开路由器软件包界面安装以下两个软件
curl
调试工具

bash
脚本工具
以上几个步骤准备完大概就可以运行脚本了。

6，以下是脚本代码

Copy
#!/bin/bash
adminname='hw123456789' #这部分上面说过了正常填就行了
username='123456'
password='123456'
zoneid='ff8080828732b7946445465b56243'
recordsetid='ff80808654665156173b1d031404c4'
domain='jxyblog.top'

token=$(curl -L -k -s -D - -X POST 'https://iam.cn-north-4.myhuaweicloud.com/v3/auth/tokens' \
--header 'Content-Type: application/json;charset=UTF-8' \
--data-raw '{"auth":{"identity":{"methods":["password"],"password":{"user":{"domain":{"name":"'$adminname'"},"name":"'$username'","password":"'$password'"}}},"scope":{"domain":{"name":"'$adminname'"}}}}' | grep X-Subject-Token | awk '{print $2}')

wanip=$(ifconfig pppoe-pppoe | grep inet6 | awk 'NR==1{print $3}' | cut -d'/' -f1) #这里之前上面调试过能不能正常获得IP，如果不能更改一下就行了

curl -i --location --request PUT 'https://dns.myhuaweicloud.com/v2.1/zones/'$zoneid'/recordsets/'$recordsetid'' \
--header 'Content-Type: application/json;charset=UTF-8' \
--header 'X-Auth-Token: '$token'' --data-raw '{"name":"'$domain'.","type":"AAAA","ttl":300,"records":["'$wanip'"]}'

创建一个后缀是.sh 的文件，保存到路由器里，比如我保存到 /mnt，运行以下代码
/bin/bash /tmp/ddns.sh
如果返回正常应该是以下图所示

这里就已经更新了服务器上的解析记录了。

7，设置定时更新解析记录或者定时检测 IP 变化更新解析记录。
比如在路由器里面设置每 12 小时运行脚本，如下图所示

0 */12 * * * /bin/bash /mnt/ddns1.sh

如果设置每 10 分钟检测 IP 变化进行域名解析，我前面文章有发过检测 IP 变化的脚本，脚本如下，详细可看之前的文章链接：
【详细教程】Openwrt 公网 IP 地址变动自动邮件通知（IPv4、IPv6 都可）【转载重新整理】

Copy
#!/bin/bash
current_ipv6=$(ip -6 addr show br-lan | grep -oE 'inet6 [0-9a-fA-F:]+(/[0-9]+)?' | awk '{print $2}')
if [ ! -f /tmp/wan_ip.txt ]; then
echo "$current_ipv6" > /tmp/wan_ip.txt
echo -e "Subject: OpenWRT WAN IP\n\n首次运行脚本，WAN IPv6 地址为: $current_ipv6" | msmtp -a default 123456789@qq.com
fi
saved_ip=$(cat /tmp/wan_ip.txt)
if [ "$current_ipv6" != "$saved_ip" ]; then
echo -e "Subject: OpenWRT WAN IP Changed\n\nWAN IPv6 已更改为: $current_ipv6\n之前的 IP 地址为: $saved_ip" | msmtp -a default 123456789@qq.com
echo "$current_ipv6" > /tmp/wan_ip.txt
/bin/bash /mnt/ddns1.sh #这里直接插入域名解析脚本，ip变化直接ddns
fi

到此结束，如果有帮到你们的话真的太好了