hfut package

Submodules

hfut.exception module

exception hfut.exception.IPBanned[source]

Bases: hfut.exception.SystemLoginFailed

exception hfut.exception.SystemLoginFailed[source]

Bases: Exception

exception hfut.exception.ValidationError[source]

Bases: Exception

hfut.interface module

class hfut.interface.BaseInterface[source]

Bases: object

所有接口的类的基类, 所有的接口都必须继承这个类.

通过实现构造函数 __init__ 用来初始化 self.extra_kwargs 用于生成请求需要的额外参数, 必须在所有的实现前调用基类的方法.

所有的接口都要预定义 session_class , request_kwargs , send_kwargs 三个属性

所有的接口都要实现静态方法 parse 用来将响应解析为规格化的结果.

make_request()[source]
static parse(response)[source]
request_kwargs = NotImplemented
send_kwargs = NotImplemented
session_class = NotImplemented
class hfut.interface.GetSystemStatus[source]

Bases: hfut.interface.BaseInterface

static parse(response)[source]
request_kwargs = {'url': 'student/asp/s_welcome.asp', 'method': 'get'}
send_kwargs = {}
session_class = (<class 'hfut.session.BaseSession'>, <class 'hfut.session.StudentSession'>)
class hfut.interface.GetClassStudents(xqdm, kcdm, jxbh)[source]

Bases: hfut.interface.BaseInterface

static parse(response)[source]
request_kwargs = {'url': 'student/asp/Jxbmdcx_1.asp', 'method': 'get'}
send_kwargs = {}
session_class = (<class 'hfut.session.BaseSession'>, <class 'hfut.session.StudentSession'>)
class hfut.interface.GetClassInfo(xqdm, kcdm, jxbh)[source]

Bases: hfut.interface.BaseInterface

static parse(response)[source]
request_kwargs = {'url': 'student/asp/xqkb1_1.asp', 'method': 'get'}
send_kwargs = {}
session_class = (<class 'hfut.session.BaseSession'>, <class 'hfut.session.StudentSession'>)
class hfut.interface.SearchCourse(xqdm, kcdm=None, kcmc=None)[source]

Bases: hfut.interface.BaseInterface

static parse(response)[source]
request_kwargs = {'url': 'student/asp/xqkb1.asp', 'method': 'post'}
send_kwargs = {}
session_class = (<class 'hfut.session.BaseSession'>, <class 'hfut.session.StudentSession'>)
class hfut.interface.GetTeachingPlan(xqdm, kclx='b', zydm='')[source]

Bases: hfut.interface.BaseInterface

static parse(response)[source]
request_kwargs = {'url': 'student/asp/xqkb2.asp', 'method': 'post'}
send_kwargs = {}
session_class = (<class 'hfut.session.BaseSession'>, <class 'hfut.session.StudentSession'>)
class hfut.interface.GetTeacherInfo(jsh)[source]

Bases: hfut.interface.BaseInterface

static parse(response)[source]
request_kwargs = {'url': 'teacher/asp/teacher_info.asp', 'method': 'get'}
send_kwargs = {}
session_class = (<class 'hfut.session.BaseSession'>, <class 'hfut.session.StudentSession'>)
class hfut.interface.GetCourseClasses(kcdm)[source]

Bases: hfut.interface.BaseInterface

static parse(response)[source]
request_kwargs = {'url': 'student/asp/select_topRight_f3.asp', 'method': 'get'}
send_kwargs = {}
session_class = (<class 'hfut.session.BaseSession'>, <class 'hfut.session.StudentSession'>)
class hfut.interface.GetEntireCurriculum(xqdm=None)[source]

Bases: hfut.interface.BaseInterface

static parse(response)[source]
request_kwargs = {'url': 'teacher/asp/Jskb_table.asp', 'method': 'get'}
send_kwargs = {}
session_class = (<class 'hfut.session.BaseSession'>, <class 'hfut.session.StudentSession'>)
class hfut.interface.GetCode[source]

