<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關(guān)鍵字專題關(guān)鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當前位置: 首頁 - 科技 - 知識百科 - 正文

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

        來源:懂視網(wǎng) 責(zé)編:小OO 時間:2020-11-27 14:21:54
        文檔

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

        本文實例為大家分享了Python實現(xiàn)圖書館座位自動預(yù)約的具體代碼,供大家參考,具體內(nèi)容如下:配置;通過公網(wǎng)主機定時運行腳本,并發(fā)送郵件到自己的qq郵箱,這樣在微信就會有消息提示是否預(yù)約成功。vim /etc/crontab。設(shè)置每到早上7:01自動運行腳本即可。程序流程;(以yuyue.juneberry.cn網(wǎng)站為例)。get訪問登錄頁面,獲取cookie和表單里面的隱藏post字段。構(gòu)造登錄post數(shù)據(jù),加入從表單里面拿到的隱藏post字段。post構(gòu)造后的數(shù)據(jù),模擬登錄,激活cookie(使cookie有登入權(quán)限)。get訪問座位預(yù)約界面,激活cookie(使cookie有預(yù)約座位權(quán)限)。post預(yù)約請求,實現(xiàn)預(yù)約座位。解析返回結(jié)果,判斷是否成功,并郵件提醒。要點;
        推薦度:
        導(dǎo)讀本文實例為大家分享了Python實現(xiàn)圖書館座位自動預(yù)約的具體代碼,供大家參考,具體內(nèi)容如下:配置;通過公網(wǎng)主機定時運行腳本,并發(fā)送郵件到自己的qq郵箱,這樣在微信就會有消息提示是否預(yù)約成功。vim /etc/crontab。設(shè)置每到早上7:01自動運行腳本即可。程序流程;(以yuyue.juneberry.cn網(wǎng)站為例)。get訪問登錄頁面,獲取cookie和表單里面的隱藏post字段。構(gòu)造登錄post數(shù)據(jù),加入從表單里面拿到的隱藏post字段。post構(gòu)造后的數(shù)據(jù),模擬登錄,激活cookie(使cookie有登入權(quán)限)。get訪問座位預(yù)約界面,激活cookie(使cookie有預(yù)約座位權(quán)限)。post預(yù)約請求,實現(xiàn)預(yù)約座位。解析返回結(jié)果,判斷是否成功,并郵件提醒。要點;

        這篇文章主要為大家詳細介紹了Python Requests的模擬登錄,Python實現(xiàn)圖書館座位自動預(yù)約,具有一定的參考價值,感興趣的小伙伴們可以參考一下

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

        配置

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

        vim /etc/crontab

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

        程序流程

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

      1. get訪問登錄頁面,獲取cookie和表單里面的隱藏post字段

      2. 構(gòu)造登錄post數(shù)據(jù),加入從表單里面拿到的隱藏post字段

      3. post構(gòu)造后的數(shù)據(jù),模擬登錄,激活cookie(使cookie有登入權(quán)限)

      4. get訪問座位預(yù)約界面,激活cookie(使cookie有預(yù)約座位權(quán)限)

      5. post預(yù)約請求,實現(xiàn)預(yù)約座位

      6. 解析返回結(jié)果,判斷是否成功,并郵件提醒

      7. 要點

      8. requests庫中的requests.session() 能夠創(chuàng)建可傳遞cookies的會話

      9. 拿到<input type=hidden>的數(shù)據(jù)并傳遞到post的數(shù)據(jù)中

      10. 抓包判斷網(wǎng)站邏輯,篩選出各個請求的參數(shù),并在程序中實現(xiàn)

      11. 函數(shù)解釋

      12. class FUCK()主類

      13. _get_date_str(self):獲取當前日期,并加上一天,用這個函數(shù)構(gòu)造url的特征字段(圖書館設(shè)置提前一天預(yù)約座位)

      14. def _get_order_url(self):構(gòu)造"預(yù)約座位"的post目標url

      15. def _get_static_post_attr:這個函數(shù)解析get請求的返回頁面,并從中提取出<input type=hidden>的字段,用于之后的構(gòu)造post數(shù)據(jù)

      16. def login(self):實現(xiàn)登錄功能

      17. def run(self):實現(xiàn)座位預(yù)約功能

      18. def _is_success(self, text):判斷預(yù)約結(jié)果

      19. def error_log_once(self, text='default error (once)'):

      20. def error_log(self, text='default error'):這兩個函數(shù)設(shè)置程序狀態(tài)為"已經(jīng)出錯"或者"未出錯"狀態(tài)(用于自動化運行的時候避免將重復(fù)的錯誤信息寫入日志)

      21. def error_log(self, text='default error'):單次將錯誤信息寫入本地日志

      22. sendmail.send_mail()郵件發(fā)送模塊

      23. 代碼及注釋

        # /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ù)初始化,用戶名,密碼,要預(yù)約的座位號,接受預(yù)約結(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+學(xué)號
         'txt_Password': self.password, # 密碼
         'selSchool': 60, # 60表示北京交通大學(xué)
         }
        
         # 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沒有預(yù)約權(quán)限,
         # 訪問這個get之后,會使cookie擁有預(yù)約權(quán)限,從而執(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請求完成了預(yù)約功能!
         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)存在有效的預(yù)約記錄。</h5>' in text:
         self.clear_error_once('[done!] You already ordered a seat!')
         elif '<h5 id="MessageTip">選擇的日期不允許預(yù)約。</h5>' in text:
         self.clear_error_once('[done!] Date is wrong!')
         elif '<h5 id="MessageTip">所選座位已經(jīng)被預(yù)約。</h5>' in text:
         self.clear_error_once('[done!] This seat is not available, maybe taken by others!')
         elif '<h5 id="MessageTip">座位預(yù)約成功' 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
        ')
         is_error_file.close()
        
         f = open("./log_xy.txt", 'a')
         f.write(time.strftime("%Y-%m-%d %X", time.localtime()) + text + '
        ')
         f.close()
        
         def clear_error_once(self, text='success'):
         print text
         is_error_file = open('./isopen_xy.txt', 'w')
         is_error_file.write('0
        ')
         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
        '
         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])

        聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

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

        本文實例為大家分享了Python實現(xiàn)圖書館座位自動預(yù)約的具體代碼,供大家參考,具體內(nèi)容如下:配置;通過公網(wǎng)主機定時運行腳本,并發(fā)送郵件到自己的qq郵箱,這樣在微信就會有消息提示是否預(yù)約成功。vim /etc/crontab。設(shè)置每到早上7:01自動運行腳本即可。程序流程;(以yuyue.juneberry.cn網(wǎng)站為例)。get訪問登錄頁面,獲取cookie和表單里面的隱藏post字段。構(gòu)造登錄post數(shù)據(jù),加入從表單里面拿到的隱藏post字段。post構(gòu)造后的數(shù)據(jù),模擬登錄,激活cookie(使cookie有登入權(quán)限)。get訪問座位預(yù)約界面,激活cookie(使cookie有預(yù)約座位權(quán)限)。post預(yù)約請求,實現(xiàn)預(yù)約座位。解析返回結(jié)果,判斷是否成功,并郵件提醒。要點;
        推薦度:
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 国产精品视频全国免费观看| 国产成人亚洲精品蜜芽影院| 国产婷婷成人久久Av免费高清 | 日本亚洲色大成网站www久久 | 国产成人综合久久精品亚洲| 精品剧情v国产在免费线观看| 亚洲av永久无码精品天堂久久| 毛片视频免费观看| 亚洲日韩精品A∨片无码加勒比| 啦啦啦中文在线观看电视剧免费版 | 亚洲日韩人妻第一页| 国产精品成人免费观看| 日本红怡院亚洲红怡院最新 | 成年女人A毛片免费视频| 亚洲韩国精品无码一区二区三区| a级成人毛片免费视频高清| 亚洲AV人人澡人人爽人人夜夜 | 国产精品成人免费综合| 暖暖免费中文在线日本| 亚洲精品制服丝袜四区| 五月亭亭免费高清在线| 亚洲一本到无码av中文字幕 | 五月婷婷亚洲综合| 成人免费777777被爆出| 亚洲精品白色在线发布| 好大好硬好爽免费视频| 国产精品美女久久久免费| 亚洲综合一区二区国产精品| 成人无遮挡裸免费视频在线观看| 精品国产_亚洲人成在线| 久久精品亚洲综合| 在线观看免费大黄网站| 中文字幕成人免费高清在线视频| 亚洲激情视频网站| 亚洲成A人片在线观看无码3D| 亚洲视频在线观看免费| 久久亚洲AV成人无码国产最大| 亚洲三区在线观看无套内射| 最近中文字幕mv免费高清视频8| 色五月五月丁香亚洲综合网| 亚洲av午夜福利精品一区人妖|