导读
域名可以是为了彰显个性,让别人更加的容易记住你,我们最初入行那些时期就特别想长久拥有一个域名,然而现实就是,你想要的域名都价格不菲,免费的又不长久,很多抱着玩的心态,担忧免费域名会到期,再重新申请真是费心,现在小易就来解救一部分童鞋,免除担忧,至少方案思路会在短期几年是不会失效的,理论上是永久,最终的期限取决于域名运营商的策略。
免费域名为何具有吸引力
小易结合自身需求,略微提上几点:
- 工作上测试需要,可以选择第三方域名开展暂时性验证性质情形的
- 个人建站需要,前期想采用免费的域名试运行,不想投入金钱情形的
- 想白嫖 cloudflare CDN 免费流量,需要拥有多个域名情形的
- 家里边有动态公网 IP ,想做 DDNS 而又不想购买正式域名情形的
- 特别想要一个长久持有顶级域名情形的
- 家庭组网,具有强迫症患者,如不想用 IP 访问,访问内网 web 浏览器必须是绿色锁头情形的
域名申请
打开 Freenom 首页 https://www.freenom.com/en/index.html?lang=en ,输入你想要完整域名,注意,需要是完整的。
将免费使用期限设置到最大值 12 个月。
录入事先未注册过 Freenom 邮箱地址。
不出意外就会出现如下提醒,告知确认邮件已发至所填写的邮箱。
进入邮箱点击确认邮件链接。
信息尽可能详尽,但信息中地址最好要与你使用 IP 大致地理位置吻合
可以打开这个地址 ipinfo.io
查看自己的地址信息,比如小易用的的洛杉矶某 IP
点击完成订单后,顺利的话,即可进入订单确认页。
查看申请到的域名信息,申请至此就大功告成了。
域名续期自动化
一年的使用期,着实太短暂,小易在参考别人提供的续期脚本后,加入代理支持,并支持多个域名续期,供大家伙参考。
基础环境配备
- 确保机器能直连互联网或者可通过指定代理上网
- 确保定时任务执行期间,机器是开机状态
- 确保安装有 python3 和 python3-pip
安装依赖关系
pip3 install requests pysocks
脚本主体
内容不多,直接贴出
# -*- coding: utf-8 -*-
# @File : freenom.py
# @Author : 易雾君
# @Time : 2021/10/23 9:58 AM
# @Email : [email protected]
# @Project : tools
# @Site : https://evling.tech
# @公众号 : 易雾山庄
# @Describe : 家庭基建,生活乐享.
import re
import requests
# 登录地址
LOGIN_URL = 'https://my.freenom.com/dologin.php'
# 域名状态地址
DOMAIN_STATUS_URL = 'https://my.freenom.com/domains.php?a=renewals'
# 域名续期地址
RENEW_DOMAIN_URL = 'https://my.freenom.com/domains.php?submitrenewals=true'
# token 正则
token_ptn = re.compile('name="token" value="(.*?)"', re.I)
# 域名信息正则
domain_info_ptn = re.compile(
r'<tr><td>(.*?)</td><td>[^<]+</td><td>[^<]+<span class="[^<]+>(\d+?).Days</span>[^&]+&domain=(\d+?)">.*?</tr>',
re.I)
# 登录状态正则
login_status_ptn = re.compile('<a href="logout.php">Logout</a>', re.I)
class FreeNom:
def __init__(self, username: str, password: str, proxies=None):
self._u = username
self._p = password
self._s = requests.Session()
self._s.headers.update({
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/79.0.3945.130 Safari/537.36'
})
if proxies is not None:
self._s.proxies.update(proxies)
def _login(self) -> bool:
self._s.headers.update({
'content-type': 'application/x-www-form-urlencoded',
'referer': 'https://my.freenom.com/clientarea.php'
})
r = self._s.post(LOGIN_URL, data={'username': self._u, 'password': self._p})
return r.status_code == 200
def renew(self):
# login
ok = self._login()
if not ok:
print('login failed')
return
# check domain status
self._s.headers.update({'referer': 'https://my.freenom.com/clientarea.php'})
r = self._s.get(DOMAIN_STATUS_URL)
# login status check
if not re.search(login_status_ptn, r.text):
print('get login status failed')
return
# page token
match = re.search(token_ptn, r.text)
if not match:
print('get page token failed')
return
token = match.group(1)
# domains
domains = re.findall(domain_info_ptn, r.text)
# renew domains
for domain, days, renewal_id in domains:
days = int(days)
if days <= 14:
self._s.headers.update({
'referer': f'https://my.freenom.com/domains.php?a=renewdomain&domain={renewal_id}',
'content-type': 'application/x-www-form-urlencoded'
})
r = self._s.post(RENEW_DOMAIN_URL, data={
'token': token,
'renewalid': renewal_id,
f'renewalperiod[{renewal_id}]': '12M',
'paymentmethod': 'credit'
})
print(domain, '续期成功' if r.text.find('Order Confirmation') != -1 else '续期失败')
print(f'{domain} 还有 {days} 天续期')
users = [{'username': '[email protected]', 'password': 'passwd01'},
{'username': '[email protected]', 'password': 'passwd02'},
]
proxies = None
#proxies = {'https': 'http://admin:[email protected]:1080', 'http': 'http://admin:[email protected]:1080'}
for user in users:
instance = FreeNom(user['username'], user['password'], proxies)
instance.renew()
在脚本末尾 users
变量内容调整为自己的账号些,代理格式如注释部分,可根据实际情况填写,取消注释即可生效。
配置定时任务
将如上脚本主体报存至一个固定位置,如 /etc/vnet/freenom.py
,使用 crontab -e
新增一个定时任务,每天定时执行,如每天早上 6 点执行一次:
0 6 * * * /usr/bin/python3 /etc/vnet/freenom.py > /tmp/freenom.txt
如此就不用担心,域名到期被人抢注了再次开始艰难的手动注册环节,在距离到期 14 天时,该脚本会自动续期一年。
温馨提示
不要因为免费的,就恶意海量注册囤积居奇,造成后期环境恶化,其他想注册的难度加大,就不和谐了,希望你是真正的自用需求。