本文编写于 2158 天前,最后修改于 1697 天前,其中某些信息可能已经过时。

家里一直用的花生壳,靠路由器自带的DDNS进行更新
然后再把DDNS的域名CNAME到自己的顶级域名底下,曲线DDNS…………
???
曾经,我还是一个懵懂少年
但如今!我已经是一个啥都懂的少女了!(?
DNSPod是提供了API的,用接口做,不是更舒服吗?(???

DNSPod的鉴权方式采用Token,详见官方API鉴权方式升级为Token
[mdx_warning title="需要注意一下LOGIN_TOKEN的格式为ID,Token,上面链接在最后有写"][/mdx_warning]

之后就是拿到我们实现DDNS的一些必要参数,API文档在这里DNSPod用户API文档,返回格式为JSON
先查到域名ID,再查到记录ID

在解析下新建了新记录,前缀nas,暂时填个1.1.1.1(1.1.1.1一百种错误用法演示
获取一下域名列表:curl -X POST https://dnsapi.cn/Domain.List -d 'login_token=LOGIN_TOKEN&format=json'
就可以得到对应域名ID(JSON格式化是个好东西

拿到了域名ID,就可以对应着去记录列表找记录ID了,查询时也可以选加参数限定一下前缀sub_domain=nas:
curl -X POST https://dnsapi.cn/Record.List -d 'login_token=LOGIN_TOKEN&format=json&domain_id=DOMAIN_ID'
同样得到了记录ID,到这一步为止应该就够用了

如何获得当前IP地址呢?openwrt或者什么的接口当然是可以的,但是我觉得使用IP检查页应该是最方便的了,这项服务一般的DDNS提供商都会提供的,例如花生壳的地址为http://ddns.oray.com/checkip

最后调用接口修改记录:
curl -X POST https://dnsapi.cn/Record.Modify -d 'login_token=LOGIN_TOKEN&format=json&domain_id=2317346&record_id=RECORD_ID&sub_domain=nas&value=NEWIP&record_type=A&record_line_id=0'

关于这个record_line_id或者record_line其实在查询记录列表的时候有返回的,对应的就是“线路类型”,“默认”是“0”,官方示例给的是“10=3”,是电信…………???
反正我直接设0了……不讲究(x

思路呢,大概就这么个思路,用Python简单撸了一个,其实也写了一个sh版本的,但是是第一次写sh,各种不堪入目,不好意思放了(
(妈个鸡老娘的缩进怎么让WP吃了,还加不上(
import urllib.request import re LOGIN_TOKEN = b"xxxxx,xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"#填入LOGIN_TOKEN,格式为ID,Token domain_id = b"xxxxxxxx"#域名ID record_id = b"xxxxxxxxx"#记录ID sub_domain = b"xxx"#域名前缀 s_new_ip = urllib.request.urlopen("http://ddns.oray.com/checkip").read().decode('utf8') new_ip = re.findall(re.compile(r'Current IP Address: (.*?)',re.S),s_new_ip)[0] print(new_ip) s_old_ip = urllib.request.urlopen("https://dnsapi.cn/Record.List",data=b"login_token="+LOGIN_TOKEN+b"&format=json&sub_domain="+sub_domain+"&domain_id="+domain_id).read().decode('utf8') old_ip = re.findall(re.compile(r'"ttl":"600","value":"(.*?)"',re.S),s_old_ip)[0] print(old_ip) if new_ip==old_ip: print("IP没有改变") else: print("IP发生改变") change_ip = urllib.request.urlopen("https://dnsapi.cn/Record.Modify",data=b"login_token="+LOGIN_TOKEN+b"&format=json&sub_domain="+sub_domain+"&domain_id="+domain_id+b"&record_type=A&record_line_id=10%3D0&record_id="+record_id+"&sub_domain="+sub_domain+"&value="+bytes(new_ip,encoding=("utf8"))).read().decode('utf8') print("记录已修改")