Bases: hfut.interface.BaseInterface

static parse(response)[source]
request_kwargs = {'url': 'student/asp/xqjh.asp', 'method': 'get'}
send_kwargs = {}
session_class

alias of StudentSession

class hfut.interface.GetMyInfo[source]

Bases: hfut.interface.BaseInterface

static parse(response)[source]
request_kwargs = {'url': 'student/asp/xsxxxxx.asp', 'method': 'get'}
send_kwargs = {}
session_class

alias of StudentSession

class hfut.interface.GetMyAchievements[source]

Bases: hfut.interface.BaseInterface

static parse(response)[source]
request_kwargs = {'url': 'student/asp/Select_Success.asp', 'method': 'get'}
send_kwargs = {}
session_class

alias of StudentSession

class hfut.interface.GetMyCurriculum[source]

Bases: hfut.interface.BaseInterface

static parse(response)[source]
request_kwargs = {'url': 'student/asp/grkb1.asp', 'method': 'get'}
send_kwargs = {}
session_class

alias of StudentSession

class hfut.interface.GetMyFees[source]

Bases: hfut.interface.BaseInterface

static parse(response)[source]
request_kwargs = {'url': 'student/asp/Xfsf_Count.asp', 'method': 'get'}
send_kwargs = {}
session_class

alias of StudentSession

class hfut.interface.ChangePassword(password, new_password)[source]

Bases: hfut.interface.BaseInterface

static parse(response)[source]
request_kwargs = {'url': 'student/asp/amend_password_jg.asp', 'method': 'post'}
send_kwargs = {}
session_class

alias of StudentSession

class hfut.interface.SetTelephone(tel)[source]

Bases: hfut.interface.BaseInterface

static parse(response)[source]
request_kwargs = {'url': 'student/asp/amend_tel.asp', 'method': 'post'}
send_kwargs = {}
session_class

alias of StudentSession

class hfut.interface.GetOptionalCourses(kclx='x')[source]

Bases: hfut.interface.BaseInterface

static parse(response)[source]
request_kwargs = {'url': 'student/asp/select_topLeft_f3.asp', 'method': 'get'}
send_kwargs = {'allow_redirects': False}
session_class

alias of StudentSession

class hfut.interface.GetSelectedCourses[source]

Bases: hfut.interface.BaseInterface

static parse(response)[source]
request_kwargs = {'url': 'student/asp/select_down_f3.asp', 'method': 'get'}
send_kwargs = {'allow_redirects': False}
session_class

alias of StudentSession

class hfut.interface.ChangeCourse(account, kcdms_data, jxbhs_data)[source]

Bases: hfut.interface.BaseInterface

static parse(response)[source]
request_kwargs = {'url': 'student/asp/selectKC_submit_f3.asp', 'method': 'post'}
send_kwargs = {'allow_redirects': False}
session_class

alias of StudentSession

class hfut.interface.GetUnfinishedEvaluation[source]

Bases: hfut.interface.BaseInterface

static parse(response)[source]
request_kwargs = {'url': 'student/asp/jxpglb.asp', 'method': 'get'}
send_kwargs = {}
session_class

alias of StudentSession

class hfut.interface.EvaluateCourse(kcdm, jxbh, r101=1, r102=1, r103=1, r104=1, r105=1, r106=1, r107=1, r108=1, r109=1, r201=3, r202=3, advice='')[source]

Bases: hfut.interface.BaseInterface

static parse(response)[source]
request_kwargs = {'url': 'student/asp/Jxpg_2.asp', 'method': 'post'}
send_kwargs = {}
session_class

alias of StudentSession

hfut.log module

日志模块

hfut.log.report_response(response, request_headers=True, request_body=True, response_headers=False, response_body=False, redirection=False)[source]

生成响应报告

Parameters:
  • responserequests.models.Response 对象
  • request_headers – 是否加入请求头
  • request_body – 是否加入请求体
  • response_headers – 是否加入响应头
  • response_body – 是否加入响应体
  • redirection – 是否加入重定向响应
