pythonのライブラリを使って便利ツールを作る
作るもの
私は課題を提出するの忘れがちなのでそれをリマインドしてくれるプログラムを作りたいと思いました。
また、度忘れ対策でデスクトップとメール通知の2重でリマインドするようにしました。
おおまかな仕組み
まず関数を定義します。そしてWebclassのURLを定義し情報を取得したあとSoupにかけて中身を解析します。このときにCSSセレクターを定義し対象を絞ります(今回の場合は課題) 次にtry-except構文を使ってoasnがからの場合を除き、テキストファイルとして保存します。if構文を使って課題が出てるかを判別します。この場合はasnとoasnが同じときは、 課題が出ておらず、違う場合は課題がでており、この場合のみメールを送信します。 メールの作成はサーバー接続→暗号化→ログイン→作成→送信→切断の順で行います。最後に関数を呼び出してデスクトップ表示、メールの送信を行います。使うライブラリ
ライブラリ | 目的 |
---|---|
beautifulsoup | HTTPリクエストを送信してWebページの内容を取得する |
requests | httpリクエストを送信してWebページの内容を取得する |
plyer | デスクトップに表示する |
smtplib | メール送信時のプロトコルを定める。 |
MIMEMultipart | 電子メールの規格の拡大 |
MIMEText | メールを送信する際にテキスト(メール本文)を入力する |
ソースコード
- import requests
- from bs4 import BeautifulSoup
- from plyer import notification
- import smtplib
- from email.mime.multipart import MIMEMultipart
- from email.mime.text import MIMEText
- import schedule
- import time
- # 関数を定義
- def d_confirm():
- #解析対象のURLを定義
- url= "https://kulms.kanagawa-u.ac.jp/webclass/"
- #URLの情報を取得
- res = requests.get(url)
- #
- soup = BeautifulSoup(res.text, "html.parser")
- #CSSセレクターで定義する asnはassignment=課題の略,course-contents-infoは締め切りの近い課題のやつ。
- asn = str(soup.select('course-contents-info'))
- #oasnが空の時をのぞいてoasnをテキストファイルとして保存
- try:
- with open('oasn.txt') as f:
- oasn = f.read()
- except:
- oasn = ''
- #もしasnとoasnが同じ時デスクトップに表示
- if asn ==oasn:
- notification.notify(
- title="Webclass",
- message="課題はありません",
- app_name="Webclass",
- timeout=10
- )
- #それ以外=課題があるときに表示
- else:
- with open('oasn.txt','w') as f:
- f.write(asn)
- notification.notify(
- title="Webclass",
- message="締め切りの近い課題があります",
- app_name="Webclass",
- timeout=10
- )
- #サーバーに接続
- smtp_server = "smtp-mail.outlook.com"
- port = 587
- server = smtplib.SMTP(smtp_server, port)
- #暗号化の設定
- server.starttls()
- #サーバーにログイン
- login_address = "神大メール"
- login_password = "パスワード"
- server.login(login_address, login_password)
- #メールの作成
- message = MIMEMultipart()
- message["Subject"] = "締め切りの近い課題があります。"
- message["From"] = "神大メール"
- message["To"] = "神大メール"
- text = MIMEText("締め切りの近い課題があります。")
- message.attach(text)
- #メールの送信
- server.send_message(message)
- #サーバーの切断
- server.quit()
-
- #d_confirm関数を呼び出してデスクトップの表示とメールを送信(必要な時のみ)
- d_confirm()
- # 定期実行の間隔(秒数)
- interval = 110 * 60 # 110分 大学の授業時間+休み時間(110分 * 60秒)
- # 定期実行のスケジュールを設定
- def schedule_task():
- d_confirm() # 定期実行する関数を呼び出す
- # スケジュールを設定
- schedule.every(interval).seconds.do(schedule_task)
- while True:
- schedule.run_pending()
- time.sleep(1)
改善点
おそらくこのプログラムでは完全放置で動くことがないので今回は現時点で断念することとなったが普通に有能プログラムくんだとは思うので完成させて
.exeに書き出して配布したいなぁとは思います。更新履歴掲示板のページを作りました。ここにできたか上げます。
これも自動化したい。
2023-11-04更新.
定期実行もできたっぽいです。暇だったのでいろいろとプログラムを組んでみました。ここから見れます。
pythonのプログラムで"program"のクラスだけ抽出するのもできるっぽいです。
chatGPTこいつにたよりっぱなのほんとによくない。個人的に改良しましたが大部分こいつです。