需要分析:
4 年生の最終学期、卒業が迫っており、私は卒業制作の準備を一日中図書館で行っていました。偶然ピンピンに会ったのですが、そのとき、学校の図書館は翌日の 6 時に席を予約できることに気づきました。 1 日前にチェックしてください。上の階には空席がありません。
まだ2月で、まだ寒かったです、2階、3階にも席はたくさんありましたが、ほとんどがロビーにあり、エアコンもなく、そこに座っているだけで寒くて、コードを打つこともできませんでした。 。彼女からの知らせを聞いて、私は翌朝、戻って目覚まし時計を6時にセットしました。席は確保できましたが、とても不快でした。6時に起きてからは、何もできませんでした。寝ます。1時に図書館に行きました。体力が足りず、2日連続でついに我慢できなくなったので、自動予約機能を完成させるプログラムを書くことにしました。
分析を開始します:
まず、図書館の全体的なプロセスを大まかに理解しました。それは難しくなく、実行できるはずであることがわかりました。
一般的な手順は次のとおりです。
- ログイン
- 座席予約情報の取得
- 予約を開始する
一見するととてもシンプルですが、機能が充実していくにつれてどんどん複雑になっていきます。
具体的な手順:
- ログイン
このような純粋なデジタル認証コードは、干渉線を加えずに傾けただけの、最も単純な認証コードであり、言うことはありません。
f12 でブラウザ開発者ツールが開き、ユーザー名とパスワードはすべてネイティブであり、verify が検証コードであることは間違いありません。最初にヘッダーと Cookie を追加すると、ログインできることがわかります。OK、最初のステップはこれで完了です。
ログイン成功で返されたjsonデータをここに貼り付けます(後で使用します) 最初はこの問題に気付かず、かなり遠回りしてしまいました。。
2. 座席情報の取得
何度もページを更新した結果、17は各階の各地区の番号であり、2階と3階には3つの地区があり、各地区の番号が異なるという結論に達しました。4階以上の各階にはエリアが1つだけあり、各階には固有の番号のみが付いています。後者のidは座席情報を取得する際に使用します。そういえば、自分が踏んだ穴のことを思い出しました。最初は1日分のデータしか解析していなかったので、id(後で使用するセグメント)は固定だと思っていました。 , ただ、2日目は1日目より1つ増えていて、増分だということを後から知りました。。
座席情報を取得する際、前回のリクエスト結果の2つのパラメータを利用していたのですが、これを書いているときに、startTimeとendTimeという落とし穴を思いつきました。当日に座席が予約されている場合、startTime はリクエストが開始された時刻です。座席が翌日に予約されている場合、startTime は 08:00 です。そして、day は翌日の日付でもあります。ここには、翌日の日付を自動的に取得できる別の Baidu ホイールがあります。
def getTommrrow(self):
inputdate = datetime.datetime.now().strftime('%Y-%m-%d')
date = inputdate.split('-')
inputyear = int(date[0])
inputmonth = int(date[1])
inputday = int(date[2])
if inputmonth in [1, 3, 5, 7, 8, 10, 12]:
enddate = 31
elif inputmonth in [4, 6, 9, 11]:
enddate = 30
elif inputmonth % 4 == 0:
enddate = 29
else:
enddate = 28
if inputday < enddate:
outputyear = inputyear
outputmonth = inputmonth
outputday = inputday + 1
elif inputmonth == 12:
outputyear = inputyear + 1
outputmonth = 1
outputday = 1
else:
outputyear = inputyear
outputmonth = inputmonth + 1
outputday = 1
print(str(outputyear) + '-' + str(outputmonth).zfill(2) + '-' + str(outputday).zfill(2))
self.tomorrow = str(outputyear) + '-' + str(outputmonth).zfill(2) + '-' + str(outputday).zfill(2)
self.segment = int(self.tomorrow.replace('-', '')[-3:]) + self.primary_segment
return
座席予約情報の応答結果は以下の通りです
ここで必要な情報は、id: 固有の座席番号を表します。name と no は同じです: 座席番号を表します。status: 1 は空席を表し、0 は予約済みを表します。ここも私が踏んだ穴です。セルフ予約 バージョン 0.9 予約したい座席が予約されている場合、他の座席は自動的に循環されますが、リストインデックスと座席番号が 1 桁異なるため、プログラムでは予約が成功したと表示されますが、実際の指定席は間違っています。またバグがあり、現在予約している席が空席で次の席が予約されている場合、プログラムが無限ループに陥り、空席予約情報を取得し続けるコードを解析したところ、前回の判定でしか返さないことが分かりました。 、しかし、次の判定は返されませんが、続行します!!!
3. いよいよ、約束の時間になったので、ここにコードを投稿します。
予約で使用されるトークンと有効期限は、ログイン応答が成功した結果であることがわかります。
補足と要約:
このプログラムは ConfigParser を使用して構成ファイルを設定します。これは、他の人が情報を変更して使用するのに便利です。
スケジューラーを使用して、プログラムを毎朝 6:00 に自動的に実行します (バグ: スケジューラーが 06:00 に設定されている場合、予約時刻が到着していないことを示すプロンプトが表示されます。通常は 06:00:05 に設定されます)。
バージョン0.9では、一度に入力できる座席番号は1つだけとなり、予約が空いていない場合はサイクルからのランダム予約のみとなります。
バージョン 1.0 では座席番号がリストのような形式に変更され、代替座席を自分で設定できるようになりました。
このプログラムとタスク プラン管理プログラムの組み合わせは完璧で、タスク プランナーはプログラムを毎朝 550,000 回自動的に実行し、夜間にプログラムを実行し続けるのではなく、1 時間後に自動的にシャットダウンすることができます。しかし、昨日の朝には成功しました。今朝、コンピューターが自動的にシャットダウンしました。何が起こったのかわかりません。今夜もう一度試すつもりです。