Heim  >  Artikel  >  Backend-Entwicklung  >  Python Requests simuliert die Anmeldung, um eine automatische Reservierung von Bibliotheksplätzen zu realisieren

Python Requests simuliert die Anmeldung, um eine automatische Reservierung von Bibliotheksplätzen zu realisieren

不言
不言Original
2018-04-27 10:40:524631Durchsuche

Dieser Artikel stellt hauptsächlich die simulierte Anmeldung von Python-Anfragen im Detail vor. Python realisiert die automatische Reservierung von Bibliotheksplätzen, die einen bestimmten Referenzwert haben.

Das Beispiel dieses Artikels wird von allen geteilt Der spezifische Code für die automatische Reservierung von Bibliotheksplätzen in Python lautet zu Ihrer Information:

Konfiguration

Führen Sie das Skript regelmäßig über den öffentlichen Netzwerkhost aus senden Senden Sie die E-Mail an Ihr QQ-Postfach, sodass auf WeChat eine Nachricht angezeigt wird, die Sie darüber informiert, ob der Termin erfolgreich ist

vim /etc/crontab

Stellen Sie jeden Morgen auf 7:01 Uhr ein. Führen Sie das Skript automatisch aus

Programmablauf

(Nehmen Sie die Website yuyue.juneberry.cn als Beispiel)

  • get Besuchen Sie die Anmeldeseite, rufen Sie das Cookie und das versteckte Beitragsfeld im Formular ab.

  • Erstellen Sie die Login-Beitragsdaten und fügen Sie das erhaltene versteckte Beitragsfeld hinzu aus dem Formular

  • Erstellte Daten posten, Login simulieren, Cookie aktivieren (Cookie-Erlaubnis zum Login erteilen)

  • Zugriff auf die Sitzplatzreservierung erhalten Schnittstelle, Cookie aktivieren (Cookie-Berechtigung zur Sitzplatzreservierung erteilen)

  • Reservierungsanfrage posten, um Sitzplatzreservierung zu realisieren

  • Analysieren Sie das Rückgabeergebnis und stellen Sie fest, ob es erfolgreich ist, und senden Sie eine E-Mail-Erinnerung

Wichtige Punkte

  • requests.session () in der Anforderungsbibliothek Möglichkeit zum Erstellen einer Sitzung, die Cookies übergeben kann

  • Erhalten Sie die Daten von c726a8da2e1b0a50980b1ad4157a77d3 und übergeben Sie sie zu den Post-Daten

  • Erfassen Sie das Paket, um die Website-Logik zu bestimmen, Filtern Sie die Parameter jeder Anfrage heraus und implementieren Sie

Funktionserklärung in der Programmklasse FUCK()Hauptklasse

  • _get_date_str(self):Erhalten Sie das aktuelle Datum und fügen Sie einen Tag hinzu, verwenden Sie dies Funktion zum Erstellen des charakteristischen Felds der URL (Die Bibliothek ist so eingestellt, dass sie Plätze einen Tag im Voraus reserviert)

  • def _get_order_url(self):Konstruieren Sie das Post-Ziel URL von „Sitzplätze reservieren“

  • def _get_static_post_attr:Diese Funktion analysiert die Rückgabeseite der Get-Anfrage und extrahiert die Felder von

    0602f572815252f1d89d6c058887ee49
  • für spätere Konstruktion von Beitragsdaten
  • def login(self):Anmeldefunktion implementieren

  • def run(self):Sitzplatzreservierungsfunktion implementieren

  • def _is_success(self, text):Beurteilen Sie das Reservierungsergebnis

  • def error_log_once( self, text='Standardfehler (einmal)'):

  • def error_log(self, text='default error'):Diese beiden Die Funktion setzt den Programmstatus auf „Fehler bereits“ oder „Kein Fehler“ (wird verwendet, um das Schreiben wiederholter Fehlermeldungen in das Protokoll während des automatisierten Betriebs zu vermeiden)

  • def error_log( self, text='default error'):Fehlerinformationen einmal in das lokale Protokoll schreiben

  • sendmail.send_mail ()Mail-Versandmodul

  • Code und Kommentare

# /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])

Verwandte Empfehlungen:

Detaillierte Erklärung des Lesens und Schreibens von JSON-Dateien in Python (mit Code)


Anleitung zur Verwendung des Re-Moduls von PYTHON Regular Ausdrücke

Das obige ist der detaillierte Inhalt vonPython Requests simuliert die Anmeldung, um eine automatische Reservierung von Bibliotheksplätzen zu realisieren. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn