图书馆座位预约脚本

掌握技术者。需慎独。 抢座太耗精力,所以闲来无事,在服务器上搞了预约图书馆座位的脚本。

  1. centOS下升级python版本,详细步骤

    !注意我的目录是/usr/local/python3/
    1、可利用linux自带下载工具wget下载,如下所示:(
    笔者安装的是最小centos系统,所以使用编译命令前,必须安装wget服务,读者如果安装的是界面centos系统,或者使用过编译工具则可跳过安装wget,直接进行下边的编译步骤 )
    wget http://www.python.org/ftp/python/3.3.0/Python-3.3.0.tgz
    2、下载完成后到下载目录下,解压
    tar -xzvf Python-3.3.0.tgz
    3、进入解压缩后的文件夹
    cd Python-3.3.0  
    4、在编译前先在/usr/local建一个文件夹python3(作为python的安装路径,以免覆盖老的版本)
    mkdir /usr/local/python3 (此处新建文件夹用mkdir,如果是新建文件则用touch)
      
    5、开始编译安装(
    笔者安装的是最小centos系统,所以使用编译命令前,必须安装编译套件gcc,读者如果安装的是界面centos系统,或者使用过编译工具则可跳过安装gcc,直接进行下边的编译步骤)
    ./configure —prefix=/usr/local/python3
    make
    make install
    6、此时没有覆盖老版本,再将原来/usr/bin/python链接改为别的名字(笔者保留了两个版本的,一个python,一个python3,所以第6步笔者略过,把第7步的链接后名字改为python3,读者可按正常步骤,实现的效果相同)
    mv /usr/bin/python /usr/bin/python_old2
      
    7、再建立新版本python的链接
    ln -s /usr/local/python3/bin/python3 /usr/bin/python
      
    8、这个时候输入
    python -V
     
    10、就会显示出python的新版本信息
    [idolaoxu@localhost home]# python -V
    Python 3.3.0
    PS:如果不建立新安装路径python3,而是直接默认安装,则安装后的新python应该会覆盖linux下自带的老版本,也有可能不覆盖,具体看安装过程了,
    这个大家可以自己试验下,当然如果还想保留原来的版本,那么这种方法最好不过了。

  2. Install pip3 for python 3.x 要注意其实python3 文件夹-bin目录下已经有一个,pip3,pip3.6了!

  3. 过程当中出现python requests环境错误——使得我不得不 /…/pip3 uninstall requests 然后重新 /…/pip3 install requests
  4. Python 日志输出

代码如下:

