侧边栏壁纸
博主头像
易雾君博主等级

家庭基建,生活乐享。

  • 累计撰写 18 篇文章
  • 累计创建 53 个标签
  • 累计收到 13 条评论

目 录CONTENT

文章目录

申请永久免费域名

易雾君
2022-03-26 / 3 评论 / 5 点赞 / 1,177 阅读 / 3,727 字
温馨提示:
本文最后更新于 2022-03-27,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

导读

域名可以是为了彰显个性,让别人更加的容易记住你,我们最初入行那些时期就特别想长久拥有一个域名,然而现实就是,你想要的域名都价格不菲,免费的又不长久,很多抱着玩的心态,担忧免费域名会到期,再重新申请真是费心,现在小易就来解救一部分童鞋,免除担忧,至少方案思路会在短期几年是不会失效的,理论上是永久,最终的期限取决于域名运营商的策略。

免费域名为何具有吸引力

小易结合自身需求,略微提上几点:

  • 工作上测试需要,可以选择第三方域名开展暂时性验证性质情形的
  • 个人建站需要,前期想采用免费的域名试运行,不想投入金钱情形的
  • 想白嫖 cloudflare CDN 免费流量,需要拥有多个域名情形的
  • 家里边有动态公网 IP ,想做 DDNS 而又不想购买正式域名情形的
  • 特别想要一个长久持有顶级域名情形的
  • 家庭组网,具有强迫症患者,如不想用 IP 访问,访问内网 web 浏览器必须是绿色锁头情形的

域名申请

打开 Freenom 首页 https://www.freenom.com/en/index.html?lang=en ,输入你想要完整域名,注意,需要是完整的。

Screen Shot 20220326 at 08.34.14.png

将免费使用期限设置到最大值 12 个月。

Screen Shot 20220326 at 08.34.24.png

录入事先未注册过 Freenom 邮箱地址。

Screen Shot 20220326 at 08.35.15.png

不出意外就会出现如下提醒,告知确认邮件已发至所填写的邮箱。

Screen Shot 20220326 at 08.36.17.png

进入邮箱点击确认邮件链接。

Screen Shot 20220326 at 08.38.02.png

信息尽可能详尽,但信息中地址最好要与你使用 IP 大致地理位置吻合

FireShot Capture 003  Shopping Cart  Freenom  my.freenom.com.png

可以打开这个地址 ipinfo.io 查看自己的地址信息,比如小易用的的洛杉矶某 IP

Screen Shot 20220326 at 15.37.41.png

点击完成订单后,顺利的话,即可进入订单确认页。

FireShot Capture 004  Shopping Cart  Freenom  my.freenom.com.png

查看申请到的域名信息,申请至此就大功告成了。

FireShot Capture 005  Client Area  Freenom  my.freenom.com.png

域名续期自动化

一年的使用期,着实太短暂,小易在参考别人提供的续期脚本后,加入代理支持,并支持多个域名续期,供大家伙参考。

基础环境配备

  • 确保机器能直连互联网或者可通过指定代理上网
  • 确保定时任务执行期间,机器是开机状态
  • 确保安装有 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 天时,该脚本会自动续期一年。

温馨提示

不要因为免费的,就恶意海量注册囤积居奇,造成后期环境恶化,其他想注册的难度加大,就不和谐了,希望你是真正的自用需求。

视频示范

5

评论区