Python implémente la fonction de réservation automatique de la salle d'étude de la bibliothèque

不言
Libérer: 2018-04-27 10:38:36
original
3048 Les gens l'ont consulté

Cet article présente principalement en détail la fonction de réservation automatique de la salle d'étude de la bibliothèque en python. Il a une certaine valeur de référence. Les amis intéressés peuvent s'y référer

Cet article partage l'implémentation de python avec tout le monde. pour la réservation automatique de la salle d'étude de la bibliothèque est pour votre référence. Le contenu spécifique est le suivant

Introduction

De nombreuses écoles offrent désormais aux étudiants un très bon environnement d'apprentissage, Cela se reflète généralement dans les installations et l'équipement des salles d'auto-apprentissage. Ce que je dois mentionner à ce sujet, c'est la bibliothèque de notre école. Avec la construction de la nouvelle bibliothèque, plusieurs zones fonctionnelles ont été aménagées dans la bibliothèque. Chaque étage est divisé en quatre zones : A, B, C et D, reliées. au nord et au sud, les couloirs sont reliés et un escalier en colimaçon traverse le premier au cinquième étage. La zone A est une zone d'auto-apprentissage ; les zones B et C sont des librairies de sciences sociales et de sciences naturelles qui intègrent la collection et la lecture ; la zone D est une zone fonctionnelle spéciale, comprenant une salle de cinéma et de télévision, un centre d'expérience de création de médias numériques, un espace intelligent. une salle de formation et une salle de lecture électronique de bureau en nuage, etc. ; il y a douze grandes et petites salles d'étude dans les couloirs est-ouest des zones B et C ; il y a des zones de lecture de loisirs dans les couloirs nord-sud.

J'ai copié le paragraphe ci-dessus sur le site officiel de la bibliothèque, mais je dois vraiment féliciter la bibliothèque de l'école. Revenant au sujet de cet article, l'école met gratuitement à la disposition des enseignants et des étudiants des salles d'étude confortables, de haute qualité et bien équipées. Cependant, ces salles d'étude nécessitent des réservations en ligne avant de pouvoir être utilisées. Les réservations pour le lendemain commencent à 00h00 tous les jours. Par conséquent, si vous souhaitez prendre rendez-vous pour une salle d'étude dans une plage horaire (3 heures), vous devez le faire. Je dois brûler l'huile de minuit. Bien sûr, avoir des mains rapides sera un énorme avantage dans ce processus. Si vous vous couchez tôt le soir et que la vitesse de vos mains n'est pas rapide, vous ne pourrez pratiquement pas prendre rendez-vous dans la salle d'étude. Il m'est arrivé d'apprendre récemment un petit robot d'exploration Python et je prévois d'utiliser le robot pour m'aider à accomplir cette tâche ardue. Ha ha ha ha ! (ps : Pour éviter tout accès malveillant, tous les liens ne seront pas publiés)

Idées d'implémentation Python

L'idée est assez simple quand on y pense. Ce n'est rien. plus que vous connecter au compte et rechercher une chambre, soumettre une réservation. Alors essayons :

Compte de connexion

Ouvrez d'abord l'interface de connexion pour notre réservation de salle d'étude, le lien est : U2FsdGVkX19NdfJkghN54Msvy1zl7AucRur/ct0nz4orPI7uLkSDsvuFMgr0fGcO
rn9Z/f8h3bds9w==

D'accord, cette première étape de connexion à votre compte est un test pour moi en tant que débutant, mais je ne peux pas être timide. En se référant à la méthode utilisée par d'autres grands, il s'agit d'ouvrir Firebug de Firefox (ctrl+shift+e) pour vérifier la situation du réseau, et d'effectuer une connexion normale dans ce cas.

Vous pouvez voir que nous avons un message ici, puis vous pouvez utiliser la méthode request.post en python.

Pour vous connecter avec succès, vous devez masquer votre identité en tant que robot d'exploration. Dans l'en-tête du message, vous pouvez voir l'en-tête de notre demande. form Own headers = {…} pour tromper le serveur.

Regardez la page des paramètres. Il n'y a ici que trois données de formulaire, correspondant au code de vérification, au numéro de compte et au mot de passe. Copiez les paramètres ici pour former nos données = {...}. Ce qui nécessite notre attention, c'est ce code de vérification. Qu'il puisse être reconnu manuellement ou automatiquement par une machine, le code de vérification doit être enregistré sous forme de fichier local. En conséquence, il y a un problème. Chaque fois que vous accédez au serveur, le code de vérification change. Maintenant, réfléchissons-y. Nous devons d'abord obtenir le code de vérification et le sauvegarder localement, ce qui nécessite une visite sur le serveur. Enfin, nous devons soumettre nos paramètres pour nous connecter. Cette fois, nous visitons à nouveau le serveur, cette fois pour. vérification. Le code de vérification et le code de vérification que nous avons obtenu ne sont plus le même code de vérification. Lors de la première tentative, je n'ai de toute façon pas pu me connecter au serveur, car les deux codes de vérification ne correspondaient pas. Comment rendre le code de vérification obtenu pour la première fois cohérent avec le code de vérification lors de sa soumission ?

