Python请求模拟登录实现图书馆座位自动预约

  

本文实例为大家分享了Python实现图书馆座位自动预约的具体代码,供大家参考,具体内容如下

  

<>强配置

  

通过公网主机定时运行脚本,并发送邮件到自己的qq邮箱,这样在微信就会有消息提示是否预约成功

  


  

  

设置每到早上7:01自动运行脚本即可

  

<强>程序流程

  

(以yuyue.juneberry.cn网站为例)

  
      <李>得到访问登录页面,获取饼干和表单里面的隐藏字后段李   <李>构造登录文章数据,加入从表单里面拿到的隐藏字后段李   <李> post构造后的数据,模拟登录,激活饼干(使饼干有登入权限)   <李>得到访问座位预约界面,激活饼干(使饼干有预约座位权限)   <李>发布预约请求,实现预约座位李   <李>解析返回结果,判断是否成功,并邮件提醒
      李   
  

<>强要点

  
      <李>请求库中的能够创建可传递饼干的会话李   <李>拿到的数据并传递到文章的数据中李   <李>抓包判断网站逻辑,筛选出各个请求的参数,并在程序中实现
      李   
  

<强>函数解释

  
      <李>主类李   <李>获取当前日期,并加上一天,用这个函数构造url的特征字段(图书馆设置提前一天预约座位)   <李>构造“预约座位”的帖子目标url李   <李>这个函数解析得到请求的返回页面,并从中提取出的字段,用于之后的构造文章数据李   <李>实现登录功能李   <李>实现座位预约功能李   <李>判断预约结果李   <李>   <李>这两个函数设置程序状态为“已经出错”或者“未出错”状态(用于自动化运行的时候避免将重复的错误信息写入日志)   <李>单次将错误信息写入本地日志李   <李>邮件发送模块
      李   
  

