ホームページ >バックエンド開発 >Python チュートリアル >図書館自習室の自動予約機能をPythonで実装

図書館自習室の自動予約機能をPythonで実装

不言
不言オリジナル
2018-04-27 10:38:363185ブラウズ

この記事では主にPythonの図書館自習室の自動予約機能について詳しく紹介しますので、興味のある方は参考にしてください

この記事はPythonの図書館自習室の自動予約機能を共有します。具体的なコードは次のとおりです。具体的な内容は次のとおりです

はじめに

現在、多くの学校は生徒に非常に優れた学習環境を提供しており、それは通常、自習教室の設備や設備に反映されています。ここで特筆すべきは、本校の図書館ですが、新図書館の建設に伴い、図書館内に複数の機能エリアがA、B、C、Dの4つのエリアに分かれて接続されました。南北の廊下がつながっており、1階から5階までは螺旋階段が通っています。エリアAは自習エリア、エリアBとCはコレクションと読書を統合した社会科学と自然科学の図書館、エリアDは映画とテレビのホール、デジタルメディアメーカー体験センター、スマートトレーニング教室などを含む特別な機能エリアです。クラウドデスクトップ電子閲覧室など、B・Cエリアの東西廊下に大小12室の学習室があり、南北廊下に読書スペースがあります。

上記の文章を図書館の公式ウェブサイトからコピーしましたが、学校図書館には本当に感謝しなければなりません。話は戻りますが、本校では教師と生徒に快適で質の高い設備の整った自習室を無料で提供しています。ただし、これらの自習室は毎日0時から翌日の予約が開始されるので、一定時間内(3時間)で予約をする必要があります。 「真夜中の油を燃やす」。もちろん、このプロセスでは手が速いことが大きな利点となります。夜早く寝て手のスピードが速くないと自習室の予約は基本的に取れません。私はたまたま最近、Python クローラーを少し学んだので、この困難なタスクを完了するためにクローラーを使用するつもりです。ハハハッハッハ! (ps: 悪意のあるアクセスを防ぐため、すべてのリンクは掲載されません)

Python実装アイデア

考えてみればアイデアは非常に単純で、アカウントにログインしてルームを検索するだけです。 、予約を送信します。それでは、試してみましょう:

アカウントにログインします

まず、自習室の予約のためのログイン インターフェースを開きます。リンクは次のとおりです: U2FsdGVkX19NdfJkghN54Msvy1zl7AucRur/ct0nz4orPI7uLkSDsvuFMgr0fGcO
rn9Z/f8h3bds9w==

さて、最初のステップはアカウントにログインしてください。初心者の私にとっては試練ですが、臆病ではありません。他の大手が使用している方法を参考にすると、Firefox の Firebug を開いて (ctrl+shift+e) ネットワークの状況を確認し、この場合は通常のログインを実行します。

ここに投稿があることがわかり、Python で request.post メソッドを使用できるようになります。

正常にログインするには、メッセージ ヘッダーで自分のアイデンティティを隠す必要があります。すべてのパラメーターをコピーして、独自のヘッダー = {…} を作成するだけです。サーバー。 。

パラメータページを見てください。ここには確認コード、アカウント番号、パスワードに対応する 3 つのフォーム データしかありません。ここのパラメータをコピーしてデータ = {…} を形成します。注意が必要なのは、この検証コードが手動で認識できるか、機械によって自動的に認識されるかに関係なく、検証コードをローカル ファイルとして保存する必要があることです。その結果、サーバーにアクセスするたびに認証コードが変更されるという問題が発生します。ここで、慎重に考えてみましょう。まず、検証コードを取得してローカルに保存する必要があります。これには、最後に、ログインするためのパラメータを送信する必要があります。今回は、もう一度サーバーにアクセスします。検証 検証コードと当社が取得した検証コードは同じ検証コードではなくなりました。最初の試行では、2 つの確認コードが一致しなかったため、とにかくサーバーにログインできませんでした。初めて取得した認証コードと送信時の認証コードを一致させるにはどうすればよいですか?

ここでも同じ Cookie が必要です。上の写真では、Cookie 値があることがわかります。同期を確実に行うには、検証コードを取得したときの Cookie の値が、アカウントのパスワードを送信したときの Cookie の値と一致していることを確認する必要があります。したがって、私のプログラムでは、最初に Cookie 値を取得し、この Cookie 値をヘッダーのパラメーターとして使用します。これがログインの考え方です。ここで確認コードを手動で特定したことを付け加えておきます>﹏<。

お部屋を探す

このステップは実際には役に立たないステップですが、人間の予約習慣によれば、どのようなステップが生成されるのでしょうか? しかし、クローラーを使用すると、ログインに成功した後に予約フォームを直接送信できます。もちろん、自動予約プログラムをよりインテリジェントにしたい場合は、このステップを追加して、まだ予約できる部屋を確認し、ここにいくつかのカスタマイズされたルールを追加できます。スキップしただけです。 。 。

予約を送信する

ログインと同じように、ネットワーク状況を確認するために手動で送信することもできます。その後、Python を使用してこのプロセスをシミュレートできます。ここでは写真を使って説明しませんが、ここでも request.post メソッドを使用して送信します。ただし、ここでのヘッダーはログイン時のヘッダーとは異なるので、他の同様の予約プログラムを使用する場合は、別のコンテンツを投稿する際のヘッダーが異なるかどうかに注意してください。一貫性のある。ここでしばらく騙されました。


#!/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()

結果を出す

私がPythonを学んでから、母は私が勉強部屋を確保できないことを心配する必要がなくなりました。プログラムに数行のタイミング手順を追加すると、00:00に私の自習室を自動的に予約できます。実験の結果、例えば4日から12日までの3時間帯では予約に7秒かかっていましたが、4日から13日はかなり予約が可能であることが分かりました。実際にかかった時間は 21 秒でした。ある時、私は他のクラスメートに誘われました。もちろん、「手の速さ」に完全勝利するには、このプログラムにはまだまだ改良が必要です。

最後に追加してください

何か不足がある場合は、連絡を歓迎します。

関連する推奨事項:

Python でキャンパスネットワークへの自動ログインを実現


以上が図書館自習室の自動予約機能をPythonで実装の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。