普通视图

发现新文章,点击刷新页面。
昨天以前首页

dynv6 免费二级域名申请及管理

2025年3月13日 00:00

自飞牛 OS 支持虚拟机后,很多使用飞牛的小伙伴会询问杜老师有关 DDNS 的问题。希望可以白嫖一个二级域名,支持 API 变更解析值,且支持 IPv6 解析。恰好杜老师发现了一个网站,支持多后缀的二级域名白嫖,这里分享给需要的小伙伴们!

什么是 dynv6

dynv6 是一款免费的动态 DNS 服务,其专为 IPv6 设计。

它允许用户将公共主机名轻松分配给私有主机,从而实现对私有主机的远程访问。

dynv6 对所有用户免费开放。可以选择一个免费的主机名开始使用,或者将自己的域名委托给 dynv6。

然而,需要注意的是,dynv6 目前并不提供企业级的 DDoS 防护和 SLA。因此,dynv6 适合用于非关键服务。

强大的 API 支持

dynv6 提供多种方式来更新区域,满足不同用户需求。

其中包括 REST API 和 SSH 以及 DNS 更新。这些 API 的存在,使得 dynv6 的使用更加灵活、方便。

无论是开发者还是普通用户,都可以根据自己的需求选择合适的 API 来更新 DNS 记录。

此外,dynv6 支持 Webhooks 功能。当 IP 地址发生变化时 Webhooks 可以用来更新外部服务。

官网地址

dynv6 的官网地址如下:

使用截图

打开上面的官网后,点击右上角 Sign up 进行账号注册:

完成账号登录后会自动登录,也可通过右上角 Sign in 进行登录。点击 Create new Zone 可白嫖免费二级域名:

点击下拉框后,可以看到有多个后缀可选择,同时填写 IPv4 或者 IPv6 地址:

若想托管顶级域名,可以点击导航栏 My Domains:

关于博客被重庆运营商阻断

2025年1月1日 00:00

起因

昨天将近凌晨一点,躺在床上的时候突然想到最近日志有评论还没回复,太忙碌的生活导致我跟其他博主的互动都少了很多。点开我的博客,却发现浏览器显示“被拒绝访问”,我第一反应是博客又被打导致 CDN 那边停服,可是排查下来发现 CDN 那边一切正常,服务器也没有任何问题。

排查

然后我关掉 WIFI ,使用重庆移动的数据网络访问,浏览器显示“已重置的连接”——经常直接访问 Github 的朋友对此应该很熟悉。我用阿里云拨测了一下,发现暂时只有重庆三大运营商对我的域名解析进行了阻断(或劫持、污染),重庆移动能解析到正确的 IP,但是丢包率为 100%,重庆电信更是很干脆地给我解析到了0.0.0.0,重庆联通拨测也不正常,但是上午让朋友帮忙测试时是可以正常访问的。

重庆电信拨测主站

可是我的博客并没有在境外,在国内开办也按照要求分别进行了 ICP 备案和公安网备,难道是最近写的那篇博文被小题大做给举报了吗?可是看到其他博友的经历,如果有不适合的文章,网信办会首先打电话要求撤下文章,而我并未接到相关的通知。

重庆移动拨测

时间太晚,又要早起上班,所以只得放下手机先睡觉了。

询问

姑且忙完上午的工作后,八点四十左右我开始考虑如何去解决。咨询了某群的一位大佬,他建议问问反诈。

发微信给我网备时加的本地网安支队的叔叔(去面审时看到他们那也是反诈中心),却发现不知何时已经被删除好友。

于是我几经周转,最终通过 96110 联系上了重庆反诈中心,没有联系网信办是我居然找不到重庆网信办(貌似也不是经信委)。电话那边的叔叔问了我域名,叫我不要挂断等他核实。六七分钟后对方回复,还要进一步核实,让我等待他们的回复。

挂断电话,我又联系了 10000,结果和我想的一样,电信的客服根本不懂这是怎么回事,一直问我在哪个区域,转到分公司给我排查。我多番解释,对方答应向上级反馈,然后我们结束了通话。

