扩展原有库
当你觉得zhixueang
库有不足之处时,你可以按照如下步骤来轻松扩展它。
提示
本文内容将分成2个部分,1.0.X
以上版本和1.0.X
版本,因为这两个版本有些不同。
节标题如果有版本,则表示该节是某个版本独有的。
我们推荐升级到1.1.X,这样可以减少很多不必要的麻烦。
前置
先添加一个python
文件,作为你的源代码存储的地方。
本文里我们以testfunc.py
作为文件名。
testfunc.py
内容:
from zhixuewang.zxw import get_session
import requests
import json
from zhixuewang.urls import Url
import uuid
from zhixuewang.student.student import _md5_encode
import time
from json import JSONDecodeError
Session
可以简单的理解为智学网的登录信息,携带用户Session,就可以免于智学网的登录。
(1.0.X)重写Session
在1.0.X
版本内,Session并未被共享。
所以你需要先手动复制如下代码,来重写Session
class override_session:
token_timestamp = ["", 0]
# 将下面的username,password修改为你的智学网账号密码
_session = get_session("username", "password")
username = ""
# role = "student"
def get_session(self, username: str, password: str, _type: str = "auto") -> requests.Session:
"""通过用户名和密码获取session
默认可支持zx和zxt开头的账号, 准考证号以及手机号
可通过改变type为id来支持使用用户id
Args:
username (str): 用户名, 可以为准考证号, 手机号, id
password (str): 密码
_type (str): 登录方式, 为id时表示用id登录, 为auto时表示自动选择登录方式
Raises:
UserOrPassError: 用户名或密码错误
UserNotFoundError: 未找到用户
LoginError: 登录错误
Returns:
requests.session:
"""
session = requests.Session()
session.headers[
"User-Agent"] = "Mozilla/5.0 (Windows NT 6.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1"
r = session.get(Url.SSO_URL)
msg = r.text
json_obj = json.loads(msg.strip().replace("\\", "").replace("'", "")[1:-1])
if json_obj["code"] != 1000:
return
lt = json_obj["data"]["lt"]
execution = json_obj["data"]["execution"]
r = session.get(Url.SSO_URL,
params={
"encode": "false",
"sourceappname": "tkyh,tkyh",
"_eventId": "submit",
"appid": "zx-container-client",
"client": "web",
"type": "loginByNormal",
"key": _type,
"lt": lt,
"execution": execution,
"customLogoutUrl": "https://www.zhixue.com/login.html",
"username": username,
"password": password
})
msg = r.text
json_obj = json.loads(msg.strip().replace("\\", "").replace("'", "")[1:-1])
if json_obj["code"] != 1001:
if json_obj["code"] == 1002: # password error
return
if json_obj["code"] == 2009: # user notfound
return
return
ticket = json_obj["data"]["st"]
session.post(Url.SERVICE_URL, data={
"action": "login",
"ticket": ticket,
})
return session
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:
return
try:
if r.json()["errorCode"] != 0:
return
self.token_timestamp[0] = r.json()["result"]
except (JSONDecodeError, KeyError) as e:
return
self.token_timestamp[1] = time.time()
return self.get_auth_header()
信息
你应当修改上方代码的高亮行,而不是直接Ctrl
+C
Ctrl
+V
修改完成后,新建一个函数,例如下方代码:
def test_func():
__a = override_session()
session = requests.Session()
# 当然,如果要修改用户可以这么写
session = __a.get_session(stuName, stuPwd)
# Todo something...
此时便可以在下方进行你的逻辑操作了,比如
session.get()
(1.1.X)继承Session
在1.1.X
及以上版本内,Session是共享的。
所以相比于1.0.X
,1.1.X
版本更加方便。
代码如下所示:
def test_func(account: TeacherAccount):
session = account.get_session()
# Todo something...
此时便可以在下方进行你的逻辑操作了,比如
session.get()
(1.1.X)获取Token
可以通过get_token
函数获得智学网的token
。
代码如下所示:
def test_func(account: TeacherAccount):
session = account.get_token()
# Todo something...