def invite_friend(self, friend: Union[StuPerson, str]) -> FriendMsg: """邀请朋友 Args: friend (Union[StuPerson, str]): 用户id 或 StuPerson的实例 Returns: FriendMsg """ user_id = friend if isinstance(friend, StuPerson): user_id = friend.id r = self._session.get(Url.INVITE_FRIEND_URL, params={ "d": int(time.time()), "friendId": user_id, "isTwoWay": "true" }) if not r.ok: raise PageConnectionError(f"invite_friend中出错, 状态码为{r.status_code}") json_data = r.json() if json_data["result"] == "success": return FriendMsg.SUCCESS elif json_data["message"] == "已发送过邀请,等待对方答复": return FriendMsg.ALREADY else: return FriendMsg.UNDEFINED
def get_latest_exam(self) -> ExamInfo: """获取最新考试""" r = self._session.get(Url.GET_RECENT_EXAM_URL, headers=self.__get_auth_header()) if not r.ok: raise PageConnectionError( f"get_latest_exam中出错, 状态码为{r.status_code}") try: json_data = r.json()["result"] exam_info_data = json_data["examInfo"] subjects = ExtendedList() for subject_data in exam_info_data["subjectScores"]: subjects.append( Subject(id=subject_data["topicSetId"], name=subject_data["subjectName"], code=subject_data["subjectCode"])) exam_info = ExamInfo(id=exam_info_data["examId"], name=exam_info_data["examName"], subjects=subjects, classId=exam_info_data["classId"], grade_code=json_data["gradeCode"], is_final=exam_info_data["isFinal"]) exam_info.create_time = exam_info_data["examCreateDateTime"] except (JSONDecodeError, KeyError) as e: raise PageInformationError( f"get_latest_exam中网页内容发生改变, 错误为{e}, 内容为\n{r.text}") return exam_info
def __get_auth_header(self) -> dict: """获取header""" auth_guid = str(uuid.uuid4()) auth_time_stamp = str(int(time.time() * 1000)) auth_token = _md5_encode(auth_guid + auth_time_stamp + "iflytek!@#123student") token, cur_time = self.token_timestamp if token and time.time() - cur_time < 600: # 判断token是否过期 return { "authbizcode": "0001", "authguid": auth_guid, "authtimestamp": auth_time_stamp, "authtoken": auth_token, "XToken": token } r = self._session.get(Url.XTOKEN_URL, headers={ "authbizcode": "0001", "authguid": auth_guid, "authtimestamp": auth_time_stamp, "authtoken": auth_token }) if not r.ok: raise PageConnectionError( f"__get_auth_header中出错, 状态码为{r.status_code}") try: if r.json()["errorCode"] != 0: raise PageInformationError( f"__get_auth_header出错, 错误信息为{r.json()['errorInfo']}") self.token_timestamp[0] = r.json()["result"] except (JSONDecodeError, KeyError) as e: raise PageInformationError( f"__get_auth_header中网页内容发生改变, 错误为{e}, 内容为\n{r.text}") self.token_timestamp[1] = time.time() return self.__get_auth_header()
def get_friends(self) -> ExtendedList[StuPerson]: """获取朋友列表""" friends = StuPersonList() r = self._session.get(Url.GET_FRIEND_URL, params={"d": int(time.time())}) if not r.ok: raise PageConnectionError(f"get_friends中出错, 状态码为{r.status_code}") try: json_data = r.json() for friend in json_data["friendList"]: friends.append( StuPerson(name=friend["friendName"], id=friend["friendId"])) except (JSONDecodeError, KeyError) as e: raise PageInformationError( f"get_friends中网页内容发生改变, 错误为{e}, 内容为\n{r.text}") return friends
def __get_self_mark(self, exam: Exam, has_total_score: bool) -> Mark: mark = Mark(exam=exam, person=self) r = self._session.get(Url.GET_MARK_URL, params={"examId": exam.id}, headers=self.__get_auth_header()) if not r.ok: raise PageConnectionError( f"__get_self_mark中出错, 状态码为{r.status_code}") try: json_data = r.json() json_data = json_data["result"] # exam.name = json_data["total_score"]["examName"] # exam.id = json_data["total_score"]["examId"] for subject in json_data["paperList"]: subject_score = SubjectScore( score=subject["userScore"], subject=Subject(id=subject["paperId"], name=subject["subjectName"], code=subject["subjectCode"], standard_score=subject["standardScore"], exam=exam), person=StuPerson()) # subject_score.create_time = 0 mark.append(subject_score) total_score = json_data.get("totalScore") if has_total_score and total_score: subject_score = SubjectScore( score=total_score["userScore"], subject=Subject( id="", name=total_score["subjectName"], code="99", standard_score=total_score["standardScore"], exam=exam, ), person=StuPerson(), class_extraRank=ExtraRank(rank=exam.class_rank), grade_extraRank=ExtraRank(rank=exam.grade_rank)) # subject_score.create_time = 0 mark.append(subject_score) except (JSONDecodeError, KeyError) as e: raise PageInformationError( f"__get_self_mark中网页内容发生改变, 错误为{e}, 内容为\n{r.text}") return mark
def get_clazzs(self) -> ExtendedList[StuClass]: """获取当前年级所有班级""" clazzs = ExtendedList() r = self._session.get(Url.GET_CLAZZS_URL, params={"d": int(time.time())}) if not r.ok: raise PageConnectionError(f"get_clazzs中出错, 状态码为{r.status_code}") try: json_data = r.json() for clazz in json_data["clazzs"]: clazzs.append( StuClass(name=clazz["name"], id=clazz["id"], grade=self.clazz.grade, school=self.clazz.school)) except (JSONDecodeError, KeyError) as e: raise PageInformationError( f"get_clazzs中网页内容发生改变, 错误为{e}, 内容为\n{r.text}") return clazzs
def remove_friend(self, friend: Union[StuPerson, str]) -> bool: """删除朋友 Args: friend (Union[StuPerson, str]): 用户id 或 StuPerson的实例 Returns: bool: True 表示删除成功, False 表示删除失败 """ user_id = friend if isinstance(friend, StuPerson): user_id = friend.id r = self._session.get(Url.DELETE_FRIEND_URL, params={ "d": int(time.time()), "friendId": user_id }) if not r.ok: raise PageConnectionError(f"remove_friend中出错, 状态码为{r.status_code}") return r.json()["result"] == "success"
def __get_original(self, subject_id: str, exam_id: str) -> ExtendedList[str]: r = self._session.get(Url.GET_ORIGINAL_URL, params={ "examId": exam_id, "paperId": subject_id, }, headers=self.__get_auth_header()) if not r.ok: raise PageConnectionError( f"__get_original中出错, 状态码为{r.status_code}") try: json_data = r.json() image_urls = ExtendedList() for image_url in json.loads(json_data["result"]["sheetImages"]): image_urls.append(image_url) except (JSONDecodeError, KeyError) as e: raise PageInformationError( f"__get_original中网页内容发生改变, 错误为{e}, 内容为\n{r.text}") return image_urls
def __get_subjects(self, exam: Exam) -> ExtendedList[Subject]: subjects = ExtendedList() r = self._session.get(Url.GET_SUBJECT_URL, params={"examId": exam.id}, headers=self.__get_auth_header()) if not r.ok: raise PageConnectionError( f"__get_subjects中出错, 状态码为{r.status_code}") try: json_data = r.json() for subject in json_data["result"]["paperList"]: subjects.append( Subject(id=subject["paperId"], name=subject["subjectName"], code=subject["subjectCode"], standard_score=subject["standardScore"], exam=exam)) except (JSONDecodeError, KeyError) as e: raise PageInformationError( f"__get_subjects中网页内容发生改变, 错误为{e}, 内容为\n{r.text}") return subjects
def set_base_info(self): """设置账户基本信息, 如用户id, 姓名, 学校等""" r = self._session.get(Url.INFO_URL) if not r.ok: raise PageConnectionError(f"set_base_info出错, 状态码为{r.status_code}") try: json_data = r.json()["student"] if not json_data.get("clazz", False): raise UserDefunctError() self.code = json_data.get("code") self.name = json_data.get("name") self.avatar = json_data.get("avatar") self.gender = Sex.BOY if json_data.get( "gender") == "1" else Sex.GIRL self.username = json_data.get("loginName") self.id = json_data.get("id") self.mobile = json_data.get("mobile") self.email = json_data.get("email") self.qq_number = json_data.get("im") self.clazz = StuClass( id=json_data["clazz"]["id"], name=json_data["clazz"]["name"], school=School( id=json_data["clazz"]["division"]["school"]["id"], name=json_data["clazz"]["division"]["school"]["name"]), grade=Grade( code=json_data["clazz"]["division"]["grade"]["code"], name=json_data["clazz"]["division"]["grade"]["name"], phase=Phase(code=json_data["clazz"]["division"]["grade"] ["phase"]["code"], name=json_data["clazz"]["division"]["grade"] ["phase"]["name"]))) self.birthday = json_data.get("birthday", 0) except (JSONDecodeError, KeyError) as e: raise PageInformationError( f"set_base_info中网页内容发生改变, 错误为{e}, 内容为\n{r.text}") return self
def __get_classmates(self, clazz_id: str) -> ExtendedList[StuPerson]: classmates = StuPersonList() r = self._session.get(Url.GET_CLASSMATES_URL, params={ "r": f"{self.id}student", "clazzId": clazz_id }) if not r.ok: raise PageConnectionError( f"__get_classmates中出错, 状态码为{r.status_code}") try: json_data = r.json() for classmate_data in json_data: birthday = int(int(classmate_data.get("birthday", 0)) / 1000) classmate = StuPerson( name=classmate_data["name"], id=classmate_data["id"], clazz=StuClass( id=classmate_data["clazz"]["id"], name=classmate_data["clazz"]["name"], grade=self.clazz.grade, school=School( id=classmate_data["clazz"]["school"]["id"], name=classmate_data["clazz"]["school"]["name"])), code=classmate_data.get("code"), email=classmate_data["email"], qq_number=classmate_data["im"], gender=Sex.BOY if classmate_data["gender"] == "1" else Sex.GIRL, mobile=classmate_data["mobile"]) classmate.birthday = birthday classmates.append(classmate) except (JSONDecodeError, KeyError) as e: raise PageInformationError( f"__get_classmates中网页内容发生改变, 错误为{e}, 内容为\n{r.text}") return classmates
def __get_page_exam(self, page_index: int) -> Tuple[ExtendedList[Exam], bool]: """获取指定页数的考试列表""" exams: ExtendedList[Exam] = ExtendedList() r = self._session.get(Url.GET_EXAM_URL, params={ "pageIndex": page_index, "pageSize": 10 }, headers=self.__get_auth_header()) if not r.ok: raise PageConnectionError( f"__get_page_exam中出错, 状态码为{r.status_code}") try: json_data = r.json()["result"] for exam_data in json_data["examList"]: exam = Exam(id=exam_data["examId"], name=exam_data["examName"]) exam.create_time = exam_data["examCreateDateTime"] exams.append(exam) hasNextPage: bool = json_data["hasNextPage"] except (JSONDecodeError, KeyError) as e: raise PageInformationError( f"__get_page_exam中网页内容发生改变, 错误为{e}, 内容为\n{r.text}") return exams, hasNextPage