Maison  >  Article  >  développement back-end  >  Python Requests simule la connexion pour réaliser une réservation automatique des places de bibliothèque

Python Requests simule la connexion pour réaliser une réservation automatique des places de bibliothèque

不言
不言original
2018-04-27 10:40:524631parcourir

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 c726a8da2e1b0a50980b1ad4157a77d3 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

    50ac6f7a2826ee33507d773689881554
  • pour la construction ultérieure des données de publication
  • 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=&#39;hidden&#39;>的post参数,并添加到post_data中
  """
  soup = BeautifulSoup(page_content, "html.parser")
  for each in soup.find_all(&#39;input&#39;):
   if &#39;value&#39; in each.attrs and &#39;name&#39; in each.attrs:
    data_dict[each[&#39;name&#39;]] = each[&#39;value&#39;] # 添加到login的post_data中
    # self.data2[each[&#39;name&#39;]] = each[&#39;value&#39;] # 添加到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(&#39;http://yuyue.juneberry.cn/BookSeat/BookSeatListForm.aspx&#39;).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 &#39;<h5 id="MessageTip">已经存在有效的预约记录。</h5>&#39; in text:
   self.clear_error_once(&#39;[done!] You already ordered a seat!&#39;)
  elif &#39;<h5 id="MessageTip">选择的日期不允许预约。</h5>&#39; in text:
   self.clear_error_once(&#39;[done!] Date is wrong!&#39;)
  elif &#39;<h5 id="MessageTip">所选座位已经被预约。</h5>&#39; in text:
   self.clear_error_once(&#39;[done!] This seat is not available, maybe taken by others!&#39;)
  elif &#39;<h5 id="MessageTip">座位预约成功&#39; in text:
   self.clear_error_once(&#39;[done!] Success! An email is sending to you!&#39;)
   sendmail.send_mail(&#39;BJTU Library Seat_NO:&#39; + self.seatNO + &#39;ordered!&#39;,
        &#39;Sending by robot. Do not reply this mail!&#39;, self.mailto)
  else:
   self.error_log_once(&#39;Error! 302 to login page&#39;)

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

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

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

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


if __name__ == &#39;__main__&#39;:
 if len(sys.argv) < 5:
  print &#39;Usage: python library.py [username] [password] [seat_NO] [email]&#39;
  print &#39;eg. python library.py S13280001 123456 003 XXXX@qq.com\n&#39;
  print &#39;Any problems, mail to: i[at]cdxy.me&#39;
  print &#39;#-*- Edit by cdxy 16.03.24 -*-&#39;
  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)


Instructions d'utilisation du module re des expressions régulières PYTHON

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn