#自己紹介
名前:Hyugo
年齢:15歳(中学3年)
#classiとは(概要)
https://classi.jp/
classiは学校からの連絡事項や、先生とのやりとりをオンラインで行うプラットフォームである。
コロナ禍で急激にアクセス数が増え、サーバーが不安定になっていて、通知が来ないことも多く、困ることが多いのでdiscordと連携させようと思った。
なお、classiは動的サイトなので、requestsではなくseleniumを使った実装を行う。
データの格納にはjsonを使い、discord.pyモジュールを使い、discord上と連携させる。
#バージョン情報
Python 3.9
selenium 3.141.0
discord.py1.6.0
#開発に至った経緯
##不便に感じた部分
LINEや、discordなどはメッセージのやりとりを目的に作られているため、開いてすぐにメッセージUIが出てくるが、classiの場合
アプリを開く
> “その他”
> “メッセージ”
とメイン部分から大分離れた場所にある。(スマートフォン端末アプリのみ)
よって、メッセージUIにたどり着くまでの手間がかかり、不便に感じていた。
また、通知の遅延が最大で10分弱ほどあり、メッセージを送ってもすぐに相手に通知がいかず、やり取りを円滑に進める上で妨げになっていると感じた。
##開発した機能の概要
①通知のラグを削減
1分ごとのスクレイピングを繰り返し、メッセージの確認をすることで、通知の遅延を削減した。
②メッセージ送信の手間を削減
discordのサーバーのチャンネルと、Classiで繋がってる人の情報を結びつけておき、チャンネルにメッセージを送信すると、discordに送信したメッセージ内容をClassiのメッセージに投稿することで、手間を削減した。
#実装(コード)
#簡単な構造の解説
scp.py
スクレイピングの関数を定義している。
内部にはメッセージの送信,受信の確認,classiにログインする関数を定義した。
msgceck.py
discordのCogファイル
定期スクレイピング
discord.tasks.loopを使用して1分に一回確認作業を行なっている。
データの格納
jsonにチャンネルIDと連絡先を括り付けたファイルを保存している。
###スクレイピング方法について
Chrome Driverを用いて、Chormeを1分ごとにバックプロセスで実行させて、処理が終わるたびにキルしている。
#詰まった点
最初はrequestを用いてログインしようとしたが、ログインできず、aiohttpを用いて、statusを確認したところ404が返ってきていることに気づき、
UIを直接操作できるseleniumを使おうと思った。
#今後
添付画像の取得や、校内グループへの投稿をスクレイピングするものを実装したい。
###Classiに対するコメント
ソースコードに関して
JavaScriptのソースコードを拝見させていただきましたが、処理などがコメントアウトで記されていてとても読みやすかったです。
※切実な希望、願望
Classi APIをclassi社にて作っていただけたらめちゃくちゃ嬉しいです。