最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python Requests模擬登錄實現(xiàn)圖書館座位自動預約

 更新時間:2018年04月27日 10:07:09   作者:Xyntax  
這篇文章主要為大家詳細介紹了Python Requests的模擬登錄,Python實現(xiàn)圖書館座位自動預約,具有一定的參考價值,感興趣的小伙伴們可以參考一下

本文實例為大家分享了Python實現(xiàn)圖書館座位自動預約的具體代碼,供大家參考,具體內(nèi)容如下

配置

通過公網(wǎng)主機定時運行腳本,并發(fā)送郵件到自己的qq郵箱,這樣在微信就會有消息提示是否預約成功

vim /etc/crontab

設置每到早上7:01自動運行腳本即可

程序流程

(以yuyue.juneberry.cn網(wǎng)站為例)

  • get訪問登錄頁面,獲取cookie和表單里面的隱藏post字段
  • 構造登錄post數(shù)據(jù),加入從表單里面拿到的隱藏post字段
  • post構造后的數(shù)據(jù),模擬登錄,激活cookie(使cookie有登入權限)
  • get訪問座位預約界面,激活cookie(使cookie有預約座位權限)
  • post預約請求,實現(xiàn)預約座位
  • 解析返回結(jié)果,判斷是否成功,并郵件提醒

要點

  • requests庫中的requests.session() 能夠創(chuàng)建可傳遞cookies的會話
  • 拿到<input type=hidden>的數(shù)據(jù)并傳遞到post的數(shù)據(jù)中
  • 抓包判斷網(wǎng)站邏輯,篩選出各個請求的參數(shù),并在程序中實現(xiàn)

函數(shù)解釋

  • class FUCK()主類
  • _get_date_str(self):獲取當前日期,并加上一天,用這個函數(shù)構造url的特征字段(圖書館設置提前一天預約座位)
  • def _get_order_url(self):構造"預約座位"的post目標url
  • def _get_static_post_attr:這個函數(shù)解析get請求的返回頁面,并從中提取出<input type=hidden>的字段,用于之后的構造post數(shù)據(jù)
  • def login(self):實現(xiàn)登錄功能
  • def run(self):實現(xiàn)座位預約功能
  • def _is_success(self, text):判斷預約結(jié)果
  • def error_log_once(self, text='default error (once)'):
  • def error_log(self, text='default error'):這兩個函數(shù)設置程序狀態(tài)為"已經(jīng)出錯"或者"未出錯"狀態(tài)(用于自動化運行的時候避免將重復的錯誤信息寫入日志)
  • def error_log(self, text='default error'):單次將錯誤信息寫入本地日志
  • sendmail.send_mail()郵件發(fā)送模塊

代碼及注釋

