Skip to main content

扩展原有库

当你觉得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.X1.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...