欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

python實現(xiàn)圖書館研習室自動預約功能

 更新時間:2018年04月27日 10:18:09   作者:Q_QuanTing  
這篇文章主要為大家詳細介紹了python實現(xiàn)圖書館研習室自動預約功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下

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

簡介

現(xiàn)在好多學校為學生提供了非常良好的學習環(huán)境,通常體現(xiàn)在自習教室的設(shè)施設(shè)備上。對此不得不提一句的就是我們學校的圖書館,隨著新圖書館的修建,館內(nèi)也設(shè)置了多個功能區(qū),每層分為A、B、C、D四個區(qū)域,由南北連廊相連,中間由旋轉(zhuǎn)樓梯貫通一至五層。A區(qū)為自修區(qū);B區(qū)和C區(qū)為藏閱一體的社會科學和自然科學書庫;D區(qū)為專項功能區(qū),包含影視廳、數(shù)字媒體創(chuàng)客體驗中心、智慧培訓教室、云桌面電子閱覽室等;B、C區(qū)東西連廊設(shè)有大小十二間研習室;南北連廊設(shè)有休閑閱讀區(qū)。

上面那段我是從圖書館官網(wǎng)上抄的,不過真的得為學校的圖書館點個贊?;貧w本篇文章正題,學校免費為廣大師生提供了舒適優(yōu)良設(shè)備齊全的研習室。但是這些研習室是需要進行網(wǎng)上預約才能夠進入使用,每天的00:00開啟下一天的預約,因此要想約到一個時間段(3小時)的研習室,可謂得“挑燈夜戰(zhàn)”。當然,在這個過程中手速快將有巨大的優(yōu)勢。如果晚上休息的早,手速又不快,基本上就別想預約到研習室了。剛剛好最近學了一點python爬蟲,就打算用爬蟲幫我完成這個艱巨的任務了。哈哈哈哈?。╬s:防止惡意訪問,所有鏈接就不放了哈)

python實現(xiàn)思路

想想思路還是挺簡單的,無非就是登錄賬號、查找房間、提交預約。那就讓我們試試看:

登錄賬號

首先打開我們研習室預約的登錄界面,鏈接為:U2FsdGVkX19NdfJkghN54Msvy1zl7AucRur/ct0nz4orPI7uLkSDsvuFMgr0fGcO
rn9Z/f8h3bds9w==

好吧,這第一步登錄賬號就非??简炍疫@個新手了,不過不能慫。通過參考其他一些大佬使用的方法,就是打開firefox的firebug(ctrl+shift+e)查看網(wǎng)絡(luò)情況,在這個情況下進行一次正常的登錄。

可以看到我們這里有個post,到時便可以使用python中requests.post方法。

為了能夠成功的登錄,要隱藏自己是個爬蟲的身份,在消息頭中,可以看到我們的請求頭,只要將參數(shù)都復制過來,組成自己的headers = {…}來欺騙服務器。

看一下參數(shù)這一頁,這里的表單數(shù)據(jù)只有三個,分別對應著驗證碼、賬號和密碼。將這里的參數(shù)復制過來,就可以組成我們的data = {…}。其中需要我們的注意的就是這個驗證碼,無論是人工“自”能識別,還是機器自動識別,都需要將驗證碼保存為本地文件。如此一來,就有了一個問題,每訪問一次服務器,驗證碼就會變換?,F(xiàn)在讓我們好好捋捋思路,首先我們得獲得驗證碼并將其保存在本地,這就需要訪問一次服務器,最后我們要提交我們的參數(shù)進行登錄,這又再一次訪問了服務器,這次的驗證碼和我們獲取的驗證碼已經(jīng)不是同一個驗證碼了。在剛剛開始的嘗試中我無論如何無法登錄服務器,就是兩次的驗證碼不匹配。如何實現(xiàn)第一次獲取的驗證碼和提交時的驗證碼相一致呢?

這里就需要同一個cookie在上面的幾個圖中,我們都能看到有個cookie值。要保證同步,這里就需要做到,我們獲取驗證碼時的cookie值和提交賬號密碼時的cookie值一致。因此,在我的程序中,我先做的一個步驟時先獲取一個cookie值,然后將這個cookie值作為headers中的一個參數(shù)。登錄的思路就是這樣了,補充一句,這里的驗證碼我是自己手動識別的>﹏<。

查找房間

這個步驟其實是一個無用的步驟,為什么有這個步驟,按照人為預約習慣,我們會產(chǎn)生怎么一個步驟,但是如果使用爬蟲,只要成功登錄之后就可以直接提交預約的表單。當然,如果要使得自動預約程序更加智能,便可以添加這個步驟,可以查看那些房間是還可以預約的,在這里自定義的補充一些規(guī)則。我就略過了。。。

提交預約

同登錄一樣,我們也手動的提交一次,去查看網(wǎng)絡(luò)情況,便可以用python模擬這一個過程。在這里我就不在貼圖進行解釋,這里提交也是用requests.post的方法。不過一點要注意的是,這里的headers和登錄時的headers是不一樣的,所以在此提醒各位,如果在其他類似的預約程序中可以注意看看不同內(nèi)容post時的headers是否一致。我在這里就被坑了一會。

#!/usr/bin/env python 
# _*_ coding:utf-8 _*_ 
# 
# @Version : 1.0 
# @Time  : 2018/4/10 
# @Author : 圈圈烴
# @File  : reservation_4.py 

import requests
import re
import json
import datetime
import time


def get_cookies():
  """獲得cookies"""
  url = 'http://**************'
  s = requests.session()
  s.get(url)
  ck_dict = requests.utils.dict_from_cookiejar(s.cookies)   # 將jar格式轉(zhuǎn)化為dict
  ck = 'JSESSIONID=' + ck_dict['JSESSIONID']         # 重組cookies

  """獲得二維碼"""
  path = './code.png'
  get_cookies_headers = {
    'user-anget': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:59.0) Gecko/20100101 Firefox/59.0',
    'Cookie': ck}
  get_cookies_url = 'http://**************'
  code_image = requests.get(get_cookies_url, headers=get_cookies_headers)
  with open(path, 'wb') as fn:
    fn.write(code_image.content)
    fn.close()
    print('驗證碼保存成功')
  return ck


def login(cookies, hour, minute):
  login_headers = {
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
    'Accept-Encoding': 'gzip, deflate',
    'Accept-Language': 'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2',
    'Cache-Control': 'no-cache',
    'Connection': 'keep-alive',
    'Content-Length': '45',
    'Content-Type': 'application/x-www-form-urlencoded',
    'Cookie': cookies,
    'Host': '**************',
    'Pragma': 'no-cache',
    'Referer': 'http://**************',
    'Upgrade-Insecure-Requests': '1',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:59.0) Gecko/20100101 Firefox/59.0'
  }
  login_url = 'http://**************'
  login_data = {
    'codeImage': input('請輸入驗證碼:'),
    'uname': '**************',
    'upass': '**************'
  }
  requests.post(login_url, data=login_data, headers=login_headers)

  res = requests.get('http://**************', headers=login_headers)
  reg_h = r'<option value=(.*?)>\d{4}-\d{2}-\d{2}' # 匹配可提供預約的hash
  value_h = re.findall(reg_h, res.text)

  """定時"""
  counter = 0
  while (True):
    now = datetime.datetime.now() # 獲取當前系統(tǒng)時間
    if now.hour == hour and now.minute == minute:
      break
    time.sleep(0.5)
    # print(now)
    counter = counter + 1
    if counter == 240:
      res = requests.get('http://**************', headers=login_headers)
      reg_h = r'<option value=(.*?)>\d{4}-\d{2}-\d{2}' # 匹配可提供預約的hash
      reg_t = r'(\d{4}-\d{2}-\d{2})' # 匹配可提供預約的日期
      value_h = re.findall(reg_h, res.text)
      value_t = re.findall(reg_t, res.text)
      with open('./con_log.txt', 'a') as fjs:
        fjs.write(eval(value_h[-1])+' '+value_t[-1]+' '+str(now)+' \n')
        fjs.close()
        print('保存成功')
      counter = 0

  return str(eval(value_h[-1]))


def reservation(day_hash, cookies, stime, etime):
  reservation_data = {
    '_etime': etime, # 結(jié)束時間11點,其值為11*60=660
    '_roomid': '1285b3ca77594b3095c7b89d4922553c', # 房間Id
    '_seatno': '',
    '_stime': stime,  # 開始時間8點,其值為8*60=480
    '_subject': '學習', # 研討主題
    '_summary': '學習', # 研討大綱
    'ruleId': day_hash,
    'usercount': 3,   # 預約人數(shù)
    'users': '**************', # 學號
    'UUID': '**************'
  }

  reservation_headers = {
    'Accept': 'application/json, text/javascript, */*; q=0.01',
    'Accept-Encoding': 'gzip, deflate',
    'Accept-Language': 'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2',
    'Cache-Control': 'no-cache',
    'Connection': 'keep-alive',
    'Content-Length': '239',
    'Content-Type': 'application/json',
    'Cookie': cookies,
    'Host': '**************',
    'Pragma': 'no-cache',
    'Referer': 'http://**************',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:59.0) Gecko/20100101 Firefox/59.0'
  }
  reservation_js = json.dumps(reservation_data)
  reservation_url = 'http://**************'
  status = requests.post(reservation_url, data=reservation_js, headers=reservation_headers)
  # print(stime, etime)
  # print(status)
  print(status.text)


