IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    SCDN 放弃 DDNS 回源 — IP 地址回源更新工具 V1.0【开源】

    obaby发表于 2024-12-04 03:03:10
    love 0

    前端时间家里的路由器坏了,导致一些服务挂掉了,包括自己的博客,闺蜜圈 wiki 等。然后就是每天收到各种离线消息。

    终于网络恢复之后,感觉一切正常然而,通过 cdn 反问就是回源错误。于是跟技术沟通了一下下下,发现盾云的域名回源竟然存在延迟,并且这个延迟好几个小时,这就比较蛋疼了。所以,每次换了 ip 首先要去设置 ip 地址才能正常回源。

    既然,这个东西存在延迟,那么 dnspod 的 vip 的动态 ddns 解析也就没有任何的用了,延迟已经不是动态域名的问题了,是 cdn 域名刷新的问题。

    今天早上忽然想到,既然域名有延迟,那就直接 ip 地址回源吧,不过域名太多了也不能每次都改啊。直接尝试代码解决吧,下面就是全部的代码了:

    # 盾云SCDN 接口工具
    # by:obaby
    # https://h4ck.org.cn
    # https://oba.by
    from datetime import datetime
    
    import requests
    
    username = '邮箱地址'
    password = '密码,先设置用户邮箱地址和密码'
    
    def login():
        url = "https://scdn.ddunyun.com/prod-api/login"
    
        payload = "{\"email\":\""+username+"\",\"password\":\""+password+"\"}"
        headers = {
            'accept': 'application/json, text/plain, */*',
            'accept-language': 'zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7',
            'content-type': 'application/json;charset=UTF-8',
            'origin': 'https://scdn.ddunyun.com',
            'priority': 'u=1, i',
            'referer': 'https://scdn.ddunyun.com/',
            'sec-ch-ua': '"Not/A)Brand";v="8", "Chromium";v="126", "Google Chrome";v="126"',
            'sec-ch-ua-mobile': '?0',
            'sec-ch-ua-platform': '"macOS"',
            'sec-fetch-dest': 'empty',
            'sec-fetch-mode': 'cors',
            'sec-fetch-site': 'same-origin',
            'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36'
        }
    
        response = requests.request("POST", url, headers=headers, data=payload)
    
        # print(response.json())
        js = response.json()
        if js['code'] == 0:
            return js['data']['access_token']
        else:
            print('[E] 发生错误:', js['message'])
        return None
        # return None
    
    
    def get_site_list(token):
        url = "https://scdn.ddunyun.com/prod-api/site?domain_name=&sub_domain_name=&cname=&status=&current_page=1&total=0&page_size=20"
    
        payload = {}
        headers = {
            'accept': 'application/json, text/plain, */*',
            'accept-language': 'zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7',
            'authorization': 'Bearer ' + token,
            # 'cookie': 'LeCDN-Client=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJjbGllbnQiLCJleHAiOjE3MzMyOTM5NDcsIm5iZiI6MTczMzI3MTM0NywianRpIjoiNDEifQ.lpSIjvtVGE7wcxZgNF2upZiZ8QsPh2CYajevHqgsjzg; sidebarStatus=0',
            'priority': 'u=1, i',
            'referer': 'https://scdn.ddunyun.com/',
            'sec-ch-ua': '"Not/A)Brand";v="8", "Chromium";v="126", "Google Chrome";v="126"',
            'sec-ch-ua-mobile': '?0',
            'sec-ch-ua-platform': '"macOS"',
            'sec-fetch-dest': 'empty',
            'sec-fetch-mode': 'cors',
            'sec-fetch-site': 'same-origin',
            'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36'
        }
    
        response = requests.request("GET", url, headers=headers, data=payload)
    
        # print(response.text)
        js = response.json()
        if js['code'] == 0:
            return js['data']['data']
        else:
            print('[E] 发生错误:', js['message'])
        return None
    
    
    def get_site_source(access_token, site_id):
        url = "https://scdn.ddunyun.com/prod-api/site_source?site_id=" + str(site_id)
    
        payload = {}
        headers = {
            'accept': 'application/json, text/plain, */*',
            'accept-language': 'zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7',
            'authorization': 'Bearer ' + access_token,
            # 'cookie': 'LeCDN-Client=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJjbGllbnQiLCJleHAiOjE3MzMyOTM5NDcsIm5iZiI6MTczMzI3MTM0NywianRpIjoiNDEifQ.lpSIjvtVGE7wcxZgNF2upZiZ8QsPh2CYajevHqgsjzg; sidebarStatus=0',
            'priority': 'u=1, i',
            'referer': 'https://scdn.ddunyun.com/',
            'sec-ch-ua': '"Not/A)Brand";v="8", "Chromium";v="126", "Google Chrome";v="126"',
            'sec-ch-ua-mobile': '?0',
            'sec-ch-ua-platform': '"macOS"',
            'sec-fetch-dest': 'empty',
            'sec-fetch-mode': 'cors',
            'sec-fetch-site': 'same-origin',
            'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36'
        }
    
        response = requests.request("GET", url, headers=headers, data=payload)
    
        js = response.json()
        if js['code'] == 0:
            return js['data']['data']
        else:
            print('[E] 发生错误:', js['message'])
        return None
    
    
    def delete_source(access_token, site_id, source_id):
        # url = "https://scdn.ddunyun.com/prod-api/site_source/593?site_id=382"
        url = "https://scdn.ddunyun.com/prod-api/site_source/" + str(source_id) + "?site_id=" + str(site_id)
    
        payload = {}
        headers = {
            'accept': 'application/json, text/plain, */*',
            'accept-language': 'zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7',
            'authorization': 'Bearer ' + access_token,
            # 'cookie': 'LeCDN-Client=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJjbGllbnQiLCJleHAiOjE3MzMyOTM5NDcsIm5iZiI6MTczMzI3MTM0NywianRpIjoiNDEifQ.lpSIjvtVGE7wcxZgNF2upZiZ8QsPh2CYajevHqgsjzg; sidebarStatus=0',
            'origin': 'https://scdn.ddunyun.com',
            'priority': 'u=1, i',
            'referer': 'https://scdn.ddunyun.com/',
            'sec-ch-ua': '"Not/A)Brand";v="8", "Chromium";v="126", "Google Chrome";v="126"',
            'sec-ch-ua-mobile': '?0',
            'sec-ch-ua-platform': '"macOS"',
            'sec-fetch-dest': 'empty',
            'sec-fetch-mode': 'cors',
            'sec-fetch-site': 'same-origin',
            'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36'
        }
    
        response = requests.request("DELETE", url, headers=headers, data=payload)
    
        js = response.json()
        if js['code'] == 0:
            return js['data']
        else:
            print('[E] 发生错误:', js['message'])
        return None
    
    
    def edit_source(access_token, site_id, source_id, ip_address):
        url = "https://scdn.ddunyun.com/prod-api/site_source/" + str(source_id)
    
        payload = "{\"id\":" + str(source_id) + ",\"site_id\":" + str(
            site_id) + ",\"type\":\"ipaddr\",\"content\":\"" + ip_address + "\",\"priority\":\"20\",\"weight\":15,\"created_at\":\"2024-11-25 13:21:23\",\"updated_at\":\"2024-12-01 13:39:13\",\"isEdit\":true}"
        headers = {
            'accept': 'application/json, text/plain, */*',
            'accept-language': 'zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7',
            'authorization': 'Bearer ' + access_token,
            'content-type': 'application/json;charset=UTF-8',
            # 'cookie': 'LeCDN-Client=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJjbGllbnQiLCJleHAiOjE3MzMyOTM5NDcsIm5iZiI6MTczMzI3MTM0NywianRpIjoiNDEifQ.lpSIjvtVGE7wcxZgNF2upZiZ8QsPh2CYajevHqgsjzg; sidebarStatus=0',
            'origin': 'https://scdn.ddunyun.com',
            'priority': 'u=1, i',
            'referer': 'https://scdn.ddunyun.com/',
            'sec-ch-ua': '"Not/A)Brand";v="8", "Chromium";v="126", "Google Chrome";v="126"',
            'sec-ch-ua-mobile': '?0',
            'sec-ch-ua-platform': '"macOS"',
            'sec-fetch-dest': 'empty',
            'sec-fetch-mode': 'cors',
            'sec-fetch-site': 'same-origin',
            'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36'
        }
    
        response = requests.request("PUT", url, headers=headers, data=payload)
    
        js = response.json()
        if js['code'] == 0:
            return js['data']
        else:
            print('[E] 发生错误:', js['message'])
        return None
    
    
    def add_source(access_token, site_id, ip_address):
        import requests
    
        url = "https://scdn.ddunyun.com/prod-api/site_source"
    
        payload = "{\"type\":\"ipaddr\",\"content\":\"" + ip_address + "\",\"priority\":\"20\",\"weight\":15,\"isEdit\":true,\"site_id\":" + str(
            site_id) + "}"
        headers = {
            'accept': 'application/json, text/plain, */*',
            'accept-language': 'zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7',
            'authorization': 'Bearer ' + access_token,
            'content-type': 'application/json;charset=UTF-8',
            # 'cookie': 'LeCDN-Client=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJjbGllbnQiLCJleHAiOjE3MzMyOTM5NDcsIm5iZiI6MTczMzI3MTM0NywianRpIjoiNDEifQ.lpSIjvtVGE7wcxZgNF2upZiZ8QsPh2CYajevHqgsjzg; sidebarStatus=0',
            'origin': 'https://scdn.ddunyun.com',
            'priority': 'u=1, i',
            'referer': 'https://scdn.ddunyun.com/',
            'sec-ch-ua': '"Not/A)Brand";v="8", "Chromium";v="126", "Google Chrome";v="126"',
            'sec-ch-ua-mobile': '?0',
            'sec-ch-ua-platform': '"macOS"',
            'sec-fetch-dest': 'empty',
            'sec-fetch-mode': 'cors',
            'sec-fetch-site': 'same-origin',
            'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36'
        }
    
        response = requests.request("POST", url, headers=headers, data=payload)
    
        js = response.json()
        if js['code'] == 0:
            return js['data']
        else:
            print('[E] 发生错误:', js['message'])
        return None
    
    
    def update_domain_source(domain_list, new_ip_address):
        token = login()
        print('[T] 获取到 token:', token)
        # 访问 https://www.jetbrains.com/help/pycharm/ 获取 PyCharm 帮助
        site_list = get_site_list(token)
        # new_ip_address = '123.234.187.19'
        # print(site_list)
        for s in site_list:
            # print(s['domain_name'])
            dn = s['domain_name']
            site_id = s['id']
            if dn in domain_list:
                source_list = s['sources']
                # print(source_list)
                print('-' * 100)
                print('[U] 时间:', datetime.now())
                print('[U] 更新域名配置:')
                print('[U] 域名:', dn)
                ip_count = 0
                for sl in source_list:
                    source_id = sl['id']
                    # site_id = sl['site_id']
                    ip_address = sl['content']
                    try:
                        if sl['type'] == 'ipaddr':
                            print('[U] 旧 IP 地址:', sl['content'])
    
                            # edit_source(token, site_id, source_id, ip_address)
                            if ip_address != new_ip_address:
                                print('[U] 更新:正在更新 ip 地址:123.234.187.19')
                                edit_source(token, site_id, source_id, new_ip_address)
                            else:
                                print('[U] 忽略:IP地址无变化')
                            ip_count += 1
                        else:
                            print('[D] 删除:删除域名回源:', ip_address)
                            delete_source(token, site_id, source_id)
                    except Exception as e:
                        print('[E] 发生异常:', e)
                # 如果不存在 IP 地址回源 添加 ip 回源
                if ip_count == 0:
                    print('[U] 添加:添加IP地址回源:', new_ip_address)
                    add_source(token, site_id, new_ip_address)
                print('*' * 100)
    
        print('[U] 更新完成')
        print('#' * 100)
    
    
    def print_usage():
        print('*' * 100)
        print('盾云 SCDN 回源地址配置工具')
        print('说明:用于更新盾云 ip 地址回源,解决域名回源导致的延迟问题')
        print('by: obaby')
        print('https://oba.by')
        print('https://h4ck.org.cn')
        print('#' * 100)
    
    if __name__ == '__main__':
        print('*' * 100)
        print('盾云 SCDN 回源地址配置工具')
        print('by: obaby')
        print('https://oba.by')
        print('https://h4ck.org.cn')
    

    然后在需要更新 ip 地址的地方通过下面的代码调用即可:

    from baby_dunyun import *
    
    if __name__ == '__main__':
        domain_list = [
            "image.dlj.kim",
            "nai.dog",
            "image.h4ck.org.cn",
            "wiki.guimiquan.cn",
            "baby.lc",
            "danteng.me",
            "loli.gifts",
            "lang.bi",
            "da.bi",
            "zhongxiaojie.cn",
            "oba.by",
            "zhongxiaojie.com",
            "lang.ma",
            "dlj.kim",
            "h4ck.org.cn",
        ]
        new_ip_address = '123.234.187.19'
        update_domain_source(domain_list, new_ip_address)

    运行效果:

    此工具仅支持盾云 scdn,https://scdn.ddunyun.com/#/dashboard



沪ICP备19023445号-2号
友情链接