NewFuture / DDNS

:triangular_flag_on_post: 自动更新域名解析到本机IP(支持dnspod,阿里DNS,CloudFlare,华为云,DNSCOM...)
https://ddns.newfuture.cc/
MIT License
4.31k stars 657 forks source link

[debug] #270

Closed mao13820 closed 3 years ago

mao13820 commented 3 years ago

Describe the bug [描述]

利用此程序更新dnspod下的域名ip时,每次ip变化时是重新添加一条记录,而不是更改过去的ip记录,造成存在多条同一个域名的ip记录,直到4条后,dnspod会返回 [ERROR] {'message': '子域名负载均衡数量超出限制', 'code': '500025', 'created_at': '2021-07-08 23:35:22'}

To Reproduce [复现]

采用下面给定的配置文件,更新一次dnspod下的域名ip,当配置文件中的A或B域名ip发生变化时,ddns再次更新会增加一个域名记录,而不是更改现有的。

version info [基本信息]

config file [配置文件]

{

  "$schema": "https://ddns.newfuture.cc/schema/v2.8.json",
  "debug": true,
  "dns": "dnspod",
  "id": "xxxx",
  "index4": "shell:ping -4 A.com -c 1 -w 1 | sed '1{s/[^(]*(//;s/).*//;q}'",
  "index6": "shell:ping -6 B.com -c 1 -w 1 | sed '1{s/[^(]*(//;s/).*//;q}'",
  "ipv4": [
    "C.com"
  ],
  "ipv6": [
    "C.com"
  ],
  "proxy": null,
  "token": "xxxx",
  "ttl": null

}
mao13820 commented 3 years ago

日志中是这样显示的 [INFO] dnsapi.cn/Record.Create : {'domain_id': '29142342', 'value': '10.62.239.122', 'login_token': '***', 'sub_domain': 'ddns', 'format': 'json', 'record_type': 'A', 'record_line': '默认'} 2021-07-08 23:53:19,231 68@/volume2/@appstore/py3k/usr/local/lib/python3.5/site-packages/dns/dnspod.py [DEBUG] Record.Create : result:{'status': {'created_at': '2021-07-08 23:53:19', 'message': '子域名负载均衡数量超出限制', 'code': '500025'}}

mao13820 commented 3 years ago

不知为何使用的是record.Create,导致一直在增加解析,按道理应该使用的是Record.Modify

mao13820 commented 3 years ago

搞定了,dnspod现在api有变化,默认只返回100条,所以如果子域名超过100个,获取record list的时候无法获取全,导致后面检查的时候以为不存在该域名,所以反复新建解析数目。

解决方法也很简单,在request传递的参数params里增加一个length参数,该参数定义了最大返回的域名数量,按照dnspod的文档,设置为最高值3000,大部分人应该够用了。

http://dnspod.github.io/dnspod-api-doc/records.html#record-list

mao13820 commented 3 years ago

我在dnspod.py文件中增加了下面两行,经过测试可以使用,你直接添加就可以了。

class API:

API 配置

SITE = "dnsapi.cn" # API endpoint METHOD = "POST" # 请求方法 TOKEN_PARAM = "login_token" # token参数 DEFAULT = "默认" # 默认线路名 LENGTH="length" //增加1:添加参数

def request(action, param=None, params): """ 发送请求数据 """ if param: params.update(param) params = dict((k, params[k]) for k in params if params[k] is not None) params.update({API.TOKEN_PARAM: '*', 'format': 'json'}) info("%s/%s : %s", API.SITE, action, params) params[API.TOKEN_PARAM] = "%s,%s" % (Config.ID, Config.TOKEN) params[API.LENGTH] = "3000" //增加2:添加参数

NewFuture commented 3 years ago

可以提个PR

mao13820 commented 3 years ago

已提