Returns:

str

hfut.log.log_result_not_found(response)[source]

hfut.parser module

页面解析相关的函数,如果你想自己编写接口可能用得到

class hfut.parser.GlobalFeaturedSoup(markup='', parse_only=None, from_encoding=None, exclude_encodings=None, **kwargs)[source]

Bases: bs4.BeautifulSoup

hfut.parser.safe_zip(iter1, iter2, iter1_len=None, iter2_len=None)[source]
hfut.parser.parse_tr_strs(trs)[source]

将没有值但有必须要的单元格的值设置为 None 将 <tr> 标签数组内的单元格文字解析出来并返回一个二维列表

Parameters:trs – <tr> 标签或标签数组, 为 bs4.element.Tag 对象
Returns:二维列表
hfut.parser.flatten_list(multiply_list)[source]

碾平 list:

>>> a = [1, 2, [3, 4], [[5, 6], [7, 8]]]
>>> flatten_list(a)
[1, 2, 3, 4, 5, 6, 7, 8]
Parameters:multiply_list – 混淆的多层列表
Returns:单层的 list
hfut.parser.dict_list_2_tuple_set(dict_list_or_tuple_set, reverse=False)[source]
>>> dict_list_2_tuple_set([{'a': 1, 'b': 2}, {'c': 3, 'd': 4}])
{(('c', 3), ('d', 4)), (('a', 1), ('b', 2))}
>>> dict_list_2_tuple_set({(('c', 3), ('d', 4)), (('a', 1), ('b', 2))}, reverse=True)
[{'a': 1, 'b': 2}, {'c': 3, 'd': 4}]
Parameters:
  • dict_list_or_tuple_set – 如果 reverse=False 为字典列表, 否则为元组集合
  • reverse – 是否反向转换
hfut.parser.dict_list_2_matrix(dict_list, columns)[source]
>>> dict_list_2_matrix([{'a': 1, 'b': 2}, {'a': 3, 'b': 4}], ('a', 'b'))
[[1, 2], [3, 4]]
Parameters:
  • dict_list – 字典列表
  • columns – 字典的键
hfut.parser.parse_course(course_str)[source]

解析课程表里的课程

Parameters:course_str – 形如 单片机原理及应用[新安学堂434 (9-15周)]/数字图像处理及应用[新安学堂434 (1-7周)]/ 的课程表数据

hfut.session module

会话管理模块, 在 requests.Session 的基础上添加了一些针对接口的改进

class hfut.session.BaseSession(campus)[source]

Bases: requests.sessions.Session

所有接口会话类的基类

default_headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36'}
histories = deque([], maxlen=10)
host = None
prepare_request(request)[source]
send(request, **kwargs)[source]

所有接口用来发送请求的方法, 只是 requests.sessions.Session.send() 的一个钩子方法, 用来处理请求前后的工作

class hfut.session.GuestSession(campus)[source]

Bases: hfut.session.BaseSession

class hfut.session.StudentSession(account, password, campus)[source]

Bases: hfut.session.BaseSession

学生教务接口, 继承了 models.GuestSession 的所有接口, 因此一般推荐使用这个类

is_expired

asp.net 如果程序中没有设置session的过期时间,那么session过期时间就会按照IIS设置的过期时间来执行, IIS中session默认过期时间为20分钟,网站配置 最长24小时,最小15分钟, 页面级>应用程序级>网站级>服务器级. .那么当超过 15 分钟未操作会认为会话已过期需要重新登录

Returns:会话是否过期
login()[source]

登录账户

request(*args, **kwargs)[source]

hfut.shortcut module

class hfut.shortcut.BaseShortcuts[source]

Bases: object

query(interface)[source]
request(interface)[source]
session = NotImplemented
class hfut.shortcut.Guest(*args, **kwargs)[source]

Bases: hfut.shortcut.BaseShortcuts

get_class_info(xqdm, kcdm, jxbh)[source]