挂断电话后,我觉得电信肯定给不了什么回复,也不一定是反诈中心做的,于是我联系了腾讯云。腾讯云的工作人员很热情,说报障给重庆运营商,正在核实排查,有进展了第一时间给我同步到会话中。

至此,能询问的已经问完,只能等待结果了。

答复

上午十一点多的时候,主站已经能直接访问了,但是主站引用静态资源的子域名尚未恢复,我将此情况报告给了腾讯云。

中午十二点左右,正在食堂吃饭的时候接到 96110 的电话,那边答复我说确实是他们给我拦截了,不过现在已经解开了。我想了解具体情况,以便我更正错误和进行更严格的自我审查,但是对方说:“肯定就是触碰到反诈了嘛,具体情况不便透露。”我表明仍有两个子域名还未恢复正常访问,对方询问域名,我说了一个之后,可能是觉得难记,就说他们会处理的,然后挂掉了电话。

下午两点多,本地电信分公司的工作人员来电,答复也和我想的差不多,就是他们第一次接到这种工单。我也知道这种事不是分公司的问题,也不是他们可以处理的,就吐槽了一下电信客服啥也不懂依然转到分公司的行为。

下午三点多,腾讯云在售后支持的会话里说,主域名和子域名解析异常的情况已经报障给运营商,因为他们那边处理反馈时间不定,计划晚上九点前和我同步最新进展。在我回复后,下午四点多,腾讯云回复“重庆这边反馈已经解封,您那边确认下”。但是我通过 nslookup、本地 trace和阿里云拨测子域名,使用运营商 DNS 时发现重庆电信和重庆移动这边依然如故,使用第三方 DNS 则解析正常。

本地拨测和云拨测

腾讯云回复继续反馈。我问对方运营商有没有同步阻断原因,对方没有正面回复,只是说:

之前测试是因为域名被劫持,所以解析到了0.0.0.0。域名劫持可能是域名被第三方恶意重定向到了其他网站,运营商为了保护域名将解析改为0.0.0.0,不是您的网站有问题。重庆这边经过拨测判断,根据以往类似情况看,是因为资源没有在本地覆盖被运营商缓存,不是说您那边有问题。运营商解析这边有时会出现问题,所以一般通过报障解决,具体原因的话抱歉运营商那边无法获取到更详细的。

最后腾讯云再次向我确认已经将子域名报障给了运营商,等待次日中午 12 点前反馈。

处理

31 日傍晚,实测重庆移动已经解除了其中一个子域名(反代的 jsdelivr)的封禁,另一个依然无法访问;重庆电信则是两个都还没处理。而此时拨测里发现除了重庆以外,也有个别省份的个别运营商拨测状态不正常。

nslookup 子域名依然解析错误

我批量替换了 jsdelivr 反代的域名,暂时用上了第三方公益反代项目;批量替换了静态资源子域名,临时启用了另一个子域名来保障到运营商处理子域名之前都能正常访问。

最后

老实说,在国内写独立博客,本身就是一件比较严苛的事情,尤其是在叔叔那里备案时我碰了好几次壁。在写博文时我常常有意识地自我审查,克制自己的表达,以免惹上什么麻烦。

而这一次莫名其面的运营商阻断,发生在我的两个备案都正常的情况下,没有人事先告诉我网站存在什么问题(或者确实根本不存在什么问题),就能直接联系运营商给我域名封了,想起来还是觉得很不是滋味。

以后还会更好一些吗,我也不知道了。

题外话,这种麻烦事谁也不愿意惹上,我也非常不想因为某些事和他们打交道。所以评论区的评论如果有些激烈,我可能不会审核通过——保护我,也是保护你。

第一次卖域名

2024年12月18日 16:31

12月9日注册新域名,12月10日下午在阿里云发布一口价域名(临近下班才通过域名所有权的认证),12月11日上午11点阿里云短信通知我发布的域名已被人下单,域名卖出的速度之快令人咋舌。

知道域名被人买了,我是又喜又忧,喜的是原本到期不再续费的旧域名很快被人买走,忧的是旧域名做301重定向才不到两天,这么短的时间旧网址的权重还没有传递到新网址上。

根据规则,我需要在10日内将旧域名转入阿里云,否则将受到50元保证金的罚款。我一直拖到第八天才进行域名转入操作。Namesilo的域名转出很方便,而且提供快速转出功能,十几分钟就把域名转入到阿里云了。转入到阿里云后,域名很快就自动转移给了对方。

这次在阿里云卖域名,体验很好,操作简单,唯一的遗憾是卖的太快觉得有点卖亏了。因为第一次卖域名,也不知道卖多少钱合适,想着先标个700元的价钱(阿里云收15%的服务费,实际是805元),我觉得已经很高了,到时候没人买再降价。而且没有考虑到转入域名需要续费一年的问题,又掏了80元的续费费,最终实收620元。

这个域名是2015年5月5日注册,到2027年5月5日到期,总共续费了12年,620元还不够这些年域名续费的费用,不过这也是博客目前最大的一笔收入了。

前几年Jasmine问我,博客的文章都没什么人看为什么还要写?后来又得知这十几年在博客上花了一千多块了,更加不支持了。我和她说,这是我唯一的爱好了,和抽烟喝酒比起来既省钱又健康。

到目前为止,我用过5个域名,2个免费的3个收费的。免费的是TK和NET.RU,用的时间都很短,加起来才3个月。第一个收费的域名是INFO,从2010年到2015年。最长的是上一个COM域名,从2015到2024年。

注册时候爽,续费泪汪汪

2024年12月15日 00:14
注册域名就像生孩子,刚出生的时候各种兴奋和开心,越看越顺眼。生完过段时间,发现好像也没想象中的美好,还是个赔钱货,需要不断供养着。再后来,要不是看在是自己亲生的份上,恨不得丢了,但是又不忍心,怎么说都是自己造的孽,含着泪也要一直留下来。 又...

静风说更换域名及网址301重定向

2024年12月10日 15:53

一、 为什么要换域名

目前这个域名用了快十年了,域名注册的时间看起来还挺有意义,是2015年5月5日。当时移动端还没有兴起,我的大部分网上冲浪的时间是在电脑端,于是注册了一个三拼(三个全拼的汉语拼音)的域名,用电脑的键盘输起来很顺手(当时对域名的要求就是没有数字和下划线)。后来移动端越来越发达,手机使用的时间也越来越长,电脑使用得越来越少。这时在手机上输入博客的网址,显得很不方便,12个字母总是输错,输起来也着急。于是就萌生了把博客换成更短的域名。

思来想去,最终确定了jfsay.com这个域名,因为jfsay和博客的名称「静风说」相对应。Jasmine看到后说,为什么不用jfs.com,更短更好记。我笑说,这个我们买不起。

在输入jfsay时,发现输入法默认出来的结果是「减肥少熬夜」,竟然是劝人注重健康的,也合我意。

二、 购买域名

jfsay.com这个域名被人注册了,这几天突然看到可以注册,于是和Jasmine商量后,决定购买了。我找了好多家域名注册商对比价格,最后发现Spaceship 最便宜,5.87美元,折合人民币是42.73元。

三、 主机空间绑定新域名

域名解析很容易,添加一条A记录到主机的IP地址就可以了。主机空间绑定新域名时,却遇到了问题,提示无法绑定新的域名。问了主机商才知道,我是入门型的套餐,只能绑定一个域名。我只好把主机空间的域名改成新域名。很快,新的域名可以正常访问博客了。

四、老域名301重定向到新域名

下面要做的是把老域名301重定向到新域名,在这个地方我花了好多时间。

我原以为旧域名A记录到主机的IP,或者301重定向到新域名就可以了。后来发现需要做域名绑定,把域名和空间对应起来。主机商给我的解决方案是,需要升级套餐然后绑定多个域名,其余一概不管。我心想,只是为了网址跳转去掏钱升级主机空间太不划算。何不申请个免费的虚拟主机,只做301重定向?

免费的虚拟主机很多,随便就申请了下来。绑定域名,.htaccess重定向,很快就做好了。原以为大功告成,没想到https 的网址会提示网址不安全。也就是http的网址可以正常跳转,https的网址会卡在那里不动。