<强>代码及注释

        #/bin/python   # - * -编码:utf - 8 - *   导入的时间   导入系统   进口的要求   从bs4进口BeautifulSoup   从邮件导入sendmail      __author__=' xy '      #主类   类操():   def __init__(自我,用户名、密码、seatNO mailto):   ”“”   以四个参数初始化,用户名:密码,要预约的座位号,接受预约结果提醒邮件的邮箱   ”“”   自我。用户名=用户名   自我。密码=密码   自我。seatNO=seatNO   自我。mailto=mailto   自我。base_url=' http://yuyue.juneberry.cn '   自我。login_url=' http://yuyue.juneberry.cn '   自我。order_url=self._get_order_url ()      自我。login_content="   自我。middle_content="   自我。final_content="      自我。s=requests.session() #创建可传递饼干的会话      # post数据登录   自我。data1={   “subCmd”:“登录”,   “txt_LoginID”:自我。用户名、# S +学号   “txt_Password”:自我。密码,#密码   “selSchool”: 60 # 60表示北京交通大学   }      # post数据的顺序坐   自我。data2={   “subCmd”:“查询”,   }      #自定义http头,然而我在程序里并没有使用   自我。头={   “连接”:“保活”,   “内容类型”:“应用程序/x-www-form-urlencoded”,   }      self.login ()   self.run ()   self._is_success (self.final_content)      #怀疑程序出错时,取消下行注释,可打印一些参数   # self._debug ()      def _get_date_str(自我):   s=time.localtime (time.time ())   # # # # # # # # 333   date_str=str (s.tm_year) + ' % 2 f + str (s.tm_mon) + % 2 f + str (s。tm_mday + 1)   date_str=date_str。替换(' % 2 f1 % 2 f32 ', ' % 2 f2 % 2 f1 ') \   .replace (' % 2 f2 % 2 f29 ', ' % 2 f3 % 2 f1 ') \   .replace (' % 2 f3 % 2 f32 ', ' % 2 f4 % 2 f1 ') \   .replace (' % 2 f4 % 2 f31 ', ' % 2 f5 % 2 f1 ') \   .replace (' % 2 f5 % 2 f32 ', ' % 2 f6 % 2 f1 ') \   .replace (' % 2 f6 % 2 f31 ', ' % 2 f7 % 2 f1 ') \   .replace (' % 2 f7 % 2 f32 ', ' % 2 f8 % 2 f1 ') \   .replace (' % 2 f8 % 2 f32 ', ' % 2 f9 % 2 f1 ') \   .replace (' % 2 f9 % 2 f31 ', ' % 2 f10 % 2 f1 ') \   .replace (' % 2 f10 % 2 f32 ', ' % 2季% 2 f1 ') \   .replace(' % 2季% 2 f31 ', ' % 2 f12 % 2 f1 ') \   .replace (' % 2 f12 % 2 f32 ', ' % 2 f1 f1 % 2 ')   返回date_str      def _get_order_url(自我):   ”返回“http://yuyue.juneberry.cn/BookSeat/BookSeatMessage.aspx& # 63; seatNo=101001 +自我。seatNO +”, seatShortNo=01”+自我。seatNO +”, roomNo=101001,日期=" + self._get_date_str ()      def _get_static_post_attr(自我、page_content data_dict):   ”“”   拿到& lt;输入类型=耙亍痹诘奈恼虏问?并添加到post_data中   ”“”   汤=BeautifulSoup (page_content“html.parser”)   对于每个在soup.find_all(“输入”):   如果“价值”。在each.attrs attrs和“名称”:   data_dict[每个['名字']]=每个(“价值”)#添加到登录的post_data中   #自我。data2[每个['名字']]=每个(“价值”)#添加到订单的post_data中   返回data_dict      def _debug(自我):      打印self.order_url   打印self.data1   打印self.data2   打印self.headers   打印self.s.cookies      #打印self.login_content   #打印self.middle_content   打印self.final_content      def登录(自我):   homepage_content=self.s.get .content (self.base_url)   自我。data1=自我。_get_static_post_attr (homepage_content self.data1)   r=self.s.post(自我。login_url self.data1)   自我。login_content=r.content      def运行(自我):      #这个得到的意思是:原先的饼干没有预约权限,   #访问这个得到之后,会使饼干拥有预约权限,从而执行下一个职位   自我。middle_content=self.s.get .content (“http://yuyue.juneberry.cn/BookSeat/BookSeatListForm.aspx”)      #经测试,这个帖子只需要一个subCmd的参数就可以正常返回,因此不必根据得到内容更新帖子参数   #自我。data2=自我。_get_static_post_attr (middle_content self.data2)      #这个帖子请求完成了预约功能!   r=self.s.post(自我。order_url self.data2)      自我。final_content=r.content      def _is_success(自我、文本):   ”“”   接受最终的html内容,判断是否成功,并触发日志记录和邮件提醒   ”“”   如果' & lt;编辑id=" MessageTip "祝辞已经存在有效的预约记录。;/h6>“以文本:   self.clear_error_once(“[完成了!)你已经订购一个座位!”)   elif & lt;编辑id=" MessageTip "祝辞选择的日期不允许预约。;/h6>“以文本:   self.clear_error_once(“[完成了!日期是错误的!”)   elif & lt;编辑id=" MessageTip "祝辞所选座位已经被预约。;/h6>“以文本:   self.clear_error_once(“[完成了!)这个座位不可用,可能由他人!”)   elif & lt;编辑id=" MessageTip "祝辞座位预约成功的文本:   self.clear_error_once(“[完成了!)成功!电子邮件是发送你!”)   发送邮件。send_mail (' BJTU库Seat_NO: ' +自我。seatNO +的命令!”   机器人的发送。不要回复此邮件!”,self.mailto)   其他:   self.error_log_once(“错误!302年到登录页面)      def error_log_once(自我、文本=默认错误(一次)):   试一试:   is_error_file=(“开放。/isopen_xy。txt”、“r”)   除了:   is_error_file=(“开放。/isopen_xy。txt”、“w”)   如果' 1 '不在is_error_file.read ():   打印日志的书写错误……”   self.error_log(文本)   其他:   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null

Python请求模拟登录实现图书馆座位自动预约