ck_freenom.FreeNom.__init__()   A
last analyzed

Complexity

Conditions 1

Size

Total Lines 6
Code Lines 6

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 6
nop 2
dl 0
loc 6
rs 10
c 0
b 0
f 0
1
# -*- coding: utf-8 -*-
2
"""
3
cron: 25 7 */10 * *
4
new Env('FreeNom');
5
"""
6
7
import re
8
9
import requests
10
11
from notify_mtr import send
12
from utils import get_data
13
14
# 登录地址
15
LOGIN_URL = "https://my.freenom.com/dologin.php"
16
17
# 域名状态地址
18
DOMAIN_STATUS_URL = "https://my.freenom.com/domains.php?a=renewals"
19
20
# 域名续期地址
21
RENEW_DOMAIN_URL = "https://my.freenom.com/domains.php?submitrenewals=true"
22
23
# token 正则
24
token_ptn = re.compile('name="token" value="(.*?)"', re.I)
25
26
# 域名信息正则
27
domain_info_ptn = re.compile(
28
    r'<tr><td>(.*?)</td><td>[^<]+</td><td>[^<]+<span class="[^<]+>(\d+?).Days</span>[^&]+&domain=(\d+?)">.*?</tr>',
29
    re.I,
30
)
31
32
# 登录状态正则
33
login_status_ptn = re.compile('<a href="logout.php">Logout</a>', re.I)
34
35
36
class FreeNom:
37
    def __init__(self, check_items: list):
38
        self.check_items = check_items
39
        self._s = requests.Session()
40
        self._s.headers.update(
41
            {
42
                "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/79.0.3945.130 Safari/537.36"
43
            }
44
        )
45
46
    def _login(self, usr: str, pwd: str) -> bool:
47
        self._s.headers.update(
48
            {
49
                "content-type": "application/x-www-form-urlencoded",
50
                "referer": "https://my.freenom.com/clientarea.php",
51
            }
52
        )
53
        r = self._s.post(LOGIN_URL, data={"username": usr, "password": pwd})
54
        return r.status_code == 200
55
56
    def main(self) -> str:
57
        msg = ""
58
        msg_all = ""
59
60
        for i, check_item in enumerate(self.check_items, start=1):
61
            username = check_item.get("username")
62
            password = check_item.get("password")
63
64
            # login
65
            if not self._login(usr=username, pwd=password):
66
                msg_all += f"account{i} login failed\n\n"
67
                continue
68
69
            # check domain status
70
            self._s.headers.update({"referer": "https://my.freenom.com/clientarea.php"})
71
            r = self._s.get(DOMAIN_STATUS_URL)
72
73
            # login status check
74
            if not re.search(login_status_ptn, r.text):
75
                msg_all += f"account{i} get login status failed\n\n"
76
                continue
77
78
            # page token
79
            match = re.search(token_ptn, r.text)
80
            if not match:
81
                msg_all += f"account{i} get page token failed\n\n"
82
                continue
83
            token = match[1]
84
85
            # domains
86
            domains = re.findall(domain_info_ptn, r.text)
87
88
            # renew domains
89
            res = ""
90
            for domain, days, renewal_id in domains:
91
                if int(days) < 14:
92
                    self._s.headers.update(
93
                        {
94
                            "referer": f"https://my.freenom.com/domains.php?a=renewdomain&domain={renewal_id}",
95
                            "content-type": "application/x-www-form-urlencoded",
96
                        }
97
                    )
98
                    r = self._s.post(
99
                        RENEW_DOMAIN_URL,
100
                        data={
101
                            "token": token,
102
                            "renewalid": renewal_id,
103
                            f"renewalperiod[{renewal_id}]": "12M",
104
                            "paymentmethod": "credit",
105
                        },
106
                    )
107
                    res += (
108
                        f"{domain} 续期成功\n"
109
                        if r.text.find("Order Confirmation") != -1
110
                        else f"{domain} 续期失败"
111
                    )
112
                res += f"{domain} 还有 {days} 天续期\n"
113
                msg = f"账号{i}\n{res}"
114
            msg_all += msg + "\n"
115
        return msg_all
116
117
118
if __name__ == "__main__":
119
    _data = get_data()
120
    _check_items = _data.get("FREENOM", [])
121
    result = FreeNom(check_items=_check_items).main()
122
    send("FreeNom", result)
123