本文实例为大家分享了Python实现图书馆座位自动预约的具体代码,供大家参考,具体内容如下
配置
通过公网主机定时运行脚本,并发送邮件到自己的qq邮箱,这样在微信就会有消息提示是否预约成功
vim /etc/crontab
设置每到早上7:01自动运行脚本即可
程序流程
(以yuyue.juneberry.cn网站为例)
- get访问登录页面,获取cookie和表单里面的隐藏post字段
- 构造登录post数据,加入从表单里面拿到的隐藏post字段
- post构造后的数据,模拟登录,激活cookie(使cookie有登入权限)
- get访问座位预约界面,激活cookie(使cookie有预约座位权限)
- post预约请求,实现预约座位
- 解析返回结果,判断是否成功,并邮件提醒
要点
- requests库中的requests.session() 能够创建可传递cookies的会话
- 拿到<input type=hidden>的数据并传递到post的数据中
- 抓包判断网站逻辑,筛选出各个请求的参数,并在程序中实现
函数解释
- class FUCK()主类
- _get_date_str(self):获取当前日期,并加上一天,用这个函数构造url的特征字段(图书馆设置提前一天预约座位)
- def _get_order_url(self):构造"预约座位"的post目标url
- def _get_static_post_attr:这个函数解析get请求的返回页面,并从中提取出<input type=hidden>的字段,用于之后的构造post数据
- def login(self):实现登录功能
- def run(self):实现座位预约功能
- def _is_success(self, text):判断预约结果
- def error_log_once(self, text='default error (once)'):
- def error_log(self, text='default error'):这两个函数设置程序状态为"已经出错"或者"未出错"状态(用于自动化运行的时候避免将重复的错误信息写入日志)
- def error_log(self, text='default error'):单次将错误信息写入本地日志
- sendmail.send_mail()邮件发送模块
代码及注释
# /bin/python# -*- coding:utf-8 -*-import timeimport sysimport requestsfrom bs4 import BeautifulSoupfrom mail import sendmail__author__ = 'xy'# 主类class FUCK(): def __init__(self, username, password, seatNO, mailto): """ 以四个参数初始化,用户名,密码,要预约的座位号,接受预约结果提醒邮件的邮箱 """ self.username = username self.password = password self.seatNO = seatNO self.mailto = mailto self.base_url = 'http://yuyue.juneberry.cn' self.login_url = 'http://yuyue.juneberry.cn' self.order_url = self._get_order_url() self.login_content = '' self.middle_content = '' self.final_content = '' self.s = requests.session() # 创建可传递cookies的会话 # post data for login self.data1 = { 'subCmd': 'Login', 'txt_LoginID': self.username, # S+学号 'txt_Password': self.password, # 密码 'selSchool': 60, # 60表示北京交通大学 } # post data for order a seat self.data2 = { 'subCmd': 'query', } # 自定义http头,然而我在程序里并没有使用 self.headers = { 'Connection': 'keep-alive', 'Content-Type': 'application/x-\n' print 'Any problems, mail to: i[at]cdxy.me' print '#-*- Edit by cdxy 16.03.24 -*-' sys.exit(0) else: FUCK(sys.argv[1], sys.argv[2], sys.argv[3], sys.argv[4])以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。