async def choose_word(course_id: str, task_id: int, task_type: int) -> bool: is_show = not settings.is_multiple_chapter time_out = settings.timeout _logger.i("需要选词", is_show=is_show) res = await requests.get( url=f'https://gateway.vocabgo.com/Student/ClassTask/ChoseWordList?task_id={task_id}' f'&task_type={task_type}×tamp={Tool.time()}&versions={CDR_VERSION}', headers=settings.header, timeout=time_out) json_data = await res.json() res.close() if json_data["code"] == 0 and json_data["msg"].find("开通权限") != -1: raise NoPermission(json_data["msg"]) word_map = {} for word in json_data['data']['word_list']: if word['score'] != 10: tem_str = course_id + ':' + word["list_id"] if word_map.get(tem_str) is None: word_map[tem_str] = [] word_map[tem_str].append(word['word']) if len(word_map) == 0: _logger.i("当前学习任务已完成", is_show=is_show) return True _logger.i(word_map, is_show=False) tem_i = 0 tem_len = 0 for k in word_map: tem_len += len(word_map[k]) while tem_len < 5: tem_o = json_data['data']['word_list'][tem_i] tem_str = course_id + ':' + tem_o["list_id"] if tem_o['word'] not in word_map[tem_str]: if word_map.get(tem_str) is None: word_map[tem_str] = [] word_map[tem_str].append(tem_o['word']) _logger.i(f"单词复选:{tem_o['word']}", is_show=False) tem_i = tem_i + 1 tem_len = 0 for k in word_map: tem_len += len(word_map[k]) _logger.i(word_map, is_show=False) timestamp = Tool.time() sign = Tool.md5(f'task_id={task_id}×tamp={timestamp}&versions={CDR_VERSION}&word_map=' + json.dumps(word_map, separators=(',', ':')).replace("'", '"') + 'ajfajfamsnfaflfasakljdlalkflak') data = { "task_id": task_id, "word_map": word_map, "timestamp": timestamp, "versions": CDR_VERSION, "sign": sign } res = await requests.post( url='https://gateway.vocabgo.com/Student/ClassTask/SubmitChoseWord', headers=settings.header, json=data, timeout=time_out) _logger.i(await res.json(), is_show=False) res.close() _logger.i("选词完毕!", is_show=is_show) return False
async def skip_learn_task(topic_code: str): is_show = not settings.is_multiple_chapter # 模拟加载流程 _logger.i("正在跳过学习任务的学习阶段", is_show=is_show) timestamp = Tool.time() time_spent = 0 sign = Tool.md5(f"time_spent={time_spent}×tamp={timestamp}&topic_code={topic_code}" f"&versions={CDR_VERSION}ajfajfamsnfaflfasakljdlalkflak") data = { "topic_code": topic_code, "time_spent": time_spent, "timestamp": timestamp, "versions": CDR_VERSION, "sign": sign } res = await requests.post( url='https://gateway.vocabgo.com/Student/ClassTask/SubmitAnswerAndSave', json=data, headers=settings.header, timeout=settings.timeout) json_data = await res.json() res.close() await asyncio.sleep(1) # 流程模拟结束 timestamp = Tool.time() sign = Tool.md5(f"timestamp={timestamp}&topic_code={json_data['data']['topic_code']}" f"&versions={CDR_VERSION}ajfajfamsnfaflfasakljdlalkflak") data = { "topic_code": json_data['data']['topic_code'], "timestamp": timestamp, "versions": CDR_VERSION, "sign": sign } res = await requests.post( url='https://gateway.vocabgo.com/Student/ClassTask/SkipNowTopicMode', json=data, headers=settings.header, timeout=settings.timeout) json_data = await res.json() res.close() return json_data
async def verify_answer(self, answer: str, topic_code: str, type_mode: str, task_id: int): timestamp = Tool.time() sign = Tool.md5( f"answer={answer}×tamp={timestamp}&topic_code={topic_code}" + f"&versions={CDR_VERSION}ajfajfamsnfaflfasakljdlalkflak") data = { "answer": answer, "topic_code": topic_code, "timestamp": timestamp, "versions": CDR_VERSION, "sign": sign } res = await requests.post( url=f'https://gateway.vocabgo.com/Student/{type_mode}/VerifyAnswer', json=data, headers=settings.header, timeout=settings.timeout) json_data = await res.json() res.close() if json_data["code"] == 21006: await self.verify_human(task_id) data["timestamp"] = Tool.time() res = await requests.post( url= f'https://gateway.vocabgo.com/Student/{type_mode}/VerifyAnswer', json=data, headers=settings.header, params=data, timeout=settings.timeout) json_data = await res.json() res.close() if json_data['code'] == 10017: _logger.w(f"\n{json_data['msg']}") _logger.w("该限制为词达人官方行为,与作者无关\n按回车退出程序") input() sys.exit(0) if json_data['data']["answer_result"] == 1: pass else: _logger.w(json_data, is_show=False) raise AnswerWrong(data, json_data['data']['topic_code'], json_data['data']["over_status"] != 1) return json_data['data'][ 'topic_code'], json_data['data']["over_status"] != 1
async def skip_answer(topic_code: str, topic_mode: int, type_mode: str) -> dict: time_spent = CDRTask.get_random_time(topic_mode, is_max=True) timestamp = Tool.time() sign = Tool.md5( f"time_spent={time_spent}×tamp={timestamp}&topic_code={topic_code}" + f"&versions={CDR_VERSION}ajfajfamsnfaflfasakljdlalkflak") data = { "topic_code": topic_code, "time_spent": time_spent, "timestamp": timestamp, "versions": CDR_VERSION, "sign": sign } res = await requests.post( url=f'https://gateway.vocabgo.com/Student/{type_mode}/SkipAnswer', json=data, headers=settings.header, timeout=settings.timeout) json = await res.json() res.close() return json
def do_homework(): Login() URL.load_main() # 模拟加载流程 requests.options("https://app.vocabgo.com/student/", headers=settings.header).close() res = requests.get( "https://gateway.vocabgo.com/Student/Main?timestamp=" f"{Tool.time()}&versions={CDR_VERSION}", headers=settings.header) json = res.json()["data"] res.close() # 模拟加载流程 requests.get( "https://gateway.vocabgo.com/Student/Contest/List?timestamp=" f"{Tool.time()}&versions={CDR_VERSION}", headers=settings.header).close() timestamp = Tool.time() sign = Tool.md5( f'return_url=https%3A%2F%2Fapp.vocabgo.com%2Foverall%2F×tamp={timestamp}' f'&versions={CDR_VERSION}ajfajfamsnfaflfasakljdlalkflak') data = { "return_url": "https%3A%2F%2Fapp.vocabgo.com%2Foverall%2F", "timestamp": timestamp, "versions": CDR_VERSION, "sign": sign } res = requests.post(url='https://gateway.vocabgo.com/Auth/Wechat/Config', headers=settings.header, json=data) _logger.i("WechatConfig:") _logger.i(res.content.decode("utf8")) res.close() time.sleep(1) # 信息显示 Tool.cls() loop = asyncio.get_event_loop() while True: if json['user_info'].get('class_name') is None: _logger.v(f"\n{json['user_info']['student_name']}(未加入班级)\n") else: _logger.v( f"\n{json['user_info']['student_name']}({json['user_info']['class_name']})\n" ) _logger.v("1.班级任务\n2.自选任务\n3.删除本地授权信息(可更换账号刷题)" "\n4.打开配置文件(关闭后将自动重载配置文件,记得保存)" "\n\n#.加群1085739587免费获取最新版,更少的BUG、更高的准确率\n\n0.退出\n") settings.save() choose = input("请输入序号:") if choose == "1": _logger.i("正在加载任务列表中,请稍等......") loop.run_until_complete(ClassTask().run()) Tool.cls() elif choose == "2": _logger.i("正在加载任务列表中,请稍等......") URL.load_myself_task_list() loop.run_until_complete( MyselfTask(json['user_info']['course_id']).run()) Tool.cls() elif choose == "3": settings.user_token = "" settings.save() Login() Tool.cls() elif choose == "4": os.system(f'notepad {CONFIG_DIR_PATH + "config.txt"}') settings.reload() Tool.cls() elif choose == "0": aiorequset.close_session() sys.exit(0) else: Tool.cls() _logger.i("输入格式有误!\n") res = requests.get( "https://gateway.vocabgo.com/Student/Main?timestamp=" f"{Tool.time()}&versions={CDR_VERSION}", headers=settings.header) json = res.json()["data"] res.close()
def _generate_qr_code(): user_agent = settings.user_agent user_token = settings.user_token now_time = Tool.time() # 获取13位时间戳 # 生成token pass_list = 'abcde0123456789' for _ in range(0, 32): index = random.randint(0, len(pass_list) - 1) user_token += pass_list[index] user_token = Tool.md5(f"{user_token}{Tool.time()}") # 生成token认证连接 sign = Tool.md5( f'auth_type=1&return_url=https://app.vocabgo.com/overall/#/student/home×tamp={now_time}' + f'&user_token={user_token}&versions={CDR_VERSION}ajfajfamsnfaflfasakljdlalkflak' ) data = { "return_url": "https://app.vocabgo.com/overall/#/student/home", "auth_type": 1, "user_token": user_token, "timestamp": now_time, "versions": CDR_VERSION, "sign": sign } headers = { 'Content-Type': 'application/json;charset=UTF-8', 'Host': 'app.vocabgo.com', 'Origin': 'https://app.vocabgo.com', 'Referer': 'https://app.vocabgo.com/', 'User-Agent': user_agent, # TODO 似乎是md5值,回头随机一个测试康康 # 'X-DevTools-Emulate-Network-Conditions-Client-Id': 'D9886F0A0D37C25B2E9998FEC289C919', 'X-DevTools-Emulate-Network-Conditions-Client-Id': Tool.md5(user_agent).upper(), 'X-Requested-With': 'XMLHttpRequest' } _logger.i( f'https://gateway.vocabgo.com/Auth/Thirdpart/Authorize?{data}') res = requests.post( url='https://gateway.vocabgo.com/Auth/Thirdpart/Authorize', headers=headers, json=data) json_str1 = res.json() res.close() login_url = json_str1['data']['redirect_url'] _logger.i("user_token:" + user_token) settings.user_token = user_token qr = qrcode.QRCode(version=2, error_correction=qrcode.constants.ERROR_CORRECT_L, box_size=3, border=1) # 设置二维码的大小 qr.add_data(login_url) qr.make(fit=True) img = qr.make_image() _logger.i("二维码已生成,将自动展示,请使用微信扫一扫进行词达人授权。成功后请关闭图片查看程序,若无法自动展示,用户可在" "“main目录\\config目录”下找到“授权二维码.jpg,自行打开照片进行扫码授权”") img.save(f"{CONFIG_DIR_PATH}授权二维码.jpg") img.show() # 显示图片
async def find_answer_and_finish(self, answer: Answer, data: dict, type_id: int, task_id: int) -> dict: is_show = not settings.is_multiple_chapter type_mode = ["StudyTask", "ClassTask"] content = data["stem"]["content"] remark = data["stem"]["remark"] topic_mode = data["topic_mode"] if topic_mode == 31: _logger.v(f"[mode:{topic_mode}]{str(content)}", end='', is_show=is_show) else: _logger.v(f"[mode:{topic_mode}]{content}({remark})", end='', is_show=is_show) topic_code = data["topic_code"] options = data["options"] time_spent = CDRTask.get_random_time(topic_mode, min_time=settings.min_random_time, max_time=settings.max_random_time) await asyncio.sleep(time_spent / 1000) # 根据获取到的答案与现行答案进行匹配 skip_times = 0 has_chance = True while has_chance: answer_id, is_skip = CDRTask.task_find_answer( answer, topic_mode, content, remark, options, skip_times) if is_skip: return await CDRTask.skip_answer(topic_code, topic_mode, type_mode[type_id]) # 答案验证 try: if topic_mode == 31: tem_list = answer_id for i in range(0, data["answer_num"]): answer_id = tem_list[i] topic_code, _ = await self.verify_answer( answer_id, topic_code, type_mode[type_id], task_id) if not settings.is_random_time: await asyncio.sleep(0.1) else: await asyncio.sleep( random.randint(3 * 1000, 5 * 1000) / 1000) has_chance = False else: topic_code, has_chance = await self.verify_answer( answer_id, topic_code, type_mode[type_id], task_id) except AnswerWrong as e: topic_code = e.topic_code if e.has_chance: skip_times += 1 _logger.w(e, is_show=False) _logger.w(f"第{skip_times}次查询答案出错,尝试跳过原答案进行搜索", is_show=False) continue _logger.v("") _logger.w("答案错误!") _logger.w(e) _logger.w("请携带error-last.txt寻找GM排除适配问题") _logger.w(f"你可以在“main{LOG_DIR_PATH[1:]}”下找到error-last.txt") _logger.create_error_txt() input("等待错误检查(按下回车键即可继续执行)") return await CDRTask.skip_answer(topic_code, topic_mode, type_mode[type_id]) else: has_chance = False _logger.v(" Done!", is_show=is_show) timestamp = Tool.time() sign = Tool.md5( f"time_spent={time_spent}×tamp={timestamp}&topic_code={topic_code}" + f"&versions={CDR_VERSION}ajfajfamsnfaflfasakljdlalkflak") data = { "topic_code": topic_code, "time_spent": time_spent, "timestamp": timestamp, "versions": CDR_VERSION, "sign": sign } res = await requests.post(url='https://gateway.vocabgo.com/Student/' + type_mode[type_id] + '/SubmitAnswerAndSave', json=data, headers=settings.header, timeout=settings.timeout) json_data = await res.json() res.close() if json_data["code"] == 21006: await self.verify_human(task_id) data["timestamp"] = Tool.time() res = await requests.post( url='https://gateway.vocabgo.com/Student/' + type_mode[type_id] + '/SubmitAnswerAndSave', json=data, headers=settings.header, timeout=settings.timeout) json_data = await res.json() res.close() # 请求模拟 # requests.post( # url='https://gateway.vocabgo.com/Student/Course/GetStudyWordInfo', # json=data, headers=settings.header, timeout=settings.timeout).close() return json_data
async def verify_human(self, task_id: int, check_type: str = "answer"): async with self._lock: data = { "check_type": check_type, "task_id": task_id, "versions": CDR_VERSION, } while True: data["timestamp"] = Tool.time() res = await requests.get( "https://gateway.vocabgo.com/Student/Captcha/Get", params=data, headers=settings.header, timeout=settings.timeout) json_data = await res.json() res.close() if json_data["code"] == 0 and json_data["msg"] == "无需验证": return elif json_data["code"] == 0: _logger.w(json_data["msg"]) _logger.w("词达人验证服务器暂时崩溃,请稍后再试") input() _logger.i("验证码即将展示,若看不清可输入-1重新生成") from cdr.utils import VerificationCode code = await VerificationCode.get_vc( json_data["data"]["original_image"], task_id) _logger.v(code) while code == "-1": res = await requests.get( "https://gateway.vocabgo.com/Student/Captcha/Get", params=data, headers=settings.header, timeout=settings.timeout) json_data = await res.json() res.close() if json_data["code"] == 0 and json_data["msg"] == "无需验证": return elif json_data["code"] == 0: _logger.v("") _logger.w(json_data["msg"]) _logger.w("词达人验证服务器暂时崩溃,请稍后再试") input("按回车重新尝试生成验证码") continue _logger.i("验证码即将展示,若看不清可输入-1重新生成") code = await VerificationCode.get_vc( json_data["data"]["original_image"], task_id) timestamp = Tool.time() sign = Tool.md5( f"captcha_code={code}&task_id={task_id}×tamp={timestamp}&versions={CDR_VERSION}" "ajfajfamsnfaflfasakljdlalkflak") data = { "captcha_code": code, "sign": sign, "task_id": task_id, "timestamp": timestamp, "versions": CDR_VERSION } res = await requests.post( "https://gateway.vocabgo.com/Student/Captcha/Check", json=data, headers=settings.header) flag = (await res.json())["code"] res.close() if flag != 1: _logger.i("验证码核验错误,将重新生成验证码")