配置
通过公网主机定时运行脚本,并发送邮件到自己的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目标urldef _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 time
import sys
import requests
from bs4 import BeautifulSoup
from 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 =