ターミナルで出席登録がしたい!

はじめに

この記事は、"Tokyo City University Advent Calendar 2021"の18日目の記事になります!

https://adventar.org/calendars/6738

自己紹介

12/18を担当します、あめふりです。(@Amefuri_Tell) 見かけたら話しかけてくださいね。 最近メインOSをUbuntuにしました。 大まかな操作がコマンドでできる便利さを知ってしまい、Windowsに戻れなくなりそうです。(まだ勉強中) あと原神がたのしいですね。


ターミナルで出席登録したい!!

Ubuntuのコマンド操作が便利だということに気が付き数週間、ある授業中ふと思いました。

ターミナルで出席登録したい!

だって思いませんか? スマホを出して、chrome開いて、ブックマークから出席システムページに飛んで… こんなことをしていたら、鶏頭の私は番号を忘れてしまいます!!! じゃあ、パソコンでやればいいという話なんですが、Chromeを開いてブックマークから…とかやってたらやはり忘れてしまいます…

じゃあ、コマンドだったらどうだろうという話なんですが、

Alt + F2 -> attend 番号 -> enter

めっちゃ楽やん!!

ということで作りはじめました。

開発者ツールで通信を覗いてみる

まず真っ先にやったことは、「一体どんな通信をしてるか」を調べました。 Chromeの開発者モードのNetwork欄を見ると、通信が覗けます。

すると、めっちゃ簡単な通信しかしていないことがわかりました。

  1. ID + Passwordの送信
  2. Cookieと科目IDの受信
  3. 出席番号 + Cookie + 科目IDの送信
  4. 完了メッセージの受信

1, 2がlogin処理、3, 4が出席登録のようなので、単純にcurlを2回やれば良さそうです!

ログイン処理

まずは、Loginの処理を送ります。 開発者ツールによるとこのURLにRequestしていることがわかります。

f:id:AmefuriTell:20211217155846p:plain

そして、引数として、uid, pass, menunameを送信しています。

f:id:AmefuriTell:20211217155936p:plain

uidにはg学籍番号 passにはパスワード menunameには出席が入っています。

しかし、view sorceでみると、出席が%E5%87%BA%E5%B8%ADになっています…文字コードやめろ。

材料が揃ったので、Loginしてみます。

$curl https://call.off.tcu.ac.jp/Default/Login -d "uid=学籍番号" -d "pass=パスワード" -d "menuname=%E5%87%BA%E5%B8%AD"

すると、きちんとログインできてることがわかります!白く隠しているところに、執筆中に受けてる授業の名前とID、担当教員が入っています。

[:id:AmefuriTell:20211217160103p:plain]

後々、cookieと科目IDは使うので、今返ってきたhtmlとcookieを保存しておきます。 cookieの保存は、 -c ファイル名 のオプションで取得できます。

出席番号の送信

開発者ツールによると、にRequestしていることがわかります https://call.off.tcu.ac.jp/Sk/ProcedureAcc そして引数として、SelKamoku, InpNo, submitButtonNameを送信しています

f:id:AmefuriTell:20211217160203p:plain

SelKamokuには、先程HTMLで返ってきていた科目ID InpNoには、出席番号 submitButtonNameには、%E5%87%BA%E5%B8%AD%E7%99%BB%E9%8C%B2 が入っています。いつもの文字コード

そして、Payloadには書かれていませんが、cookieが送信されています。

cookieは、session, XSRF-TOKEN, laravel_sessionというのが必要っぽいです。cookieからawksedで取り出して、変数においておきます。

ここでわかるのが、出席登録システムはLaravelで作られてるっぽいですね。

さて、材料は揃いました。実際に登録してみます。

$curl https://call.off.tcu.ac.jp/Sk/ProcedureAcc --cookie "PHPSESSID=${PHPSESSID}" --cookie "XSRF-TOKEN=${XSRFTOKEN}" --cookie "laravel_session=${session}" -d "SelKamoku=${SelKamoku}" -d "InpNo=${AttNum}" -d "%E5%87%BA%E5%B8%AD%E7%99%BB%E9%8C%B2"

f:id:AmefuriTell:20211217160257p:plain

無事受付されました!!

これの処理をbashに書いて、コマンド化して今回のプロジェクトは完了です!! ↓実際に使っている様子

f:id:AmefuriTell:20211217160308p:plain

おわりに

結構、楽しかったです。が、仕様変更に耐えられなさそうなので、ちゃんとChromeなどのブラウザからやるのが安心ですよ。

それと、良ければ星マークつけてくれると嬉しいです。 ではでは、お相手はあめふりてるでした!