# !/usr/bin/env python
# coding=utf-8
import requests
import json
import time
import sys
import logging
# 配置文件作为参数传入预约第二天的座位
# 座位转换
# from ‘第一阅览室001’ to seat-id = 22558
ROOM = “””
{“status”:”success”,”data”:[{“roomId”:41,”room”:”第一阅览室”,”floor”:2,”reserved”:0,”inUse”:0,”away”:0,”totalSeats”:136,”free”:136},{“roomId”:12,”room”:”第二阅览室中区”,”floor”:3,”reserved”:0,”inUse”:0,”away”:0,”totalSeats”:48,”free”:48},{“roomId”:11,”room”:”第二阅览室北区”,”floor”:3,”reserved”:0,”inUse”:0,”away”:0,”totalSeats”:196,”free”:196},{“roomId”:13,”room”:”第二阅览室南区”,”floor”:3,”reserved”:0,”inUse”:0,”away”:0,”totalSeats”:172,”free”:172},{“roomId”:15,”room”:”第十一阅览室中区”,”floor”:3,”reserved”:0,”inUse”:0,”away”:0,”totalSeats”:48,”free”:48},{“roomId”:14,”room”:”第十一阅览室北区”,”floor”:3,”reserved”:0,”inUse”:0,”away”:0,”totalSeats”:188,”free”:188},{“roomId”:16,”room”:”第十一阅览室南区”,”floor”:3,”reserved”:0,”inUse”:0,”away”:0,”totalSeats”:156,”free”:156},{“roomId”:18,”room”:”第三阅览室中区”,”floor”:4,”reserved”:0,”inUse”:0,”away”:0,”totalSeats”:48,”free”:48},{“roomId”:17,”room”:”第三阅览室北区”,”floor”:4,”reserved”:0,”inUse”:0,”away”:0,”totalSeats”:148,”free”:148},{“roomId”:19,”room”:”第三阅览室南区”,”floor”:4,”reserved”:0,”inUse”:0,”away”:0,”totalSeats”:120,”free”:120},{“roomId”:21,”room”:”第十阅览室中区”,”floor”:4,”reserved”:0,”inUse”:0,”away”:0,”totalSeats”:48,”free”:48},{“roomId”:22,”room”:”第十阅览室南区”,”floor”:4,”reserved”:0,”inUse”:0,”away”:0,”totalSeats”:164,”free”:164},{“roomId”:35,”room”:”第九阅览室中区”,”floor”:5,”reserved”:0,”inUse”:0,”away”:0,”totalSeats”:48,”free”:48},{“roomId”:34,”room”:”第九阅览室北区”,”floor”:5,”reserved”:0,”inUse”:0,”away”:0,”totalSeats”:195,”free”:195},{“roomId”:36,”room”:”第九阅览室南区”,”floor”:5,”reserved”:0,”inUse”:0,”away”:0,”totalSeats”:172,”free”:172},{“roomId”:32,”room”:”第四阅览室中区”,”floor”:5,”reserved”:0,”inUse”:0,”away”:0,”totalSeats”:48,”free”:48},{“roomId”:31,”room”:”第四阅览室北区”,”floor”:5,”reserved”:0,”inUse”:0,”away”:0,”totalSeats”:148,”free”:148},{“roomId”:33,”room”:”第四阅览室南区”,”floor”:5,”reserved”:0,”inUse”:0,”away”:0,”totalSeats”:164,”free”:164},{“roomId”:38,”room”:”第五阅览室中区”,”floor”:6,”reserved”:0,”inUse”:0,”away”:0,”totalSeats”:48,”free”:48},{“roomId”:8,”room”:”第五阅览室北区”,”floor”:6,”reserved”:0,”inUse”:0,”away”:0,”totalSeats”:59,”free”:59},{“roomId”:37,”room”:”第五阅览室南区”,”floor”:6,”reserved”:0,”inUse”:0,”away”:0,”totalSeats”:173,”free”:173},{“roomId”:47,”room”:”第八阅览室中区”,”floor”:6,”reserved”:0,”inUse”:0,”away”:0,”totalSeats”:48,”free”:48},{“roomId”:9,”room”:”第八阅览室北区”,”floor”:6,”reserved”:0,”inUse”:0,”away”:0,”totalSeats”:204,”free”:204},{“roomId”:40,”room”:”第八阅览室南区”,”floor”:6,”reserved”:0,”inUse”:0,”away”:0,”totalSeats”:176,”free”:176},{“roomId”:27,”room”:”第七阅览室中区”,”floor”:7,”reserved”:0,”inUse”:0,”away”:0,”totalSeats”:48,”free”:48},{“roomId”:46,”room”:”第七阅览室北区”,”floor”:7,”reserved”:0,”inUse”:0,”away”:0,”totalSeats”:132,”free”:132},{“roomId”:28,”room”:”第七阅览室南区”,”floor”:7,”reserved”:0,”inUse”:0,”away”:0,”totalSeats”:108,”free”:108},{“roomId”:24,”room”:”第六阅览室中区”,”floor”:7,”reserved”:0,”inUse”:0,”away”:0,”totalSeats”:48,”free”:48},{“roomId”:23,”room”:”第六阅览室北区”,”floor”:7,”reserved”:0,”inUse”:0,”away”:0,”totalSeats”:132,”free”:132},{“roomId”:25,”room”:”第六阅览室南区”,”floor”:7,”reserved”:0,”inUse”:0,”away”:0,”totalSeats”:108,”free”:108}],”message”:””,”code”:”0”}
“””
ROOM = json.loads(ROOM)
ROOM = ROOM[‘data’]
def get_seat_id(loc, token):
local_room = loc[:-3]
local_seat = loc[-3:]

#for one
room\_id = \[x for x in ROOM if x\['room'\] == local\_room\]\[0\]\['roomId'\]
room\_layer\_url = 'http://seat.ujn.edu.cn/rest/v2/room/layoutByDate/' + str(room_id) + '/2018-03-0' \
                                                                                      '8?token=' + token