Le même cookie est nécessaire ici. Dans les plusieurs images ci-dessus, nous pouvons tous voir qu'il y a une valeur de cookie. Pour garantir la synchronisation, nous devons nous assurer que la valeur du cookie lorsque nous obtenons le code de vérification est cohérente avec la valeur du cookie lors de la soumission du mot de passe du compte. Par conséquent, dans mon programme, la première étape que je fais consiste à obtenir une valeur de cookie, puis à utiliser cette valeur de cookie comme paramètre dans les en-têtes. C'est l'idée de​​vous connecter. Je voudrais ajouter que j'ai identifié manuellement le code de vérification ici >﹏<.

Trouver une chambre

Cette étape est en fait une étape inutile. Pourquoi y a-t-il cette étape ? Selon les habitudes humaines de réservation, quel type d'étape allons-nous produire. Cependant, si vous utilisez un robot, vous pouvez directement soumettre le formulaire de réservation après vous être connecté avec succès ? . Bien entendu, si vous souhaitez rendre le programme de réservation automatique plus intelligent, vous pouvez ajouter cette étape pour vérifier quelles chambres peuvent encore être réservées, et ajouter ici quelques règles personnalisées. Je l'ai juste sauté. . .

Soumettre un rendez-vous

De la même manière que pour la connexion, nous le soumettons également manuellement pour vérifier la situation du réseau, puis nous pouvons utiliser Python pour simuler ce processus. Je ne l'expliquerai pas ici avec des images. La méthode request.post est également utilisée pour la soumission ici. Cependant, une chose à noter est que les en-têtes ici sont différents des en-têtes lors de la connexion, je voudrais donc vous rappeler que si vous utilisez d'autres programmes de réservation similaires, vous pouvez faire attention pour voir si les en-têtes lors de la publication de contenus différents sont cohérent. J'ai été dupe ici pendant un moment.


#!/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格式转化为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&#39;<option value=(.*?)>\d{4}-\d{2}-\d{2}&#39; # 匹配可提供预约的hash
  value_h = re.findall(reg_h, res.text)

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

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


def reservation(day_hash, cookies, stime, etime):
  reservation_data = {
    &#39;_etime&#39;: etime, # 结束时间11点,其值为11*60=660
    &#39;_roomid&#39;: &#39;1285b3ca77594b3095c7b89d4922553c&#39;, # 房间Id
    &#39;_seatno&#39;: &#39;&#39;,
    &#39;_stime&#39;: stime,  # 开始时间8点,其值为8*60=480
    &#39;_subject&#39;: &#39;学习&#39;, # 研讨主题
    &#39;_summary&#39;: &#39;学习&#39;, # 研讨大纲
    &#39;ruleId&#39;: day_hash,
    &#39;usercount&#39;: 3,   # 预约人数
    &#39;users&#39;: &#39;**************&#39;, # 学号
    &#39;UUID&#39;: &#39;**************&#39;
  }

  reservation_headers = {
    &#39;Accept&#39;: &#39;application/json, text/javascript, */*; q=0.01&#39;,
    &#39;Accept-Encoding&#39;: &#39;gzip, deflate&#39;,
    &#39;Accept-Language&#39;: &#39;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&#39;,
    &#39;Cache-Control&#39;: &#39;no-cache&#39;,
    &#39;Connection&#39;: &#39;keep-alive&#39;,
    &#39;Content-Length&#39;: &#39;239&#39;,
    &#39;Content-Type&#39;: &#39;application/json&#39;,
    &#39;Cookie&#39;: cookies,
    &#39;Host&#39;: &#39;**************&#39;,
    &#39;Pragma&#39;: &#39;no-cache&#39;,
    &#39;Referer&#39;: &#39;http://**************&#39;,
    &#39;User-Agent&#39;: &#39;Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:59.0) Gecko/20100101 Firefox/59.0&#39;
  }
  reservation_js = json.dumps(reservation_data)
  reservation_url = &#39;http://**************&#39;
  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 = [&#39;1060&#39;, &#39;870&#39;, &#39;680&#39;]
  full_etime = [&#39;1240&#39;, &#39;1050&#39;, &#39;860&#39;]
  """预约策略二:10:00-13:00;13:50-16:50;17:40-20:40"""
  stime = [&#39;1060&#39;, &#39;830&#39;, &#39;600&#39;]
  etime = [&#39;1240&#39;, &#39;1010&#39;, &#39;780&#39;]
  cookies = get_cookies()
  day_hash = login(cookies, 0, 0)   # 设定定时时间
  for i in range(0, 3):
    reservation(day_hash, cookies, stime[i], etime[i])


if __name__ == &#39;__main__&#39;:
  main()
Copier après la connexion

Obtenir l'effet

Depuis que j'ai appris le python, maman, je n'ai plus à m'inquiéter de ne pas pouvoir accéder à une salle d'étude. Après avoir ajouté quelques lignes de procédures de chronométrage au programme, vous pouvez me réserver automatiquement une salle d'étude à 00h00. Grâce à des tests, nous avons constaté qu'il est possible de prendre rendez-vous dans une large mesure. Par exemple, du 4 au 12, il faut 7 secondes pour prendre rendez-vous pour trois périodes, mais du 4 au 13, cela prend 7 secondes. en fait, cela a pris 21 secondes, et cela a fait Pendant un certain temps, d'autres camarades de classe m'ont invité à sortir. Bien entendu, ce programme doit encore être amélioré pour remporter une victoire complète sur la « vitesse de la main ».

Ajoutez-le à la fin

S'il y a des lacunes, veuillez les partager.

Recommandations associées :

Python réalise une connexion automatique au réseau du campus


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!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!