Cet article présente principalement en détail la connexion simulée des requêtes Python. Python réalise la réservation automatique des places de bibliothèque, qui a une certaine valeur de référence. Les amis intéressés peuvent s'y référer
L'exemple de cet article est partagé par tout le monde. le code spécifique pour la réservation automatique des places de bibliothèque en Python pour votre référence. Le contenu spécifique est le suivant
Configuration
Exécutez régulièrement le script via l'hôte du réseau public et envoyez-le Envoyez l'e-mail à votre boîte aux lettres QQ, afin qu'il y ait un message sur WeChat pour vous demander si le rendez-vous est réussi
vim /etc/crontab
Définir chaque matin à 7h01 Exécuter automatiquement le script
Déroulement du programme
(Prenez le site yuyue.juneberry.cn comme exemple)
obtenir Visitez la page de connexion, obtenez le cookie et le champ de publication masqué dans le formulaire
, construisez les données de publication de connexion et ajoutez le champ de publication masqué obtenu à partir du formulaire
Publier les données construites, simuler la connexion, activer le cookie (autoriser le cookie à se connecter)
accéder au siège interface de réservation, activer le cookie (autoriser le cookie à réserver un siège)
Publier la demande de réservation pour réaliser la réservation de siège
Analyser le résultat du retour, déterminer si cela réussit et envoyez un rappel par e-mail
Points clés
demandes. session() dans la bibliothèque de requêtes Possibilité de créer une session pouvant transmettre des cookies
Récupérer les données de et transmettre aux données de publication
Capturez le paquet pour juger de la logique du site Web, filtrez les paramètres de chaque demande et implémentez
explication de la fonction dans la classe du programme FUCK()Classe principale
_get_date_str(self):Obtenez la date actuelle et ajoutez un jour, utilisez cette fonction pour construire le champ caractéristique de l'url ( La bibliothèque est configurée pour réserver des places un jour à l'avance)
def _get_order_url(self):Construire le post URL cible des "sièges de réserve"
def _get_static_post_attr :Cette fonction analyse la page de retour de la requête get et extrait les champs de
def login(self):Implémenter la fonction de connexion
def run(self):Implémenter la fonction de réservation de siège
def _is_success(self, text):Juger le résultat de la réservation
def error_log_once( self, text='erreur par défaut (une fois)') :
def error_log(self , text='default error') :Ces deux fonctions définissent l'état du programme sur "Erreur déjà" ou "Aucune erreur" (utilisé pour éviter d'écrire des messages d'erreur répétés dans le journal pendant le fonctionnement automatisé)
def error_log( self, text='default error'):Écrivez les informations d'erreur dans le journal local une fois
envoyer un mail. send_mail()Module d'envoi de mail
Code et commentaires
Recommandations associées :
# /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): """ 以四个参数初始化,用户名,密码,要预约的座位号,接受预约结果提醒邮件的邮箱 """ 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() # 创建可传递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) # 怀疑程序出错时,取消下行注释,可打印一些参数 # 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参数,并添加到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拥有预约权限,从而执行下一个post self.middle_content = self.s.get('http://yuyue.juneberry.cn/BookSeat/BookSeatListForm.aspx').content # 经测试,这个post只需要一个subCmd的参数就可以正常返回,因此不必根据get内容更新post参数 # 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内容,判断是否成功,并触发日志记录和邮件提醒 """ if '<h5 id="MessageTip">已经存在有效的预约记录。</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">所选座位已经被预约。</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])
Explication détaillée de la lecture et de l'écriture de fichiers json en python (avec code)
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!