r = requests.get(room\_layer\_url)
layer = json.loads(r.text)
layer = layer\['data'\]\['layout'\]
#for two
seat\_id = \[x for x in layer if layer\[x\]\['type'\] == 'seat' and layer\[x\]\['name'\] == local\_seat\]
if seat\_id.\_\_len__() == 0:
    print('找不到' + loc)
    return -1
else:
    seat\_id = layer\[seat\_id\[0\]\]\['id'\]
    return seat_id

‘’’
http://seat.ujn.edu.cn/rest/auth?username=220140421164&password=220140421164
获取token
{“status”:”success”,”data”:{“token”:”T58UTCARF601204212”},”code”:”0”,”message”:””}
{“status”:”fail”,”code”:”13”,”message”:”登录失败: 密码不正确”,”data”:null}
‘’’
def getToken(username, password):
url = ‘http://seat.ujn.edu.cn/rest/auth
param = {
‘username’: username,
‘password’: password
}
r = requests.get(url, params=param)
resp = json.loads(r.text)
if resp[‘status’] == ‘fail’:
print(username + ‘ ‘ + r.text)
return -1
else:
return resp[‘data’][‘token’]
‘’’
http://seat.ujn.edu.cn/rest/v2/freeBook
POST `token=HLIU9P4HYW01214703&startTime=960&endTime=1200&seat=15343&date=2018-01-21`
‘’’
def freeBook(token, startTime, endTime, seat):
tomorrow = time.strftime(“%Y-%m-%d”, time.localtime(86400 + time.time()))
url = ‘http://seat.ujn.edu.cn/rest/v2/freeBook
para = {
‘token’: token,
‘startTime’: startTime,
‘endTime’: endTime,
‘seat’: seat,
‘date’: tomorrow
}
r = requests.post(url, data=para)
resp = json.loads(r.text)
if resp[‘status’] == ‘fail’:

    #print(r.text)
    fileLogOut('seat_reason.log', r.text)
    return -1
else:
    fileLogOut('seat_reason.log', r.text)
    return 1

‘’’
调试并适用于在 凌晨进行预约时。输出日志文件进行确认。
‘’’
def fileLogOut(logFilename, logMessage):

#创建logger实例
logger = logging.getLogger()
logger.setLevel(logging.DEBUG)
log_dir = '/root/reservation/log/'
#创建handler
#终端handler
consoleHandler = logging.StreamHandler()
consoleHandler.setLevel(logging.DEBUG)
#文件Handler
fileHandler = logging.FileHandler(log_dir + logFilename, mode='a', encoding='UTF-8')
fileHandler.setLevel(logging.NOTSET)
#Formatter
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
consoleHandler.setFormatter(formatter)
fileHandler.setFormatter(formatter)
#添加 handler到对应的logger实例当中去
logger.addHandler(consoleHandler)
logger.addHandler(fileHandler)
#打印日志
logger.debug(logMessage)

if __name__ == ‘__main__‘:
if sys.argv.__len__() <= 1:
print(“请传入配置文件名称”)
sys.exit()
filename = sys.argv[1]
now = time.strftime(“%Y-%m-%d %H:%M:%S”, time.localtime(time.time()))
print(‘———————————‘ + now + ‘———————————-‘)
f = open(sys.path[0] + ‘/‘ + filename, ‘r’, encoding=’utf8’)
info = json.load(f)

# print(info)
# print(len(info\['stu'\]))
for i in info\['stu'\]:
    token = getToken(i\['username'\], i\['password'\])
    if token != -1:
        seat\_id = get\_seat_id(i\['seat'\], token)
        if seat_id != -1:
            status = freeBook(token, i\['startTime'\], i\['endTime'\], seat_id)
            #print('test1')
        else:
            status = -1
            #print('test2')
    if token != -1 and status != -1:
        response = i\['name'\] + ' 成功预约 ' + i\['seat'\] + '\\n'
        fileLogOut('seat_log.log', response)
    else:
        response = i\['name'\] + ' 预约失败\\n'
        #print('test3')
        fileLogOut('seat_log.log', response)
(っ•̀ω•́)っ✎⁾⁾ 坚持技术学习、内容输出与分享,您的支持将鼓励我继续创作!(*/ω\*)
( • ̀ω•́ )✧如有疑问或需要技术讨论,请留言或发邮件到 aclearzhang@qq.com.(*・ω< ) 
  • 本文作者:: AClearZhang
  • 本文链接:: 1198.html
  • 版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 3.0 许可协议。转载请注明出处!