获取教学班详情, 包括上课时间地点, 考查方式, 老师, 选中人数, 课程容量等等信息

@structure {‘校区’: str,’开课单位’: str,’考核类型’: str,’课程类型’: str,’课程名称’: str,’教学班号’: str,’起止周’: str, ‘时间地点’: str,’学分’: float,’性别限制’: str,’优选范围’: str,’禁选范围’: str,’选中人数’: int,’备注’: str}

Parameters:
  • xqdm – 学期代码
  • kcdm – 课程代码
  • jxbh – 教学班号
get_class_students(xqdm, kcdm, jxbh)[source]

教学班查询, 查询指定教学班的所有学生

@structure {‘学期’: str, ‘班级名称’: str, ‘学生’: [{‘姓名’: str, ‘学号’: int}]}

Parameters:
  • xqdm – 学期代码
  • kcdm – 课程代码
  • jxbh – 教学班号
get_course_classes(kcdm)[source]

获取选课系统中课程的可选教学班级(不可选的班级即使人数未满也不能选)

@structure {‘可选班级’: [{‘起止周’: str, ‘考核类型’: str, ‘教学班附加信息’: str, ‘课程容量’: int, ‘选中人数’: int,
‘教学班号’: str, ‘禁选专业’: str, ‘教师’: [str], ‘校区’: str, ‘优选范围’: [str], ‘开课时间,开课地点’: [str]}],

‘课程代码’: str, ‘课程名称’: str}

Parameters:kcdm – 课程代码
get_entire_curriculum(xqdm=None)[source]

获取全校的学期课程表, 当没有提供学期代码时默认返回本学期课程表

@structure {‘课表’: [[[{‘上课周数’: [int], ‘课程名称’: str, ‘课程地点’: str}]]], ‘起始周’: int, ‘结束周’: int}

Parameters:xqdm – 学期代码
get_system_status()[source]

获取教务系统当前状态信息, 包括当前学期以及选课计划

@structure {‘当前学期’: str, ‘选课计划’: [(float, float)], ‘当前轮数’: int or None}

get_teacher_info(jsh)[source]

教师信息查询

@structure {‘教研室’: str, ‘教学课程’: str, ‘学历’: str, ‘教龄’: str, ‘教师寄语’: str, ‘简 历’: str, ‘照片’: str,
‘科研方向’: str, ‘出生’: str, ‘姓名’: str, ‘联系电话’: [str], ‘职称’: str, ‘电子邮件’: str, ‘性别’: str, ‘学位’: str,
‘院系’: str]
Parameters:jsh – 8位教师号, 例如 ‘05000162’
get_teaching_plan(xqdm, kclx='b', zydm='')[source]

专业教学计划查询, 可以查询全校公选课, 此时可以不填 zydm

@structure [{‘开课单位’: str, ‘学时’: int, ‘课程名称’: str, ‘课程代码’: str, ‘学分’: float}]

Parameters:
  • xqdm – 学期代码
  • kclx – 课程类型参数,只有两个值 b:专业必修课, x:全校公选课
  • zydm – 专业代码, 可以从 models.StudentSession.get_code() 获得
search_course(xqdm, kcdm=None, kcmc=None)[source]

课程查询

@structure [{‘任课教师’: str, ‘课程名称’: str, ‘教学班号’: str, ‘课程代码’: str, ‘班级容量’: int}]

Parameters:
  • xqdm – 学期代码
  • kcdm – 课程代码
  • kcmc – 课程名称
class hfut.shortcut.Student(*args, **kwargs)[source]

Bases: hfut.shortcut.Guest

change_course(select_courses=None, delete_courses=None)[source]

修改个人的课程

@structure [{‘费用’: float, ‘教学班号’: str, ‘课程名称’: str, ‘课程代码’: str, ‘学分’: float, ‘课程类型’: str}]

Parameters:
  • select_courses – 形如 [{'kcdm': '9900039X', 'jxbhs': {'0001', '0002'}}] 的课程代码与教学班号列表, jxbhs 可以为空代表选择所有可选班级
  • delete_courses – 需要删除的课程代码集合, 如 {'0200011B'}
