diff --git a/189/cloud_check_in.py b/189/cloud_check_in.py index 745a613..7989413 100644 --- a/189/cloud_check_in.py +++ b/189/cloud_check_in.py @@ -6,48 +6,49 @@ import requests from environs import Env -s = requests.Session() +env = Env() +env.read_env() -def int2char(a): - base36_chars = list("0123456789abcdefghijklmnopqrstuvwxyz") - return base36_chars[a] +def int_to_base36_char(value): + base36_chars = "0123456789abcdefghijklmnopqrstuvwxyz" + return base36_chars[value] -def b64tohex(a): +def base64_to_hex(b64_string): B64MAP = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" - d = "" - e = 0 - c = 0 - for i in range(len(a)): - if list(a)[i] != "=": - v = B64MAP.index(list(a)[i]) - if e == 0: - e = 1 - d += int2char(v >> 2) - c = 3 & v - elif e == 1: - e = 2 - d += int2char(c << 2 | v >> 4) - c = 15 & v - elif e == 2: - e = 3 - d += int2char(c) - d += int2char(v >> 2) - c = 3 & v + hex_string = "" + carry = 0 + buffer = 0 + for char in b64_string: + if char != "=": + value = B64MAP.index(char) + if carry == 0: + carry = 1 + hex_string += int_to_base36_char(value >> 2) + buffer = 3 & value + elif carry == 1: + carry = 2 + hex_string += int_to_base36_char(buffer << 2 | value >> 4) + buffer = 15 & value + elif carry == 2: + carry = 3 + hex_string += int_to_base36_char(buffer) + hex_string += int_to_base36_char(value >> 2) + buffer = 3 & value else: - e = 0 - d += int2char(c << 2 | v >> 4) - d += int2char(15 & v) - if e == 1: - d += int2char(c << 2) - return d + carry = 0 + hex_string += int_to_base36_char(buffer << 2 | value >> 4) + hex_string += int_to_base36_char(15 & value) + if carry == 1: + hex_string += int_to_base36_char(buffer << 2) + return hex_string -def rsa_encode(j_rsakey, string): - rsa_key = f"-----BEGIN PUBLIC KEY-----\n{j_rsakey}\n-----END PUBLIC KEY-----" +def rsa_encrypt(public_key, message): + rsa_key = f"-----BEGIN PUBLIC KEY-----\n{public_key}\n-----END PUBLIC KEY-----" pubkey = rsa.PublicKey.load_pkcs1_openssl_pem(rsa_key.encode()) - result = b64tohex((base64.b64encode(rsa.encrypt(f'{string}'.encode(), pubkey))).decode()) + result = base64_to_hex((base64.b64encode(rsa.encrypt(f'{message}'.encode(), pubkey))).decode()) return result @@ -57,81 +58,80 @@ def calculate_md5_sign(params): def login(username, password): try: + session = requests.Session() urlToken = ("https://m.cloud.189.cn/udb/udb_login.jsp?pageId=1&pageKey=default&clientType=wap&redirectURL" "=https://m.cloud.189.cn/zhuanti/2021/shakeLottery/index.html") - r = s.get(urlToken) - pattern = r"https?://[^\s'\"]+" # 匹配以http或https开头的url - match = re.search(pattern, r.text) # 在文本中搜索匹配 - if match: # 如果找到匹配 - url = match.group() # 获取匹配的字符串 - else: # 如果没有找到匹配 - raise Exception("没有找到url") - - r = s.get(url) - pattern = r"]*href=\"([^\"]+)\"" # 匹配id为j-tab-login-link的a标签,并捕获href引号内的内容 - match = re.search(pattern, r.text) # 在文本中搜索匹配 - if match: # 如果找到匹配 - href = match.group(1) # 获取捕获的内容 - else: # 如果没有找到匹配 - raise Exception("没有找到href链接") - - r = s.get(href) - captchaToken = re.findall(r"captchaToken' value='(.+?)'", r.text)[0] - lt = re.findall(r'lt = "(.+?)"', r.text)[0] - returnUrl = re.findall(r"returnUrl= '(.+?)'", r.text)[0] - paramId = re.findall(r'paramId = "(.+?)"', r.text)[0] - j_rsakey = re.findall(r'j_rsaKey" value="(\S+)"', r.text, re.M)[0] - s.headers.update({"lt": lt}) - - username = rsa_encode(j_rsakey, username) - password = rsa_encode(j_rsakey, password) + response = session.get(urlToken) + + url_match = re.search(r"https?://[^\s'\"]+", response.text) + if not url_match: + raise Exception("登录URL未找到") + redirect_url = url_match.group() + + response = session.get(redirect_url) + href_match = re.search(r']*href="([^\"]+)"', response.text) + if not href_match: + raise Exception("登录链接未找到") + login_href = href_match.group(1) + + response = session.get(login_href) + captcha_token = re.findall(r"captchaToken' value='(.+?)'", response.text)[0] + lt = re.findall(r'lt = "(.+?)"', response.text)[0] + return_url = re.findall(r"returnUrl= '(.+?)'", response.text)[0] + param_id = re.findall(r'paramId = "(.+?)"', response.text)[0] + rsa_key = re.findall(r'j_rsaKey" value="(\S+)"', response.text, re.M)[0] + session.headers.update({"lt": lt}) + + encrypted_username = rsa_encrypt(rsa_key, username) + encrypted_password = rsa_encrypt(rsa_key, password) url = "https://open.e.189.cn/api/logbox/oauth2/loginSubmit.do" headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:74.0) Gecko/20100101 Firefox/76.0', 'Referer': 'https://open.e.189.cn/', } - data = { + login_payload = { "appKey": "cloud", "accountType": '01', - "userName": f"{{RSA}}{username}", - "password": f"{{RSA}}{password}", + "userName": f"{{RSA}}{encrypted_username}", + "password": f"{{RSA}}{encrypted_password}", "validateCode": "", - "captchaToken": captchaToken, - "returnUrl": returnUrl, + "captchaToken": captcha_token, + "returnUrl": return_url, "mailSuffix": "@189.cn", - "paramId": paramId + "paramId": param_id } - r = s.post(url, data=data, headers=headers, timeout=5) - if r.json()['result'] == 0: - print(r.json()['msg']) + login_response = session.post(url, data=login_payload, headers=headers, timeout=5) + login_info = login_response.json() + if login_info['result'] == 0: + print(login_info['msg']) else: - raise Exception(f"天翼云盘:登录失败:{r.json()['msg']}") - redirect_url = r.json()['toUrl'] - s.get(redirect_url) - return s + raise Exception(f"{login_info['msg']}") + redirect_url = login_info['toUrl'] + session.get(redirect_url) + return session except Exception as e: - send_msg(f"天翼云盘:登录失败{str(e)}") + send_msg(f"账号 {username}\n登录失败: {str(e)}") return None def check_in(username, password): - # 多次尝试 - retry = 3 - while retry: - s = login(username, password) - if s: + max_retries = 3 + session = None + while max_retries: + session = login(username, password) + if session: break + max_retries -= 1 - retry -= 1 - - if not s: - print("登录失败") + if not session: + print(f"账号 {username} 登录失败") return - rand = str(round(time.time() * 1000)) - surl = (f'https://api.cloud.189.cn/mkt/userSign.action?rand={rand}&clientType=TELEANDROID&version=8.6.3&model=SM' - f'-G930K') - url_list = [ + rand_timestamp = str(round(time.time() * 1000)) + sign_in_url = ( + f'https://api.cloud.189.cn/mkt/userSign.action?rand={rand_timestamp}&clientType=TELEANDROID&version=8.6.3' + f'&model=SM-G930K') + activity_urls = [ 'https://m.cloud.189.cn/v2/drawPrizeMarketDetails.action?taskId=TASK_SIGNIN&activityId=ACT_SIGNIN', 'https://m.cloud.189.cn/v2/drawPrizeMarketDetails.action?taskId=TASK_SIGNIN_PHOTOS&activityId=ACT_SIGNIN', f'https://m.cloud.189.cn/v2/drawPrizeMarketDetails.action?taskId=TASK_2022_FLDFS_KJ&activityId=ACT_SIGNIN' @@ -145,28 +145,25 @@ def check_in(username, password): "Host": "m.cloud.189.cn", "Accept-Encoding": "gzip, deflate", } - response = s.get(surl, headers=headers) - netdiskBonus = response.json()['netdiskBonus'] + response = session.get(sign_in_url, headers=headers) + netdisk_bonus = response.json()['netdiskBonus'] - content = f"签到获得{netdiskBonus}M空间" + content = f"账号 {username}\n签到获得 {netdisk_bonus}M 空间" - for url in url_list: + for activity_url in activity_urls: time.sleep(5) - response = s.get(url, headers=headers) + response = session.get(activity_url, headers=headers) if "errorCode" in response.text: - send_msg(f"天翼云盘:{response.text}") + content += f"\n{response.json()['errorCode']}" else: - description = response.json()['prizeName'] - - content += f"\n抽奖获得{description}" + description = response.json().get('prizeName', '未知奖励') + content += f"\n抽奖获得 {description}" send_msg(content) def send_msg(content): url = "https://api.xbxin.com/msg/admin/corp" - env = Env() - env.read_env() token = env.str("TOKEN") headers = { @@ -183,10 +180,8 @@ def send_msg(content): def main(): - env = Env() - env.read_env() - userList = env.json("TY_CLOUD") - for user in userList: + users = env.json("TY_CLOUD") + for user in users: username = user['username'] password = user['password'] check_in(username, password)