'''
cron: 25 7 */10 * *
new Env('Freenom 续期消息版');
'''
import os,re,requests,argparse
# 登录地址
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'
| (.*?) | [^<]+ | [^<]+.*? |
',
re.I)
# 登录状态正则
login_status_ptn = re.compile('Logout', re.I)
# args
parser = argparse.ArgumentParser()
parser.add_argument('-u', '--username', type=str)
parser.add_argument('-p', '--password', type=str)
args = parser.parse_args()
username = args.username
password = args.password
def qlnotify(desp):
cur_path = os.path.abspath(os.path.dirname(__file__))
if os.path.exists(cur_path + "/notify.py"):
try:
from notify import send
except:
print("加载通知服务失败~")
else:
send('Freenom 续期', desp)
class FreeNom:
def __init__(self, username: str, password: str):
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'
})
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):
global msg
msg = ''
# login
ok = self._login()
if not ok:
msg = 'login failed'
print(msg)
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):
msg = 'get login status failed'
print(msg)
return
# page token
match = re.search(token_ptn, r.text)
if not match:
msg = 'get page token failed'
print(msg)
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'
})
result = f'{domain} 续期成功' if r.text.find('Order Confirmation') != -1 else f'{domain} 续期失败'
print(result)
msg += result + '\n'
result = f'{domain} 还有 {days} 天续期'
print(result)
msg += result + '\n'
if "FN_ID" in os.environ:
username = os.environ.get('FN_ID')
if "FN_PW" in os.environ:
password = os.environ.get('FN_PW')
if not username or not password:
msg = '你没有添加任何账户'
print(msg)
exit(1)
user_list = username.strip().split()
passwd_list = password.strip().split()
if len(user_list) != len(passwd_list):
msg = '账户与密码不匹配'
print(msg)
exit(1)
for i in range(len(user_list)):
instance = FreeNom(user_list[i], passwd_list[i])
instance.renew()
qlnotify(msg)