Example #1
0
    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
Example #2
0
    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
Example #3
0
 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()
Example #4
0
 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
Example #5
0
 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
Example #6
0
 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
Example #7
0
    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"
Example #8
0
 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
Example #9
0
 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
Example #10
0
 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
Example #11
0
 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
Example #12
0
 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