这个免费的虚拟主机没有免费的SSL,却有个SSL/TLS证书配置页面。我心想,申请一个免费SSL证书不就行了吗。我试了好几家免费证书提供商,总是在域名确认的时候出错,无法确认域名。最后在腾讯云上申请下来了。但是这个虚拟主机没有证书上传和部署的地方,查了好久也解决不了。

既然SSL证书解决不了,我想着是否能把https的网址跳转到http呢?上网查了下,都是http的网址跳转到https的,后来才知道https的网址跳转到http技术上行不通。只好作罢。

就在我一筹莫展的时候,我找到了redirhub.com,一个专门做网址跳转的网站,而且支持HTTPS。我用了十几分钟,跟着网站的步骤提示,很快就做好了301网址重定向,完美解决了https网址跳转的问题。

遥想当年,我在2015年更换域名的时候就没有这么麻烦,因为那时主机空间可以绑定多个域名,直接在.htaccess做301重定向就行了。

麻烦各位看官及时惠存新的网址,更换RSS订阅地址。

新的网址:http://www.jfsay.com/
新的RSS地址:https://www.jfsay.com/feed

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

2024年12月4日 11:03

前端时间家里的路由器坏了,导致一些服务挂掉了,包括自己的博客,闺蜜圈 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

blog搬家

2024年11月28日 08:13

11月末有好几件事让人焦虑。除了单位的工作以外,还有我自己的blog。因为我们合租的服务器到期了,11月28日到期。据说我们已经连续在那个服务器供应商那里好多年,我感觉有10年以上。那这一次我们觉得真的要离开了,因为那个供应商在我们提交了工单以后,半天都不回复,其次就服务器的性能来说,其实那家不算太好,虽然访问速度我个人觉得在广东电信之下还是可以的。服务器也比较稳定,试过宕机,但是几率不高。一直以来我都觉得在WordPress的后台没法用,自带的导出功理论能把全站的内容导出,我们可能是那个空间的设定的问题,每次当我下载不到2MB的时候就会停掉,结果打开那个xml文件实际上是不完整的,所以我根本没办法做全站的导出,我只能手动地分段导出文章,但那样的话,我就会丢失其它所有内容。

今年3月开始,包租公就告诉我要备份了。因为他忘记了服务器的密码。所以经典的那个WordPress搬家方式不可行,我得用其它方式把WordPress的东西全部备份出来,那个时候我觉得这根本是不可能完成的任务,但后来的确有牛逼的插件能做这个。一开始包租公告诉我,是10月到期,于是10月的时候我就找他,10月底的时候我继续找他,然后他告诉我11月到期,我不确定11月什么时候到期,有一天突然服务器宕机了,我以为是我们到期了,虽然前一天我已经做好备份,但是突然打不开,让人忐忑,结果被告知,我们还没到期,我们到期的日期是11月28日,所以11月25日的时候,我又找包租公。他居然把那个给忘记了,但是他很快就买了新的空间,然后开始往里面装东西。我们的速度很快,在11月26日我们就已经完成了搬家,虽然有一些奇怪的东西还是好像没有完全解决,但总的来说,基本上所有东西,能一次性挪走的都已经挪走了,至于哪些东西出了问题,我还没办法逐一检查出来,检查不出来的只能发现一个解决一个。其中一个比较明显的问题是有些页面有140多条评论,但实际上前台只显示了两条,当我在后台查询的时候,我的确能看到140多条,所以为什么会出现这种情况呢?其它文章评论看上去是正常的,我没有仔细的数过,但起码你能看到评论有很多,至于是不是显示多少条的那个数量,我没有仔细研究过,但为什么一些页面的评论展示数量是正常的,而另外一些却不行呢?这件事情很诡异。我记得当我用插件完成搬家的时候,除了完成按钮以外还有两个链接一个是永久链接的设置,另外一个是评论插件。在我印象之中,我没有使用任何评论插件。永久链接在那个,搬家插件之前那个版本,永久链接会神经病,得手动重选,但在这个新的插件里搬家完毕后,好像永久链接依然会以我自定义的形式显示,没有出现问题,但我还是按照以前的步骤走了一遍。

