yanyuyijian/Scripts/py/FreeNom/utils/freenom.py
Leon 5795e02548 🚂🔨FN_extend
2021-08-11 18:33:18 +08:00

127 lines
4.1 KiB
Python

import re
import time
import requests
from utils import settings
from utils.exception import CustomException
class FreeNom(object):
"""
FreeNom api请求
"""
# 登录
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_REGEX = 'name="token"\svalue="(?P<token>[a-z||A-Z||0-9]+)"'
DOMAIN_INFO_REGEX = '<tr><td>(?P<domain>[^<]+)<\/td><td>[^<]+<\/td><td>[^<]+<span class="[^"]+">(?P<days>\d+)[' \
'^&]+&domain=(?P<id>\d+)"'
LOGIN_STATUS_REGEX = '<li.*?Logout.*?<\/li>'
def __init__(self):
self.headers = {
'Content-Type': 'application/x-www-form-urlencoded',
}
self.session = requests.session()
self.token_pattern = re.compile(self.TOKEN_REGEX)
self.domain_info_pattern = re.compile(self.DOMAIN_INFO_REGEX)
self.login_pattern = re.compile(self.LOGIN_STATUS_REGEX)
def run(self) -> list:
self.login()
html = self.get_domains()
token_match = self.token_pattern.findall(html)
domain_info_match = self.domain_info_pattern.findall(html)
login_match = self.login_pattern.findall(html)
if not login_match:
print("FreeNom login parse failed")
raise CustomException("登录检查失败")
if not token_match:
print("FreeNom token parse failed")
raise CustomException("页面token检查失败")
if not domain_info_match:
print("FreeNom domain info parse failed")
raise CustomException("页面没有获取到域名信息")
token = token_match[0]
print(f"waiting for renew domain info is {domain_info_match}")
result = []
for info in domain_info_match:
time.sleep(1)
domain, days, domain_id = info
msg = "失败"
if int(days) > 14:
print(f"FreeNom domain {domain} can not renew, days until expiry is {days}")
else:
response = self.renew_domain(token, domain_id)
if response.find("Order Confirmation") != -1:
msg = "成功"
print(f"FreeNom renew domain {domain} is success")
result.append((domain, days, domain_id, msg))
return result
def login(self) -> bool:
data = {
'username': settings.FN_ID,
'password': settings.FN_PW
}
headers = {
**self.headers,
'Referer': 'https://my.freenom.com/clientarea.php'
}
response = self.session.post(self.LOGIN_URL, data=data, headers=headers)
if response.status_code == 200:
return True
else:
print("FreeNom login failed")
raise CustomException("调用登录接口失败")
def get_domains(self) -> str:
headers = {
'Referer': 'https://my.freenom.com/clientarea.php'
}
response = self.session.get(self.DOMAIN_STATUS_URL, headers=headers)
if response.status_code == 200:
return response.text
else:
print("FreeNom check domain status failed")
raise CustomException("调用获取域名信息接口失败")
def renew_domain(self, token, renewalid) -> str:
headers = {
**self.headers,
"Referer": "https://my.freenom.com/domains.php?a=renewdomain&domain=" + "renewalid"
}
data = {
"token": token,
"renewalid": renewalid,
f"renewalperiod[{renewalid}]": "12M",
'paymentmethod': 'credit'
}
response = self.session.post(self.RENEW_DOMAIN_URL, data=data, headers=headers)
if response.status_code == 200:
return response.text
else:
print("FreeNom renew domain failed")
raise CustomException("调用续期接口失败接口失败")
def __del__(self):
self.session.close()