Returns:

选课结果, 返回选中的课程教学班列表, 结构与 get_selected_courses 一致

change_password(new_password)[source]

修改教务密码, 注意 合肥校区使用信息中心账号登录, 与教务密码不一致, 即使修改了也没有作用, 因此合肥校区帐号调用此接口会直接报错

@structure bool

Parameters:new_password – 新密码
check_courses(kcdms)[source]

检查课程是否被选

@structure [bool]

Parameters:kcdms – 课程代码列表
Returns:与课程代码列表长度一致的布尔值列表, 已为True,未选为False
evaluate_course(kcdm, jxbh, r101=1, r102=1, r103=1, r104=1, r105=1, r106=1, r107=1, r108=1, r109=1, r201=3, r202=3, advice='')[source]

课程评价, 数值为 1-5, r1 类选项 1 为最好, 5 为最差, r2 类选项程度由深到浅, 3 为最好.

默认都是最好的选项

Parameters:
  • kcdm – 课程代码
  • jxbh – 教学班号
  • r101 – 教学态度认真,课前准备充分
  • r102 – 教授内容充实,要点重点突出
  • r103 – 理论联系实际,反映最新成果
  • r104 – 教学方法灵活,师生互动得当
  • r105 – 运用现代技术,教学手段多样
  • r106 – 注重因材施教,加强能力培养
  • r107 – 严格要求管理,关心爱护学生
  • r108 – 处处为人师表,注重教书育人
  • r109 – 教学综合效果
  • r201 – 课程内容
  • r202 – 课程负担
  • advice – 其他建议,不能超过120字且不能使用分号,单引号,都好
Returns:

get_code()[source]

获取当前所有的学期, 学期以及对应的学期代码, 注意如果你只是需要获取某个学期的代码的话请使用 util.cal_term_code()

@structure {‘专业’: [{‘专业代码’: str, ‘专业名称’: str}], ‘学期’: [{‘学期代码’: str, ‘学期名称’: str}]}

get_my_achievements()[source]

获取个人成绩

@structure [{‘教学班号’: str, ‘课程名称’: str, ‘学期’: str, ‘补考成绩’: str, ‘课程代码’: str, ‘学分’: float, ‘成绩’: str}]

get_my_curriculum()[source]

获取个人课表

@structure {‘课表’: [[[{‘上课周数’: [int], ‘课程名称’: str, ‘课程地点’: str}]]], ‘起始周’: int, ‘结束周’: int}

get_my_fees()[source]

收费查询

@structure [{‘教学班号’: str, ‘课程名称’: str, ‘学期’: str, ‘收费(元): float’, ‘课程代码’: str, ‘学分’: float}]

get_my_info()[source]

获取个人信息

@structure {‘婚姻状况’: str, ‘毕业高中’: str, ‘专业简称’: str, ‘家庭地址’: str, ‘能否选课’: str, ‘政治面貌’: str,
‘性别’: str, ‘学院简称’: str, ‘外语语种’: str, ‘入学方式’: str, ‘照片’: str, ‘联系电话’: str, ‘姓名’: str, ‘入学时间’: str, ‘籍贯’: str, ‘民族’: str, ‘学号’: int, ‘家庭电话’: str, ‘生源地’: str, ‘出生日期’: str, ‘学籍状态’: str, ‘身份证号’: str, ‘考生号’: int, ‘班级简称’: str, ‘注册状态’: str}
get_optional_courses(kclx='x')[source]

获取可选课程, 并不判断是否选满

@structure [{‘学分’: float, ‘开课院系’: str, ‘课程代码’: str, ‘课程名称’: str, ‘课程类型’: str}]

Parameters:kclx – 课程类型参数,只有三个值,{x:全校公选课, b:全校必修课, jh:本专业计划},默认为’x’
get_selectable_courses(kcdms=None, dump_result=True, filename='可选课程.json', encoding='utf-8')[source]

