You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

285 lines
9.9 KiB

import base64
import datetime
import json
import logging
import os.path
import time
import requests
import ddddocr
# 配置日志
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
# 配置文件路径
CONFIG_FILE = "config.json"
# 初始化配置
def init_config():
if not os.path.exists(CONFIG_FILE):
with open(CONFIG_FILE, "w", encoding="utf-8") as f:
json.dump({}, f)
# 读取配置
def load_config():
with open(CONFIG_FILE, "r", encoding="utf-8") as f:
return json.load(f)
# 保存配置
def save_config(config):
with open(CONFIG_FILE, "w", encoding="utf-8") as f:
json.dump(config, f, indent=4)
# 获取版本号
def get_version(config):
if "version" not in config:
# 这里可以添加获取版本号的逻辑
config["version"] = "1.1.3"
save_config(config)
return config["version"]
# 获取App ID
def get_app_id(config):
if "appid" not in config:
response = requests.get(
f"https://www.aeropres.in/chromeapi/dawn/v1/appid/getappid?app_v={get_version(config)}",
proxies=config.get("proxy"),
headers={
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36"},
verify=False,
timeout=15
)
if response.status_code != 200:
raise Exception("获取appid失败")
config["appid"] = response.json()["data"]["appid"]
save_config(config)
return config["appid"]
# 获取Puzzle ID
def get_puzzle_id(config):
app_id = get_app_id(config)
headers = {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate, br, zstd",
"Accept-Language": "zh-CN,zh;q=0.9",
"Origin": "chrome-extension://fpdkjdnhkakefebpekbdhillbhonfjjp",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36",
"priority": "u=1, i",
"sec-ch-ua": '"Not(A:Brand";v="99", "Google Chrome";v="133", "Chromium";v="133"',
"sec-ch-ua-mobile": "?0",
"sec-ch-ua-platform": '"Windows"',
"sec-fetch-dest": "empty",
"sec-fetch-mode": "cors",
"sec-fetch-site": "cross-site",
}
response = requests.get(
f"https://www.aeropres.in/chromeapi/dawn/v1/puzzle/get-puzzle?appid={app_id}",
proxies=config.get("proxy"),
headers=headers,
verify=False,
timeout=15
)
if response.status_code not in [200, 201]:
raise Exception("获取puzzle_id失败")
res_json = response.json()
if not res_json.get('success', False):
raise Exception("获取puzzle_id结果失败")
return res_json["puzzle_id"]
# 获取Puzzle Code
def get_puzzle_code(config):
puzzle_id = get_puzzle_id(config)
headers = {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate, br, zstd",
"Accept-Language": "zh-CN,zh;q=0.9",
"Origin": "chrome-extension://fpdkjdnhkakefebpekbdhillbhonfjjp",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36",
"priority": "u=1, i",
"sec-ch-ua": '"Not(A:Brand";v="99", "Google Chrome";v="133", "Chromium";v="133"',
"sec-ch-ua-mobile": "?0",
"sec-ch-ua-platform": '"Windows"',
"sec-fetch-dest": "empty",
"sec-fetch-mode": "cors",
"sec-fetch-site": "cross-site",
}
response = requests.get(
f"https://www.aeropres.in/chromeapi/dawn/v1/puzzle/get-puzzle-image?puzzle_id={puzzle_id}&appid={get_app_id(config)}",
proxies=config.get("proxy"),
headers=headers,
verify=False,
timeout=15
)
if response.status_code != 200:
raise Exception("获取puzzle_url失败")
res_json = response.json()
if not res_json.get('success', False):
raise Exception("获取puzzle_url结果失败")
imgBase64 = res_json["imgBase64"]
data = base64.b64decode(imgBase64)
return get_code_with_img(puzzle_id, img_data=data)
# 获取验证码
def get_code_with_img(puzzle_id, img_data):
print(puzzle_id)
with open(f'{str(int(time.time()))}.jpg', 'wb') as file:
file.write(img_data)
return False
# 获取Token
def get_token(config):
if "token" not in config:
retry_count = config.get('retry', 3)
code = ""
puzzle_id = ""
while retry_count > 0:
try:
puzzle_id = get_puzzle_id(config)
code = get_puzzle_code(config)
break
except Exception as e:
logging.error(f"获取token失败,{e}")
retry_count -= 1
if not code or not puzzle_id:
return False
data = {
"username": config.get("username", ""),
"password": config.get("password", ""),
"logindata": {"_v": {"version": get_version(config)},
"datetime": datetime.datetime.now().strftime("%Y-%m-%dT%H:%M:%S.%fZ")[:-3]},
"puzzle_id": puzzle_id,
"ans": code,
"appid": get_app_id(config),
}
headers = {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate, br, zstd",
"Accept-Language": "zh-CN,zh;q=0.9",
"Origin": "chrome-extension://fpdkjdnhkakefebpekbdhillbhonfjjp",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36",
"priority": "u=1, i",
"sec-ch-ua": '"Not(A:Brand";v="99", "Google Chrome";v="133", "Chromium";v="133"',
"sec-ch-ua-mobile": "?0",
"sec-ch-ua-platform": '"Windows"',
"sec-fetch-dest": "empty",
"sec-fetch-mode": "cors",
"sec-fetch-site": "cross-site",
}
retry_count = config.get('retry', 3)
while retry_count > 0:
try:
response = requests.post(
f"https://www.aeropres.in/chromeapi/dawn/v1/user/login/v2?appid={get_app_id(config)}",
json=data,
proxies=config.get("proxy"),
verify=False,
timeout=15,
headers=headers
)
if response.status_code != 200:
raise Exception("获取token失败")
res_json = response.json()
if not res_json.get('success', False):
raise Exception("获取token结果失败")
config["token"] = res_json["data"]["token"]
save_config(config)
break
except Exception as e:
logging.error(f"获取token失败,{e}")
retry_count -= 1
return config.get("token", "")
# 获取积分
def get_point(config):
headers = {
"Authorization": f"Bearer {config.get('token', '')}",
"Content-Type": "application/json",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36",
"sec-ch-ua": '"Not(A:Brand";v="99", "Google Chrome";v="133", "Chromium";v="133"',
"sec-ch-ua-mobile": "?0",
"sec-ch-ua-platform": '"Windows"',
}
response = requests.get(
f"https://www.aeropres.in/api/atom/v1/userreferral/getpoint?appid={get_app_id(config)}",
headers=headers,
proxies=config.get("proxy"),
verify=False,
timeout=15
)
if response.status_code != 200:
raise Exception(f"获取积分失败,{response.text}")
if not response.json().get('success', False):
raise Exception(f"获取积分失败,{response.json()}")
# 保持活跃
def keep_alive(config):
headers = {
"Authorization": f"Bearer {config.get('token', '')}",
"Content-Type": "application/json",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36",
}
data = {
"username": config.get("username", ""),
"extensionid": "fpdkjdnhkakefebpekbdhillbhonfjjp",
"numberoftabs": 0,
"_v": get_version(config)
}
response = requests.post(
f"https://www.aeropres.in/chromeapi/dawn/v1/userreward/keepalive?appid={get_app_id(config)}",
json=data,
headers=headers,
proxies=config.get("proxy"),
verify=False,
timeout=15
)
if response.status_code != 200:
raise Exception(f"保持活跃失败,{response.text}")
if not response.json().get('success', False):
raise Exception(f"保持活跃失败,{response.json()}")
# 主函数
def main():
init_config()
config = load_config()
while True:
token = get_token(config)
if not token:
time.sleep(60)
del config['token']
save_config(config)
continue
retry_count = 5
while retry_count > 0:
err = False
try:
get_point(config)
except Exception as e:
logging.error(f"获取积分失败,{e}")
err = True
try:
keep_alive(config)
except Exception as e:
logging.error(f"保持活跃失败,{e}")
err = True
if not err:
retry_count = 5
else:
retry_count -= 1
if retry_count <= 0:
break
time.sleep(5 * 60)
if __name__ == '__main__':
main()