搬家的时候,我用的是IP地址,但搬家完毕以后,我把IP地址绑定到了我的域名,后来我又发现媒体文件那里当我从某个前台地址打开图片,图片显示的不是域名地址,显示的是IP地址。这算是一个很傻瓜的问题,肯定可以通过一波替换全部处理掉。域名也好,IP地址也好,实际上都能指向那个图片,万一我换了一个网址呢?那个图片就会变成失效。这种东西可以通过在后台数据库做替换简单解决,但这也是搬家过程之中经常会发生的事情。哪怕不是搬家,是从http变成https也会有这种毛病,所以为什么我就没有一种快捷的方式替换掉所有这些东西呢?

但总算搬家这个事情解决了,而且好长一段时间,我都不需要在这个问题上操心。

杜老师的域名清单

2022年9月29日 00:00

身为一个博主,谁手里还没几个域名啊!不过杜老师和一些喜欢「倒腾」域名的小伙伴不同,这些域名都是之前做站时传下的,这篇文章来说说他们的历史吧!

域名列表

来看看杜老师手里的域名吧:

域名备注
dusays.com杜老师说
7bu.top去不图床
dusay.cn杜说站群
birdteam.net菜鸟博客
vfast.com.cn荣新官网
dupeng.gay不想多说
地址隐藏私密博客

详细介绍

杜老师说:这个就不用多说了,大家看到这个小博客的域名;

去不图床:前身公益图床,后来因为运营成本过大,改为按容量付费的图片托管平台「目前仍然入不敷出,但至少能保障每月支出在承受范围内」

杜说站群:杜老师在培训机构做讲师时,为了方便学员编写笔记做的站群。两年前离开机构后,数据归原机构所有,域名目前做堡垒机,连接杜老师两台踏板服务器;

菜鸟博客:杜老师第一个正式博客,2014 年 2 月 12 日创建,曾经站名菜鸟团队技术博客,是同大学学长、舍友一同创建维护,主要做技术类、资源类的分享。博客权重较高,广告等收入较可观,后因分赃不均被迫关闭,部分非时效性博文流入杜老师说;

荣新官网:坑了杜老师两次的公司。一次是大学毕业后被骗来参加了技术培训,一次是培训后留校转岗讲师。不过工作还是蛮愉快的,因公司决策错误而最终破产,公司官网一直由杜老师管理,目前域名跳转杜老师说;

剩下两个:一个是前几天申请的免费域,成功注册了一个让人误会的后缀。另一个是私密博客,里面记录和小朋友一些趣事「貌似被几个小伙伴给发现了,尴尬」好了,就水到这!

白嫖一年顶级域名

2022年9月23日 00:00

谈到白嫖,在博客圈的评价就一个「真香」今天杜老师就为大家推荐一个顶级域名的白嫖资源,虽然这个后缀有些……歧义,不过相信还是会有小伙伴申请的!

资源地址

废话不多说了,直接送上资源地址:

注意事项

  1. 域名长度属于玄学。杜老师见过有小伙伴申请了三位域名,但自己操作时却未成功。最终成功申请到 dupeng.gay「每次输入这个域名心里非常别扭」

  2. 注意域名的有效期。只能白嫖一年,如想继续使用则需付费续期,杜老师简单查了下价格,续费价为 217 元每年。要知道站点做起来之后,更换域名属于大忌,不仅会影响访客的体验,还会受到搜索引擎惩罚;

  3. 及时处理确认信息。提交申请后需验证手机、邮箱,都是通过邮件形式通知。故记得查看收件箱和垃圾箱,别错过了验证邮件。最终验证通过域名才可正常使用;

  4. 保存管理面板地址。资源申请地址并无账号登录入口,在提交申请后,在通知邮件中会有控制面板地址,注意保存一下,方便后期修改 DNS 指向等;

  5. 本文暂不提供教程。为了防止恶意占用免费资源,本文不提供相关的教程,但遇到问题可随时留言;

  6. 免费资源随时中止。大家应该都知道国外免费平台对大陆区用户的态度,可能随时停止提供资源。

可白嫖的顶级域名

2021年9月25日 00:00

