From 96f6c7641a415b570c5bb00170a420394d320621 Mon Sep 17 00:00:00 2001 From: Anyexyz Date: Wed, 10 Jan 2024 19:54:04 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A4=9A=E7=BA=BF=E7=A8=8B=E9=87=8D=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Beijng_Daxuexi.py | 113 +++++++++++++++------------------------------- one_account.py | 83 ++++++++++++++++++++++++++++++++++ 2 files changed, 119 insertions(+), 77 deletions(-) create mode 100644 one_account.py diff --git a/Beijng_Daxuexi.py b/Beijng_Daxuexi.py index 2990648..967328d 100644 --- a/Beijng_Daxuexi.py +++ b/Beijng_Daxuexi.py @@ -1,90 +1,49 @@ -import json -import re -import time -import requests import csv -from utility import encrypt, cap_recognize -def study(username,password): - # 返回1:成功 - # 返回0:失败 - tryTime = 0 - url = '' - while tryTime < 4: - try: - bjySession = requests.session() # 创建会话 - bjySession.timeout = 5 # 设置会话超时 - bjySession.headers.update({"User-Agent": 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36', }) - touch = bjySession.get(url="https://m.bjyouth.net/site/login") - capUrl = "https://m.bjyouth.net" + re.findall(r'src="(/site/captcha.+)" alt=', touch.text)[0] - capText = cap_recognize(bjySession.get(url=capUrl).content) - login_r = bjySession.post('https://m.bjyouth.net/site/login', - data={ - '_csrf_mobile': bjySession.cookies.get_dict()['_csrf_mobile'], - 'Login[password]': encrypt(password), - 'Login[username]': encrypt(username), - 'Login[verifyCode]': capText - }) - if login_r.text == '8': - print('Login:识别的验证码错误') - continue - if 'fail' in login_r.text: - tryTime += 9 - raise Exception('Login:账号密码错误') - print('登录成功') - r = json.loads(bjySession.get("https://m.bjyouth.net/dxx/course").text) - if 'newCourse' not in r: - print(r) - # newCourse滞后于course中的课程,所以这里用course中的最新课程 - url = r['data']['data'][0]['url'] - title = r['data']['data'][0]['title'] - courseId = r['data']['data'][0]['id'] - break - except: - time.sleep(3) - tryTime += 1 +import threading +import subprocess - if not url: - print('登入失败,退出') - return 0 +def process_account(row, result_list): + username, password = row[0], row[1] - info = bjySession.get('https://m.bjyouth.net/dxx/my').json()['data'] - name = info['name'].split('(')[0] - org = info['org'].split('(')[0] - print(f'当前用户: {name} {org}') + try: + output_bytes = subprocess.check_output(["python", "one_account.py", username, password]) + output = output_bytes.decode('utf-8') # Use utf-8 encoding to decode the bytes + except subprocess.CalledProcessError as e: + output = f"Error: {e.output.decode('utf-8')}" # Use utf-8 encoding to decode the error output - nOrgID = int(bjySession.get('https://m.bjyouth.net/dxx/is-league').text) - - learnedInfo = 'https://m.bjyouth.net/dxx/my-study?page=1&limit=15&year=' + time.strftime("%Y", time.localtime()) - haveLearned = bjySession.get(learnedInfo).json() - - if f"学习课程:《{title}》" in list(map(lambda x: x['text'], haveLearned['data'])): - print(f'{title} 在运行前已完成,退出') - return 1 - study_url = f"https://m.bjyouth.net/dxx/check" - r = bjySession.post(study_url, json={"id": str(courseId), "org_id": int(nOrgID)}) # payload - if r.text: - print(f'Unexpected response: {r.text}') - return 0 - - haveLearned = bjySession.get(learnedInfo).json() - if f"学习课程:《{title}》" in list(map(lambda x: x['text'], haveLearned['data'])): - print(f'{title} 成功完成学习') - return 1 - else: - print(f'完成{title}, 但未在已学习列表中找到, 请手动检查') - return 0 + result_list.append((username, output)) # 将结果存入结果列表 if __name__ == '__main__': - # 读取account.csv配置文件,格式为:用户名,密码,备注 success = 0 count = 0 + all_results = [] # 用于存储每个线程的结果列表 + with open('account.csv', 'r', encoding='utf-8') as f: reader = csv.reader(f) + threads = [] + for row in reader: count += 1 - print(f'用户{count}: {row[0]}') - if study(row[0], row[1]): + print(f'用户{count}: {row[2]}({row[0]})') + + # 创建一个线程并启动,为每个线程创建独立的结果列表 + results = [] + thread = threading.Thread(target=process_account, args=(row, results)) + threads.append(thread) + thread.start() + + # 将每个线程的结果列表存入总的结果列表 + all_results.append(results) + + # 等待所有线程执行完毕 + for thread in threads: + thread.join() + print('\n所有用户运行完毕\n') + # 统计成功和失败的用户 + for results in all_results: + for username, output in results: + if "Error" not in output: success += 1 - print("\n") - print(f'共{count}个用户,成功{success}个,失败{count-success}个') - \ No newline at end of file + print(f'用户{username}运行结果:\n{output}') + + print(f'共{count}个用户,成功{success}个,失败{count - success}个') diff --git a/one_account.py b/one_account.py new file mode 100644 index 0000000..93441aa --- /dev/null +++ b/one_account.py @@ -0,0 +1,83 @@ +import json +import re +import time +import requests +from utility import encrypt, cap_recognize +import argparse + +def study(username,password): + # 返回1:成功 + # 返回0:失败 + tryTime = 0 + url = '' + while tryTime < 4: + try: + bjySession = requests.session() # 创建会话 + bjySession.timeout = 5 # 设置会话超时 + bjySession.headers.update({"User-Agent": 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36', }) + touch = bjySession.get(url="https://m.bjyouth.net/site/login") + capUrl = "https://m.bjyouth.net" + re.findall(r'src="(/site/captcha.+)" alt=', touch.text)[0] + capText = cap_recognize(bjySession.get(url=capUrl).content) + login_r = bjySession.post('https://m.bjyouth.net/site/login', + data={ + '_csrf_mobile': bjySession.cookies.get_dict()['_csrf_mobile'], + 'Login[password]': encrypt(password), + 'Login[username]': encrypt(username), + 'Login[verifyCode]': capText + }) + if login_r.text == '8': + print('Login:识别的验证码错误') + continue + if 'fail' in login_r.text: + tryTime += 9 + raise Exception('Login:账号密码错误') + print('登录成功') + r = json.loads(bjySession.get("https://m.bjyouth.net/dxx/course").text) + if 'newCourse' not in r: + print(r) + # newCourse滞后于course中的课程,所以这里用course中的最新课程 + url = r['data']['data'][0]['url'] + title = r['data']['data'][0]['title'] + courseId = r['data']['data'][0]['id'] + break + except: + time.sleep(3) + tryTime += 1 + + if not url: + print('登入失败,退出') + return 0 + + info = bjySession.get('https://m.bjyouth.net/dxx/my').json()['data'] + name = info['name'].split('(')[0] + org = info['org'].split('(')[0] + print(f'当前用户: {name} {org}') + + nOrgID = int(bjySession.get('https://m.bjyouth.net/dxx/is-league').text) + + learnedInfo = 'https://m.bjyouth.net/dxx/my-study?page=1&limit=15&year=' + time.strftime("%Y", time.localtime()) + haveLearned = bjySession.get(learnedInfo).json() + + if f"学习课程:《{title}》" in list(map(lambda x: x['text'], haveLearned['data'])): + print(f'{title} 在运行前已完成,退出') + return 1 + study_url = f"https://m.bjyouth.net/dxx/check" + r = bjySession.post(study_url, json={"id": str(courseId), "org_id": int(nOrgID)}) # payload + if r.text: + print(f'Unexpected response: {r.text}') + return 0 + + haveLearned = bjySession.get(learnedInfo).json() + if f"学习课程:《{title}》" in list(map(lambda x: x['text'], haveLearned['data'])): + print(f'{title} 成功完成学习') + return 1 + else: + print(f'完成{title}, 但未在已学习列表中找到, 请手动检查') + return 0 + +if __name__ == '__main__': + parser = argparse.ArgumentParser(description='Login script with captcha for multiple users.') + parser.add_argument('username', type=str, help='Username for login') + parser.add_argument('password', type=str, help='Password for login') + args = parser.parse_args() + study(args.username, args.password) \ No newline at end of file