def main():
  """預約策略一:11:20-20.40"""
  full_stime = ['1060', '870', '680']
  full_etime = ['1240', '1050', '860']
  """預約策略二:10:00-13:00;13:50-16:50;17:40-20:40"""
  stime = ['1060', '830', '600']
  etime = ['1240', '1010', '780']
  cookies = get_cookies()
  day_hash = login(cookies, 0, 0)   # 設(shè)定定時時間
  for i in range(0, 3):
    reservation(day_hash, cookies, stime[i], etime[i])


if __name__ == '__main__':
  main()

實現(xiàn)效果

自從學了python,媽媽再也不用擔心我搶不到研習室了。在程序中加幾行定時的程序之后,便可以在00:00自動幫我預約研習室了。通過測試發(fā)現(xiàn),預約時很大程度上是能夠約到房間的,例如在4-12號,約好三個時間段是用了7秒,但是在4-13號居然花了21秒,而且使得一個時間段被其他同學約走了。當然這個程序還需要進一步改進,實現(xiàn)完勝“手速”。

補在最后

還有不足,歡迎交流。

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

相關(guān)文章

  • Python自動化辦公之文件整理腳本分享

    Python自動化辦公之文件整理腳本分享

    這篇文章主要為大家分享了一個Python自動化辦公腳本,可以實現(xiàn)文件整理,這是一個很有用的技能,可以幫助你管理你的電腦上的各種文件,需要的可以收藏一下
    2023-08-08
  • python實現(xiàn)MongoDB的雙活示例

    python實現(xiàn)MongoDB的雙活示例

    本文主要介紹了python實現(xiàn)MongoDB的雙活示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-02-02
  • python數(shù)據(jù)分析之如何刪除value=0的行

    python數(shù)據(jù)分析之如何刪除value=0的行

    這篇文章主要給大家介紹了關(guān)于python數(shù)據(jù)分析之如何刪除value=0的行的相關(guān)資料,文中通過實例代碼以及圖文介紹的非常詳細,對大家學習或者使用Python具有一定的參考學習價值,需要的朋友可以參考下
    2022-12-12
  • Python實現(xiàn)異常檢測LOF算法的示例代碼

    Python實現(xiàn)異常檢測LOF算法的示例代碼

    這篇文章主要為大家介紹一個經(jīng)典的異常檢測算法:局部離群因子(Local Outlier Factor),簡稱LOF算法。感興趣的小伙伴可以跟隨小編一起了解一下
    2022-03-03
  • python使用布隆過濾器的實現(xiàn)示例

    python使用布隆過濾器的實現(xiàn)示例

    這篇文章主要介紹了python使用布隆過濾器的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-08-08
  • python讀取一個目錄下所有txt里面的內(nèi)容方法

    python讀取一個目錄下所有txt里面的內(nèi)容方法

    今天小編就為大家分享一篇python讀取一個目錄下所有txt里面的內(nèi)容方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-06-06
  • python實現(xiàn) 獲取b站主播直播間 粉絲牌信息的方法

    python實現(xiàn) 獲取b站主播直播間 粉絲牌信息的方法

    這篇文章主要介紹了python實現(xiàn) 獲取b站主播直播間粉絲牌信息 ,用于實現(xiàn)通過牌子逆向查主播信息這個功能,本文結(jié)合實例代碼給大家介紹的非常詳細,需要的朋友可以參考下
    2023-02-02
  • 淺談Python描述數(shù)據(jù)結(jié)構(gòu)之KMP篇

    淺談Python描述數(shù)據(jù)結(jié)構(gòu)之KMP篇

    這篇文章主要介紹了Python描述數(shù)據(jù)結(jié)構(gòu)之KMP篇,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-09-09
  • python實現(xiàn)windows倒計時鎖屏功能

    python實現(xiàn)windows倒計時鎖屏功能

    這篇文章主要介紹了python實現(xiàn)windows倒計時鎖屏功能,代碼簡單易懂,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-07-07
  • flask上傳作品之dbm操作的實現(xiàn)

    flask上傳作品之dbm操作的實現(xiàn)

    本文主要介紹了flask上傳作品之dbm操作的實現(xiàn),文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-04-04

最新評論