# /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):
 """
  以四個參數(shù)初始化,用戶名,密碼,要預約的座位號,接受預約結(jié)果提醒郵件的郵箱
 """
  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() # 創(chuàng)建可傳遞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-www-form-urlencoded',
  }

  self.login()
  self.run()
  self._is_success(self.final_content)

  # 懷疑程序出錯時,取消下行注釋,可打印一些參數(shù)
  # self._debug()

 def _get_date_str(self):
  s = time.localtime(time.time())
  ########333
  date_str = str(s.tm_year) + '%2f' + str(s.tm_mon) + '%2f' + str(s.tm_mday + 1)
  date_str = date_str.replace('%2f1%2f32', '%2f2%2f1') \
   .replace('%2f2%2f29', '%2f3%2f1') \
   .replace('%2f3%2f32', '%2f4%2f1') \
   .replace('%2f4%2f31', '%2f5%2f1') \
   .replace('%2f5%2f32', '%2f6%2f1') \
   .replace('%2f6%2f31', '%2f7%2f1') \
   .replace('%2f7%2f32', '%2f8%2f1') \
   .replace('%2f8%2f32', '%2f9%2f1') \
   .replace('%2f9%2f31', '%2f10%2f1') \
   .replace('%2f10%2f32', '%2f11%2f1') \
   .replace('%2f11%2f31', '%2f12%2f1') \
   .replace('%2f12%2f32', '%2f1%2f1')
  return date_str

 def _get_order_url(self):
  return "http://yuyue.juneberry.cn/BookSeat/BookSeatMessage.aspx?seatNo=101001" + self.seatNO + "&seatShortNo=01" + self.seatNO + "&roomNo=101001&date=" + self._get_date_str()

 def _get_static_post_attr(self, page_content, data_dict):
  """
  拿到<input type='hidden'>的post參數(shù),并添加到post_data中
  """
  soup = BeautifulSoup(page_content, "html.parser")
  for each in soup.find_all('input'):
   if 'value' in each.attrs and 'name' in each.attrs:
    data_dict[each['name']] = each['value'] # 添加到login的post_data中
    # self.data2[each['name']] = each['value'] # 添加到order的post_data中
  return data_dict

 def _debug(self):

  print self.order_url
  print self.data1
  print self.data2
  print self.headers
  print self.s.cookies

  # print self.login_content
  # print self.middle_content
  print self.final_content

 def login(self):
  homepage_content = self.s.get(self.base_url).content
  self.data1 = self._get_static_post_attr(homepage_content, self.data1)
  r = self.s.post(self.login_url, self.data1)
  self.login_content = r.content

 def run(self):

  # 這個get的意思是:原先的cookie沒有預約權限,
  # 訪問這個get之后,會使cookie擁有預約權限,從而執(zhí)行下一個post
  self.middle_content = self.s.get('http://yuyue.juneberry.cn/BookSeat/BookSeatListForm.aspx').content

  # 經(jīng)測試,這個post只需要一個subCmd的參數(shù)就可以正常返回,因此不必根據(jù)get內(nèi)容更新post參數(shù)
  # self.data2 = self._get_static_post_attr(middle_content, self.data2)

  # 這個post請求完成了預約功能!
  r = self.s.post(self.order_url, self.data2)

  self.final_content = r.content

 def _is_success(self, text):
  """
  接受最終的html內(nèi)容,判斷是否成功,并觸發(fā)日志記錄和郵件提醒
  """
  if '<h5 id="MessageTip">已經(jīng)存在有效的預約記錄。</h5>' in text:
   self.clear_error_once('[done!] You already ordered a seat!')
  elif '<h5 id="MessageTip">選擇的日期不允許預約。</h5>' in text:
   self.clear_error_once('[done!] Date is wrong!')
  elif '<h5 id="MessageTip">所選座位已經(jīng)被預約。</h5>' in text:
   self.clear_error_once('[done!] This seat is not available, maybe taken by others!')
  elif '<h5 id="MessageTip">座位預約成功' in text:
   self.clear_error_once('[done!] Success! An email is sending to you!')
   sendmail.send_mail('BJTU Library Seat_NO:' + self.seatNO + 'ordered!',
        'Sending by robot. Do not reply this mail!', self.mailto)
  else:
   self.error_log_once('Error! 302 to login page')

 def error_log_once(self, text='default error (once)'):
  try:
   is_error_file = open('./isopen_xy.txt', 'r')
  except:
   is_error_file = open('./isopen_xy.txt', 'w')
  if '1' not in is_error_file.read():
   print 'writting error to log...'
   self.error_log(text)
  else:
   print 'already written to log'
  is_error_file.close()
  sendmail.send_mail('BJTU_Library system error once !', 'error text!')

 def error_log(self, text='default error'):
  is_error_file = open('./isopen_xy.txt', 'w')
  is_error_file.write('1\n')
  is_error_file.close()

  f = open("./log_xy.txt", 'a')
  f.write(time.strftime("%Y-%m-%d %X", time.localtime()) + text + '\n')
  f.close()

 def clear_error_once(self, text='success'):
  print text
  is_error_file = open('./isopen_xy.txt', 'w')
  is_error_file.write('0\n')
  is_error_file.close()


