Pythonでオンライン授業への接続を簡単にするツールを作ってみた。
はじめに
初めてのnoteの投稿になります。
コロナの影響で大学の授業が遠隔になり、Zoomを使う大学が多いと思います。毎回、授業のシラバスを開いてミーティングIDとPWを入力したり、URLをコピーすることを手間だと思ったことがある人も多いでしょう。そこで今回はそのような作業を省くためのツールを開発したので紹介したいと思います。
紹介
【手動で入室】任意の曜日・時限(例:水3)とテキストボックスに"入室する"ボタンを押下するとミーティングURLが開いた後にZoomが起動し、対象のミーティングに入室します。
【自動で入退室】曜日・時限は手動と同様。入退室時間を入力して”入室予約する”ボタンを押下すると、”入室時間”で指定した時刻になると自動的に入室します。指定した”退出時間”になるとミーティングを自動的に退出します。
【授業画面を録画】”授業画面を録画”のチェックボックスをonにして上記の方法で入室すると、ミーティング入室時に授業画面を録画します。
【WebClass・Unipa】各ボタンを押下すると、各大学の学生ポータルサイトや電子ポートフォリオシステムが開きます。※飽くまでも投稿主の大学での名称ですので、各々の大学に合わせて変更可能です。また、ボタンの個数も調節可能です。
コード紹介
import pyautogui as pg
import time
import datetime as dt
import pause
import webbrowser as wb
import tkinter as tk
import tkinter.messagebox as tkm
from tkinter import ttk
#zoomアドレス
mon = ["sample.com","sample2.com",None,None]
tue = [None,None,None,None]
wed = [None,None,None,None]
thu = [None,None,None,None]
fri = [None,None,None,None]
#曜日時限とアドレスの紐づけ
def adress_linking(n):
if n == "月1":
return mon[0]
elif n == "月2":
return mon[1]
elif n == "月3":
return mon[2]
elif n == "月4":
return mon[3]
elif n == "火1":
return tue[0]
elif n == "火2":
return tue[1]
elif n == "火3":
return tue[2]
elif n == "火4":
return tue[3]
elif n == "水1":
return wed[0]
elif n == "水2":
return wed[1]
elif n == "水3":
return wed[2]
elif n == "水4":
return wed[3]
elif n == "木1":
return thu[0]
elif n == "木2":
return thu[1]
elif n == "木3":
return thu[2]
elif n == "木4":
return thu[3]
elif n == "金1":
return fri[0]
elif n == "金2":
return fri[1]
elif n == "金3":
return fri[2]
elif n == "金4":
return fri[3]
else:
tkm.showerror('エラー', '正しく入力して下さい。')
#画面録画
def start_capture():
pg.hotkey("win","alt","r")
def end_capture():
pg.hotkey("win","alt","r")
# 自動入室予約
def auto_inout(start_time,end_time,subject):
if start_time[0] == start_time[2] == "0":
pause.until(dt.datetime(year,month, day,int(start_time[1]),int(start_time[3])))
elif start_time[0] == "0":
pause.until(dt.datetime(year,month, day,int(start_time[1]),int(start_time[2:])))
elif start_time[2] == "0":
pause.until(dt.datetime(year,month, day,int(start_time[0:2]),int(start_time[3])))
else:
pause.until(dt.datetime(year,month, day,int(start_time[0:2]),int(start_time[2:])))
wb.open(adress_linking(subject))
time.sleep(5)
"""
画面サイズを最大化する(画面キャプチャできない)
pg.hotkey("alt","f")
"""
if var.get() == 1:
time.sleep(5)
start_capture()
if end_time[0] == end_time[2] == "0":
pause.until(dt.datetime(year,month, day,int(end_time[1]),int(end_time[3])))
elif end_time[0] == "0":
pause.until(dt.datetime(year,month, day,int(end_time[1]),int(end_time[2:])))
elif end_time[2] == "0":
pause.until(dt.datetime(year,month, day,int(end_time[0:2]),int(end_time[3])))
else:
pause.until(dt.datetime(year,month, day,int(end_time[0:2]),int(end_time[2:])))
if var.get() == 1:
end_capture()
exit_zoom()
# 自動予約
def appointment():
subject = txt2.get()
start_time = txt3.get()
end_time = txt4.get()
if subject == "" or start_time == "" or end_time == "":
tkm.showerror('エラー', '正しく入力して下さい。')
else:
tkm.showinfo('予約完了', '時間までお待ちください')
txt2.delete(0, tk.END)
txt3.delete(0, tk.END)
txt4.delete(0, tk.END)
auto_inout(start_time,end_time,subject)
#zoomから退出
def exit_zoom(): #zoomから退出
time.sleep(2)
pg.hotkey('alt', 'q')
time.sleep(4)
pg.press('enter')
""" レイアウト """
root = tk.Tk()
root.title('楽々Zoom')
iconfile = 'raku.ico'
root.iconbitmap(default=iconfile)
root.geometry("600x300")
#ラベル
label1 = tk.Label(
root,
font = ("MSゴシック", 16),
text = "手動で入室(月曜1限:月1と入力)" ,
relief="ridge"
)
label1.place(
x = 10,
y = 10,
)
label2 = tk.Label(
root,
font = ("MSゴシック", 16),
text = "自動入室(16時5分:1605と入力)" ,
relief="ridge"
)
label2.place(
x = 10,
y = 95,
)
label3 = tk.Label(
root,
font = ("System", 16),
text = "曜日・時限"
)
label3.place(
x = 10,
y = 130,
)
label4 = tk.Label(
root,
font = ("System", 16),
text = "入室時間"
)
label4.place(
x = 10,
y = 160,
)
label5 = tk.Label(
root,
font = ("System", 16),
text = "退出時間"
)
label5.place(
x = 10,
y = 190,
)
# テキストボックス
txt1 = tk.Entry(width=20)
txt1.place(x=20, y=50)
txt2 = tk.Entry(width=20)
txt2.place(x=130, y=135)
txt3 = tk.Entry(width=20)
txt3.place(x=130, y=165)
txt4 = tk.Entry(width=20)
txt4.place(x=130, y=195)
#テキストボックスの処理
def btn_click():
n = txt1.get()
wb.open(adress_linking(n))
if var.get() == 1:
time.sleep(5)
start_capture()
txt1.delete(0, tk.END)
btn1 = tk.Button(root,
text='入室する',
command = btn_click
)
btn1.place(x=160, y=48)
btn2 = tk.Button(root,
text='入室予約する',
command = appointment
)
btn2.place(x=280, y=165)
#Webclass
def webclass():
wb.open("https://els.sa.dendai.ac.jp/webclass/login.php")
btn3 = tk.Button(root,
text='WebClass',
command = webclass
)
btn3.place(x=10, y=250)
#Unipa
def unipa():
wb.open("https://portal.sa.dendai.ac.jp/uprx/")
btn4 = tk.Button(root,
text='Unipa',
command = unipa
)
btn4.place(x=90, y=250)
var = tk.IntVar()
chk = tk.Checkbutton(root, text='授業画面を録画する',
variable=var,
relief="ridge"
) #チェックボックスでonなら1 offは0
chk.place(x=450, y=80)
### レイアウト ###
# ウィンドウの表示開始
root.mainloop()