snnusdk.libiary 源代码

'''
Created on Dec 5, 2018

@author: QiZhao
'''
import re

import requests
from bs4 import BeautifulSoup

from snnusdk.base import API
from snnusdk.exceptions import AuthenticationError, UnauthorizedError
from snnusdk.tool.Table import table_to_list


[文档]class Library(API): """图书馆 :param str username: 用户名 :param str password: 密码 :raise: :class:`snnusdk.exceptions.AuthenticationError` >>> libiary = Library(username='B11111111', password='xxx') """ class URLs: HOST = "http://www.lib.snnu.edu.cn/" LOGIN = HOST + 'centerlogin.do' # 登录 INFO = HOST + 'action.do?webid=w-l-mylib' # 信息 BORROW = HOST + 'action.do?webid=w-l-zjts' # 在借书籍 RESERVATION = HOST + 'action.do?webid=w-l-yyts' # 预约书籍 CASH = HOST + 'action.do?webid=w-l-xjsw' # 现金事务 LOCK = HOST + 'action.do?webid=w-l-gsjsz' # 挂失 UNLOCK = HOST + 'action.do?webid=w-l-jgjsz' # 解挂 BORROW_INFO = 'http://opac.snnu.edu.cn:8991/F?func=file&file_name=hold_shelf' # 预约到馆 def __init__(self, username, password): super().__init__() self.username = username self.password = password
[文档] def login(self): """登录 :raise: :class:`snnusdk.exceptions.AuthenticationError` """ data = { 'userid': self.username, 'password': self.password, '提交': '登录', } res = self.post(url=self.URLs.LOGIN, data=data) res.encoding = 'utf-8' if '已登录' in res.text: self.verify = True elif '您输入的帐号或密码有误' in res.text: raise AuthenticationError('您输入的帐号或密码有误') else: raise AuthenticationError('未知错误')
[文档] def get_info(self): """基本信息 :raise: :class:`snnusdk.exceptions.UnauthorizedError` :rtype: dict :return: 用户基本信息的字典 >>> library.get_info() { '帐号ID': '2016xxxxx', '姓名': '张三', '昵称': 'xx', '登录次数': '123', '状态': '正常' } """ if self.verify is False: raise UnauthorizedError('您还没有登录!') soup = self.get_soup(self.URLs.INFO) table = soup.find(name='table', attrs={'class': 'dzjbzl'}) info = {} for tr in table.select('tr'): tds = tr.select('td') key = str(tds[0].text) value = str(tds[1].text) info[key.rstrip(':')] = value for f in soup.find_all(name='font'): if f.has_attr('color'): info['状态'] = f.text break return info
[文档] def get_borrowing_books(self): """在借书籍列表 :raise: :class:`snnusdk.exceptions.UnauthorizedError` :rtype: list of dict :return: 在借书籍列表 >>> library.get_borrowing_books() [ { '书名': '大学语文', '作者': '张三', '出版社': '中国xx出版社', '分馆': '雁塔外借图书库', '索书号': 'TP311', '条码号': '123456789', '应还日期': '2018-12-11 22:00' }, ... ] """ if self.verify is False: raise UnauthorizedError('您还没有登录!') soup = self.get_soup(self.URLs.BORROW) book_list = [] tables = soup.find_all(name='table', attrs={'class': 'borrows'}) for table in tables: book = {} divs = table.select_one('td').find_all(name='div') book['书名'] = divs[0].select_one('a').text for div in divs[1:]: ls = div.text.split(':', maxsplit=2) book[ls[0]] = ls[1] book_list.append(book) return book_list
[文档] def get_reservation_books(self): """预约书籍列表 :raise: :class:`snnusdk.exceptions.UnauthorizedError` :rtype: list of dict :return: 预约书籍列表 >>> library.get_reservation_books() [ { '书名': '大学语文', '作者': '张三', '出版社': '中国xx出版社', '取书地点': '长安总服务台', '预约开始日期': '2018-12-01', '预约失效日期': '2018-12-11' }, ... ] """ if self.verify is False: raise UnauthorizedError('您还没有登录!') book_list = [] soup = self.get_soup(self.URLs.RESERVATION) borrow_divs = soup.find_all(name='div', attrs={'class': 'borrows'}) for borrow_div in borrow_divs: temp = {} for div in borrow_div.find_all(name='div'): class_value = div.get('class')[0] if class_value == 'title': temp['书名'] = div.text.split('、', 2)[1] elif class_value == 'author': temp['作者'], temp['出版社'] = div.text.split(' -- ') elif class_value == 'qsdd': temp['取书地点'] = div.text.split(':')[1] elif class_value == 'yyrq': temp['预约开始日期'] = div.text.split(':')[1] elif class_value == 'yysxrq': temp['预约失效日期'] = div.text.split(':')[1] book_list.append(temp) return book_list
[文档] def get_cash(self): """现金事务 :raise: :class:`snnusdk.exceptions.UnauthorizedError` :rtype: dict :return: 参照例子 >>> library.get_cash() { '总额':'-2.00', '明细': [ { '书名': '大学语文', '作者': '张三', '出版社': '中国xx出版社', '数量': '-2.00', '原因': '超期', '状态': 'O' }, ... ] } """ if self.verify is False: raise UnauthorizedError('您还没有登录!') dic = {} soup = self.get_soup(self.URLs.CASH) div = soup.find(name='div', attrs={'id': 'b2_block'}) dic['总额'] = re.search('总额:([^\n]+)', div.text, re.S).group(1) dic['明细'] = [] borrow_divs = soup.find_all(name='div', attrs={'class': 'borrows'}) for borrow_div in borrow_divs: temp = {} flag = False for div in borrow_div.find_all(name='div'): class_value = div.get('class')[0] if class_value == 'title': temp['书名'] = div.text.split('、', 2)[1] elif class_value == 'author': temp['作者'], temp['出版社'] = div.text.split(' -- ') elif class_value == 'qsdd': temp['数量'] = div.text.split(':')[1] elif class_value == 'yyrq': if not flag: temp['原因'] = div.text.split(':')[1] flag = True else: temp['状态'] = div.text.split(':')[1] dic['明细'].append(temp) return dic
[文档] def lock_lib_card(self): """挂失图书证 :raise: :class:`snnusdk.exceptions.UnauthorizedError` :rtype: dict :return: 挂失借书证的结果 >>> library.lock_lib_card() { 'success':True, 'msg':'挂失借书证成功' } """ if self.verify is False: raise UnauthorizedError('您还没有登录!') r = self.get(url=self.URLs.LOCK) if '挂失借书证成功' in r.text: return {'success': True, 'msg': '挂失借书证成功'} else: return {'success': False, 'msg': '挂失借书证失败'}
[文档] def unlock_lib_card(self): """解挂图书证 :raise: :class:`snnusdk.exceptions.UnauthorizedError` :rtype: dict :return: 解挂借书证的结果 >>> library.unlock_lib_card() { 'success':True, 'msg':'解挂借书证成功' } """ if self.verify is False: raise UnauthorizedError('您还没有登录!') r = self.get(url=self.URLs.UNLOCK) if '解挂借书证成功' in r.text: return {'success': True, 'msg': '解挂借书证成功'} else: return {'success': False, 'msg': '解挂借书证失败'}
[文档] @staticmethod def get_borrow_info(): """预约到馆信息 :rtype: dict :return: 预约到馆信息的字典 >>> get_borrow_info() { 'success': True, 'msg': '查询成功', 'result': [ { '预约者': '张三', '书名': 'C语言程序设计', '著者': '李四', '保留结束日期': '2018-12-06', '单册分馆': '长安西密集库', '取书地点': '雁塔总服务台' }, ... ] } """ ret = {} try: r = requests.get(Library.URLs.BORROW_INFO) r.encoding = 'utf-8' soup = BeautifulSoup(r.text, 'lxml') table = soup.find(name='table', attrs={'summary': 'Script output'}) ls = table_to_list(table) ret['success'] = True ret['result'] = ls ret['msg'] = '查询成功' except Exception as e: print(e) ret['success'] = False ret['result'] = [] ret['msg'] = e.message finally: return ret
if __name__ == "__main__": lib = Library('xx', 'xx') print(lib.get_reservation_books()) # print(lib.get_info()) # print(lib.get_borrowing_books())