本文實例為大家分享了Python實現(xiàn)圖書館座位自動預(yù)約的具體代碼,供大家參考,具體內(nèi)容如下
創(chuàng)新互聯(lián)從2013年成立,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項目成都做網(wǎng)站、網(wǎng)站建設(shè)網(wǎng)站策劃,項目實施與項目整合能力。我們以讓每一個夢想脫穎而出為使命,1280元紅橋做網(wǎng)站,已為上家服務(wù),為紅橋各地企業(yè)和個人服務(wù),聯(lián)系電話:13518219792配置
通過公網(wǎng)主機定時運行腳本,并發(fā)送郵件到自己的qq郵箱,這樣在微信就會有消息提示是否預(yù)約成功
vim /etc/crontab
設(shè)置每到早上7:01自動運行腳本即可
程序流程
(以yuyue.juneberry.cn網(wǎng)站為例)
要點
函數(shù)解釋
代碼及注釋
# /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 '<h6 id="MessageTip">已經(jīng)存在有效的預(yù)約記錄。</h6>' in text: self.clear_error_once('[done!] You already ordered a seat!') elif '<h6 id="MessageTip">選擇的日期不允許預(yù)約。</h6>' in text: self.clear_error_once('[done!] Date is wrong!') elif '<h6 id="MessageTip">所選座位已經(jīng)被預(yù)約。</h6>' in text: self.clear_error_once('[done!] This seat is not available, maybe taken by others!') elif '<h6 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\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])
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機、免備案服務(wù)器”等云主機租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。
網(wǎng)站名稱:PythonRequests模擬登錄實現(xiàn)圖書館座位自動預(yù)約-創(chuàng)新互聯(lián)
轉(zhuǎn)載來源:http://bm7419.com/article12/cdejgc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供App開發(fā)、網(wǎng)站內(nèi)鏈、外貿(mào)網(wǎng)站建設(shè)、定制開發(fā)、App設(shè)計、品牌網(wǎng)站設(shè)計
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容