diff --git a/党史.py b/党史.py new file mode 100644 index 0000000..7d51261 --- /dev/null +++ b/党史.py @@ -0,0 +1,215 @@ +import time +from requests import Session +from json import dumps +from hashlib import md5, sha1 +from random import randint, random +import hashids +from typing import Tuple + +# 用户信息设置 +device_info = '' # 设备信息,抓包抓到整段复制过来就行,不要编码后的 +user_id = # 用户id +team_num = "" # 团队号,如果加入了团队请额外填写此参数 +randSleepTime = 0 # 最长多少秒后提交本题答案[0:9],题目本身有读题时间(字数/10),不计算在内 +trueRate = 100.0 # 正确率,取值范围[0:1] + + +# 以下勿动 +def sign(data: dict) -> dict: + keys = list(data.keys()) + keys.sort() + s_data = "&".join([f'{key}={data[key]}' for key in keys]) + sign = sha1(f'{md5(s_data.encode()).hexdigest()}lanzu@123'.encode()).hexdigest() + data['sign'] = sign + return data + +appletVersion = "2.1.0" +appletVercode = 18 +ss = Session() +ss.headers['User-Agent'] = 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36 MicroMessenger/7.0.9.501 NetType/WIFI MiniProgramEnv/Windows WindowsWechat' +ss.headers['Accept'] = 'application/json' +ss.headers['Referer'] = f'https://servicewechat.com/wx6e24c691f9a50e44/{appletVercode}/page-frame.html' +ss.headers['Authorization'] = 'Bearer 0' +preScore = [80, 80, 80, 80, 150] +h = hashids.Hashids(salt="leadfyy!gogogo") + + +def update_info() -> int: + ret = ss.post( + url="https://xds.guanhaihk.com/api/updateInfo", + data=sign( + { + "version": appletVersion, + "create_page": "pages/index/index", + "timestamp": int(time.time()), + "rand": randint(0, 1000000), + "user_id": user_id, + "platform": "wxmini", + "device_info": device_info + } + ) + ).json() + assert ret['code'] == 0 and ret['msg'] == 'success' + return True + + +def choose_user() -> int: + ret = ss.post( + url="https://xds.guanhaihk.com/api/game/choose_user", + data=sign( + { + "user_id": user_id, + "create_page": "pages/pvp/pvp", + "timestamp": int(time.time()), + "rand": randint(0, 1000000), + "platform": "wxmini", + "version": appletVersion, + "device_info": device_info + } + ) + ).json() + assert ret['code'] == 0 and ret['msg'] == 'success' + return ret['data']['pk_user']['id'] + + +def start(pk_user_id) -> Tuple[int, list, list, list, list]: + ret = ss.post( + url="https://xds.guanhaihk.com/api/game/start", + data=sign( + { + "type":"rank_user", + "pk_user_id": pk_user_id, + "enter_type": "not_rank_quanzi", + "create_page": "pages/answer/answer", + "timestamp": int(time.time()), + "rand": randint(0, 1000000), + "user_id": user_id, + "platform": "wxmini", + "version": appletVersion, + "device_info": device_info, + "_enter_type": "not_rank_quanzi", + "_pk_user_id": pk_user_id, + "_type": "rank_user" + } + ) + ).json() + assert ret['code'] == 0 and ret['msg'] == 'success' + question_idsList = [] + sleeptime = [] + answer_idsList = [] + canTrueList = [] + for q in ret['data']['questions']: + question_idsList.append(q['id']) + sleeptime.append(len(q['content']) // 10) + canTrue = random() < trueRate + canTrueList.append(canTrue) + answer = None + if canTrue: + for o in q['options']: + if h.decode(o['is_answer'])[2] == 1: + answer = o['id'] + break + else: + o = q['options'][randint(0, len(q['options']) - 1)] + while h.decode(o['is_answer'])[2] == 1: + o = q['options'][randint(0, len(q['options'])-1)] + answer = o['id'] + answer_idsList.append(answer) + return ret['data']['pk_datas']['pk_info']['score'], question_idsList, sleeptime, answer_idsList, canTrueList + + +def submit(pk_user_id, question_id, answer_id, is_right, score, rightCount) -> bool: + ret = ss.post( + url="https://xds.guanhaihk.com/api/wrongQuestion/submit", + data=sign( + { + "user_id": user_id, + "question_id": question_id, + "is_right": is_right, + "score": score, + "rightCount": rightCount, + "type": "rank_user", + "answer_id": answer_id, + "create_page": "pages/answer/answer", + "timestamp": int(time.time()), + "rand": randint(0, 1000000), + "platform": "wxmini", + "version": appletVersion, + "device_info": device_info, + "enter_type": "not_rank_quanzi", + "pk_user_id": pk_user_id, + "_type": "rank_user" + } + ) + ).json() + return ret['code'] == 0 and ret['msg'] == '记录成功' + + +def submit_all(question_ids, times, score, score_ids, experience, is_win, answer_ids, right_counts) -> Tuple[str, int, int, int]: + ret = ss.post( + url="https://xds.guanhaihk.com/api/answer/submit_all", + data=sign( + { + "question_ids": question_ids, + "times": times, + "score": score, + "score_ids": score_ids, + "experience": experience, + "is_win": is_win, + "answer_ids": answer_ids, + "right_counts": right_counts, + "user_id": user_id, + "team_num": team_num, + "type": "rank_user", + "enter_type": "not_rank_quanzi", + "create_page": "packageA/pages/closing/closing", + "timestamp": int(time.time()), + "rand": randint(0, 1000000), + "platform": "wxmini", + "version": appletVersion, + "device_info": device_info, + "_enter_type": "not_rank_quanzi" + } + ) + ).json() + assert ret['code'] == 0 and ret['msg'] == '提交完成' + return ret['data']['user']['expInfo']['name'], ret['data']['user']['expInfo']['lever'], ret['data']['user']['experience'], ret['data']['user']['expInfo']['next_min_score'] + +if __name__ == '__main__': + update_info() + while True: + m_pk_user_id = choose_user() + print("获取到对手", end=" ") + m_pk_score, m_question_idsList, m_sleeptime, m_answer_idsList, m_canTrueList = start(m_pk_user_id) + print("获取到题目", end=" ") + m_timesList = [] + m_score = 0 + m_score_idsList = [] + m_right_counts = 0 + for x, m_id, m_ans, m_st, m_ct in zip(range(5), m_question_idsList, m_answer_idsList, m_sleeptime, m_canTrueList): + m_usetime = randint(0, randSleepTime) + m_timesList.append(m_usetime) + m_sc = int(preScore[x] * (10 - m_usetime) / 10) + if m_ct: + m_right_counts += 1 + else: + m_sc = 0 + m_right_counts = 100 # 这个是连续答对次数 + m_score += m_sc + m_score_idsList.append(m_sc) + time.sleep(m_st + m_usetime) + assert submit(m_pk_user_id, m_id, m_ans, 1 if m_ct else 0, m_score, m_right_counts) + print(f"已答第{x+1}题", end=" ") + m_question_ids = ",".join([str(i) for i in m_question_idsList]) + m_answer_ids = ",".join([str(i) for i in m_answer_idsList]) + m_times = ",".join([str(i) for i in m_timesList]) + m_score_ids = ",".join([str(i) for i in m_score_idsList]) + if m_score >= m_pk_score: + m_is_win = 1 + m_experience = int(m_score * 0.1 + max(0, m_right_counts - 1) + 5) + else: + m_is_win = 0 + m_experience = max(int(m_score * 0.1 + max(0, m_right_counts - 1) - 5), 0) + level, lever, exp, nextexp = submit_all(m_question_ids, m_times, m_score, m_score_ids, m_experience, m_is_win, m_answer_ids, m_right_counts) + print(f"现在为{level} LV{lever}, 现有{exp}经验, 升级还需{nextexp - exp}经验") + time.sleep(2) \ No newline at end of file