def login(self, headers=None) -> requests.Response: def _get_session(): session = requests.Session() session.headers.update({ "Accept": str(config["headers"]["Accept"]), "Connection": str(config["headers"]["Connection"]), "User-Agent": str(config["headers"]["User-Agent"]), "Accept-Encoding": str(config["headers"]["Accept-Encoding"]), "Accept-Language": str(config["headers"]["Accept-Language"]), "Upgrade-Insecure-Requests": str(config["headers"]["Upgrade-Insecure-Requests"]), }) return session def _login(student): session = _get_session() payload = { "Sel_Type": "STU", "__VIEWSTATE": student.vs, "__VIEWSTATEGENERATOR": student.vsg, "aerererdsdxcxdfgfg": "", "efdfdfuuyyuuckjg": student.__encrypt_passwd(), "pcInfo": "", "txt_dsdfdfgfouyy": "", "txt_dsdsdsdjkjkjc": student.username, "txt_ysdsdsdskgf": "", "typeName": "", } response = session.post( student.base_url + "/_data/index_login.aspx", data=payload, headers=headers, proxies=student.proxies, ) if "账号或密码不正确!请重新输入。" in response.text: raise ValidationError("账号或密码不正确!请重新输入。") return response, session res, s = _login(self) while res.status_code != 200 and config["behavior"]["unlimited_retry"]: log( f"Get code-{res.status_code} when trying to login, retrying...", error=True, ) res, s = _login(self) self.session = s reset_error_count() return res
def post(self, url, data=None, headers=None) -> requests.Response: """ Note: Any dictionaries that you pass to a request method will be merged with the session-level values that are set. The method-level parameters override session parameters. """ res = self.session.post(self.base_url + url, data=data, headers=headers) while res.status_code != 200 and config["behavior"]["unlimited_retry"]: log( f"Get code-{res.status_code} when post to {url}, retrying...", error=True, ) res = self.session.post(self.base_url + url, data=data, headers=headers) reset_error_count() return res
def get(self, url, params=None, headers=None) -> requests.Response: """ Note: Any dictionaries that you pass to a request method will be merged with the session-level values that are set. The method-level parameters override session parameters. """ res = self.session.get(self.base_url + url, params=params, headers=headers) try: dsafeid = re.findall("DSafeId=.+?;", res.text)[0][8:-1] except IndexError: pass else: # Add the cookie to current session cookie_obj = requests.cookies.create_cookie( domain=config["network"]["host"], name="DSafeId", value=dsafeid) self.session.cookies.set_cookie(cookie_obj) # Waiting for 0.68s. This is MANDATORY. time.sleep(0.68) # Then Get again. The real website is revealed. res = self.session.get(self.base_url + url, params=params, headers=headers) while res.status_code != 200 and config["behavior"]["unlimited_retry"]: log( f"Get code-{res.status_code} when post to {url}, retrying...", error=True, ) res = self.session.get(self.base_url + url, params=params, headers=headers) reset_error_count() return res
def login(self, headers=None) -> requests.Response: def _get_session(): session = requests.Session() session.headers.update({ "Accept": str(config["headers"]["Accept"]), "Connection": str(config["headers"]["Connection"]), "User-Agent": str(config["headers"]["User-Agent"]), "Accept-Encoding": str(config["headers"]["Accept-Encoding"]), "Accept-Language": str(config["headers"]["Accept-Language"]), "Upgrade-Insecure-Requests": str(config["headers"]["Upgrade-Insecure-Requests"]), }) return session def _login(student): session = _get_session() payload = { "Sel_Type": "STU", "__VIEWSTATE": student.vs, "__VIEWSTATEGENERATOR": student.vsg, "aerererdsdxcxdfgfg": "", "efdfdfuuyyuuckjg": student.__encrypt_passwd(), "pcInfo": "", "txt_dsdfdfgfouyy": "", "txt_dsdsdsdjkjkjc": student.username, "txt_ysdsdsdskgf": "", "typeName": "", } response = session.post( student.base_url + "/_data/index_login.aspx", data=payload, headers=headers, proxies=student.proxies, ) span = BS(response.content, features="lxml").find("span", id="divLogNote") if span is None: if "alert('您尚未报到注册成功,请到学院咨询并办理相关手续!" in response.text: raise ValidationError("此帐号尚未注册成功") else: raise ValidationError("意料之外的登陆返回页面") else: if "正在加载权限数据" in span.text: return response, session else: raise ValidationError(span.text) res, s = _login(self) while res.status_code != 200 and config["behavior"]["unlimited_retry"]: log( f"Get code-{res.status_code} when trying to login, retrying...", error=True, ) res, s = _login(self) self.session = s reset_error_count() return res