if __name__ == '__main__':
 if len(sys.argv) < 5:
  print 'Usage: python library.py [username] [password] [seat_NO] [email]'
  print 'eg. python library.py S13280001 123456 003 XXXX@qq.com\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])

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • python實現(xiàn)手勢識別的示例(入門)

    python實現(xiàn)手勢識別的示例(入門)

    這篇文章主要介紹了python實現(xiàn)手勢識別的示例(入門),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-04-04
  • Python使用Qt5實現(xiàn)水平導航欄的示例代碼

    Python使用Qt5實現(xiàn)水平導航欄的示例代碼

    本文主要介紹了Python使用Qt5實現(xiàn)水平導航欄的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-03-03
  • Python使用pywebview開發(fā)桌面應用的全過程

    Python使用pywebview開發(fā)桌面應用的全過程

    當使用桌面應用程序的時候,有沒有那么一瞬間,想學習一下桌面應用程序開發(fā)?下面這篇文章主要給大家介紹了關于Python使用pywebview開發(fā)桌面應用的相關資料,需要的朋友可以參考下
    2022-06-06
  • python實現(xiàn)簡單的飛機大戰(zhàn)

    python實現(xiàn)簡單的飛機大戰(zhàn)

    這篇文章主要為大家詳細介紹了python實現(xiàn)簡單的飛機大戰(zhàn),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • python基于itchat模塊實現(xiàn)微信防撤回

    python基于itchat模塊實現(xiàn)微信防撤回

    這篇文章主要為大家詳細介紹了python實現(xiàn)微信防撤回,基于itchat模塊,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-04-04
  • Python函數(shù)式編程指南(三):迭代器詳解

    Python函數(shù)式編程指南(三):迭代器詳解

    這篇文章主要介紹了Python函數(shù)式編程指南(三):迭代器詳解,本文講解了迭代器(Iterator)概述、使用迭代器、生成器表達式(Generator expression)和列表解析(List Comprehension)等內(nèi)容,需要的朋友可以參考下
    2015-06-06
  • python處理圖片之PIL模塊簡單使用方法

    python處理圖片之PIL模塊簡單使用方法

    這篇文章主要介紹了python處理圖片之PIL模塊簡單使用方法,涉及Python使用PIL模塊實現(xiàn)針對圖片的銳化、繪制直線、繪制橢圓等相關技巧,需要的朋友可以參考下
    2015-05-05
  • Python繪制交通流折線圖詳情

    Python繪制交通流折線圖詳情

    這篇文章主要介紹了Python繪制交通流折線圖詳情,文章基于python的相關資料展開折線圖繪制的實現(xiàn)流程,感興趣的小伙伴可以參考一下
    2022-06-06
  • 用python寫一個windows下的定時關機腳本(推薦)

    用python寫一個windows下的定時關機腳本(推薦)

    由于本人經(jīng)常使用筆記本共享WiFi,但是又不想筆記本開機一夜,每次都是使用dos命令關機,感覺好麻煩,然后小編想到用python寫一個定時關機的腳本,具體實例代碼請參考本文
    2017-03-03
  • Python元類基礎知識示例深度剖析

    Python元類基礎知識示例深度剖析

    這篇文章主要為大家介紹了Python元類基礎知識深度剖析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-06-06

最新評論

荥经县| 宣武区| 台东市| 滨海县| 贵州省| 内江市| 滦平县| 余庆县| 历史| 阿鲁科尔沁旗| 民乐县| 鄂尔多斯市| 宣恩县| 上虞市| 织金县| 嫩江县| 息烽县| 文山县| 明溪县| 修水县| 潞城市| 荣昌县| 沙雅县| 霍州市| 双城市| 涿鹿县| 蚌埠市| 中西区| 密山市| 奉新县| 泸水县| 临汾市| 报价| 津市市| 莱阳市| 南投县| 辉南县| 德兴市| 静乐县| 石泉县| 东乌|