获取所有能够选上的课程的课程班级, 注意这个方法遍历所给出的课程和它们的可选班级, 当选中人数大于等于课程容量时表示不可选.

由于请求非常耗时且一般情况下用不到, 因此默认推荐在第一轮选课结束后到第三轮选课结束之前的时间段使用, 如果你仍然坚持使用, 你将会得到一个警告.

@structure [{‘可选班级’: [{‘起止周’: str, ‘考核类型’: str, ‘教学班附加信息’: str, ‘课程容量’: int, ‘选中人数’: int,
‘教学班号’: str, ‘禁选专业’: str, ‘教师’: [str], ‘校区’: str, ‘优选范围’: [str], ‘开课时间,开课地点’: [str]}],

‘课程代码’: str, ‘课程名称’: str}]

Parameters:
  • kcdms – 课程代码列表, 默认为所有可选课程的课程代码
  • dump_result – 是否保存结果到本地
  • filename – 保存的文件路径
  • encoding – 文件编码
get_selected_courses()[source]

获取所有已选的课程

@structure [{‘费用’: float, ‘教学班号’: str, ‘课程名称’: str, ‘课程代码’: str, ‘学分’: float, ‘课程类型’: str}]

get_unfinished_evaluation()[source]

获取未完成的课程评价

@structure [{‘教学班号’: str, ‘课程名称’: str, ‘课程代码’: str}]

set_telephone(tel)[source]

更新电话

@structure bool

Parameters:tel – 电话号码, 需要满足手机和普通电话的格式, 例如 18112345678 或者 ‘0791-1234567’

hfut.util module

一些能够帮你提升效率的辅助函数

hfut.util.get_point(grade_str)[source]

根据成绩判断绩点

Parameters:grade_str – 一个字符串,因为可能是百分制成绩或等级制成绩
Returns:成绩绩点
Return type:float
hfut.util.cal_gpa(grades)[source]

根据成绩数组计算课程平均绩点和 gpa, 算法不一定与学校一致, 结果仅供参考

Parameters:gradesmodels.StudentSession.get_my_achievements() 返回的成绩数组
Returns:包含了课程平均绩点和 gpa 的元组
hfut.util.cal_term_code(year, is_first_term=True)[source]

计算对应的学期代码

Parameters:
  • year – 学年开始年份,例如 “2012-2013学年第二学期” 就是 2012
  • is_first_term (bool) – 是否为第一学期
Returns:

形如 “022” 的学期代码

hfut.util.term_str2code(term_str)[source]

将学期字符串转换为对应的学期代码串

Parameters:term_str – 形如 “2012-2013学年第二学期” 的学期字符串
Returns:形如 “022” 的学期代码
hfut.util.sort_hosts(hosts, method='GET', path='/', timeout=(5, 10), **kwargs)[source]

测试各个地址的速度并返回排名, 当出现错误时消耗时间为 INFINITY = 10000000

Parameters:
  • method – 请求方法
  • path – 默认的访问路径
  • hosts – 进行的主机地址列表, 如 [‘http://222.195.8.201/’]
  • timeout – 超时时间, 可以是一个浮点数或 形如 (连接超时, 读取超时) 的元祖
  • kwargs – 其他传递到 requests.request 的参数
Returns:

形如 [(访问耗时, 地址)] 的排名数据

hfut.util.filter_curriculum(curriculum, week, weekday=None)[source]

筛选出指定星期[和指定星期几]的课程

Parameters:
  • curriculum – 课程表数据
  • week – 需要筛选的周数, 是一个代表周数的正整数
  • weekday – 星期几, 是一个代表星期的整数, 1-7 对应周一到周日
Returns:

如果 weekday 参数没给出, 返回的格式与原课表一致, 但只包括了在指定周数的课程, 否则返回指定周数和星期几的当天课程

hfut.value module

Module contents

合肥工业大学教务系统学生端接口以及方便开发者开发围绕学生数据的一些工具.