顶级域名可是一个小网站身份的象征,今天杜老师分享下如何白嫖一枚顶级域名。不过在最先要说上一句:免费的才是最贵的!如果条件允许,还是建议付费购买。

资源介绍

首先感谢小朋友 MrZeFr,是他让我知道这个资源,毕竟杜老师平时很少会关注免费资源「凡尔赛 ing」该网站支持申请多种后缀的顶级域名,如tk/ml/ga/cf/gq,还支持在该网站以成本价格购买其它顶级域名。更多的大家可自行体验,毕竟杜老师没申请成功,申请网址如下,将鼠标放在下面即可显示该网站地址:

https://my.freenom.com/domains.php

失败演示

试了五次都失败了,后来了解到该网站已经禁止国内注册「估计是白嫖党太多」不过这难不倒机智的博友们,对吧:

拿下了zhangbo.net完成ICP及公安备案,正式启用!

2024年5月23日 15:05

域名,于博主来说,这真的是一个老生常谈的东西了。对于域名的使用,我相信几乎所有的博客都不至一次的换过博客的域名吧。人,就是善变的动物,对于自己的域名也是同样,某断时间想搞个短域名玩玩,或又是某个时间想搞个主流域名玩玩,再过一段时间还又想搞一些非主流的域名玩玩,到最后手里都有那么多的域名在吃灰。曾经我迷恋过短域名,搞过bm.md这个域名,但是拿来只是放在手里吃灰,还好后来被原价卖了。

因为我的博客名称一直用“老张博客”或是“张波博客”,所以域名也就是围绕这两个名称换来换去罢了。最早的是用imzhang.com,后来在游子的帮助下注册了zhangbo.org这个域名,这个域名我使用时间最长,应该用有十来年,后来被人7000块钱收购了,收去搞什么引流去了。把zhangbo.org卖了之后用过一段时间的izhang.org。后来在邹江博客的帮助下,成功《抢注了laozhang.org》。其实对于“laozhang”这个拼音,在之前也有关注,曾经laozhang.cn可以抢注的时候我都报了名,但是因为那段时间一直使用zhangbo.org并没有打算去换域名,所以虽然报了名但在竞价的时候拍了出价,最终被人600块钱抢走了。没几天我联系的那个人想着加个一二百块钱给买过来,结果人家报价是2万一分不少。乖乖,炒域名的真的是十年不开张,开张管十年呀!

曾经我也用过一年续费1330块钱的“贵族域名”,那就是zhang.bo,结果《启用zhang.bo之后,我成了调侃的对象》,这个域名用了几个月就被我停掉了。随着时间的推移,手里的域名就慢慢的积累,那么多的域名放在手里只有两个作用,一是续费,另外就是“自慰”了。在2023年底的时候,下定决心《将博客减法进行到底!》,手里除了这个博客的域名,其他的域名不再续费。

前几天五一放假的时候,同样又是在邹江博客的帮助下拿下了我姓名全拼的域名zhangbo.net。对于这个域名,并没有十分坚定的想法换成主博客的域名,还是想着把ICP备案和公安备案给做了放在国内,这样一些国内的免费的东西也可以用用。

其实很多人,特别是新建站的朋友都会问把博客放在国内还是海外,而大部分的回答答案也是一样的。放在海外不需要备案没有管束,而放在国内需要备案,各种规矩特别多放不开等等。其实想想,网络也不是法外之地,即使你放在海外你做了不该做的事情照样会被请去喝茶。

既然要把zhangbo.net放在国内,那服务器选择又是个问题,大家都知道国内常规的服务器价格真的是太贵,还好阿里云的99一年的活动还在,搞了两年。但是两年后何去何从又不知道了。域名和服务器都在阿里云,便提交备案。现在备案真的是方便,记得以前备案的时候服务器商还会寄拍照用的背景布给你,而现在全是在网上操作。5月2日注册的域名,5月7日提交ICP备案,一周后ICP备案通过,当即便提交了公安备案,5月20日公安备案通过。公安备案当时提交的是非交互式,想着过几天申请修改给交互式的看看,因为非交互式是不给开评论的。

目前手里也就是laozhang.org和zhangbo.net这两个域名了,估计应该会长期持有下去。

❌
❌