オンライン授業に自動で出席したい
2021/3/6追記
MacでSelenum+PyautoGUIを使ってZoomに自動出席できましたが、こちらの記事はSeleniumのみの挑戦として残しておきます。
今時、多くの学生がオンライン授業を受けていると思います。
出席確認が、「Zoomミーティングに参加してる」だけのオンライン授業なら、自動出席のコードを書けないかと考えた訳です。
念の為に補足しておきますが、ネタです。当然ですが、**授業はちゃんと受けましょう!**笑
さてさて、本題。
やりたいことは「授業時間前にZoomのミーティングに参加する」、「授業時間終了間際にミーティングから退出する」、この2点。
時間に関しては、sleepとかを使えば何とかなりそう。
問題はどうやってミーティングに入るか。
Zoomはブラウザからミーティングに参加出来るので、参加自体はブラウザ操作が出来れば何とかなりそうな気がします。
事前準備
ブラウザ操作って事で、Python+seleniumを使います。
seleniumは初めてですが、YoutubeにあったPythonでのWebスクレイピングチュートリアル動画でさらっと学習。
ちなみにMac、Anaconadaはインストール済、Python 3.7.4です。
JupyterLabを使いましたが、使わなくてもいけます。
使い方が大体分かったところで、自分がZoomのホストになり、テスト用のミーティングを開始、URLを取得しておきます。
ひとまず、seleniumをインストールしてURLを開いてみます。
#インストール出来ていない場合はインストールします
!pip install selenium
from selenium import webdriver
import time
browser = webdriver.Chrome()
browser.implicitly_wait(3)
browser.get("Zoomのテスト用ミーティングURL")
time.sleep(5)
無事に開けました。
ミーティングID等と一緒に下記の文章が表示されます。
「If you have Zoom Client installed, launch meeting. Otherwise, download and run Zoom.If you cannot download or run the application, join from your browser.」
ブラウザでZoomに参加しようとすると、reCAPTCHA(bot対策)に阻まれるのでインストール済みのZoom起動を目標にします。
Chromeなら右クリック「検証」から、「launch meeting」のfullXpathを取得します。
あとはxpathで要素を指定してクリックします。
PATH='/html/body/div[2]/div/div/div/div/div[2]/h3[1]/a[1]'
launchButton = browser.find_element_by_xpath(PATH)
time.sleep(3)
launchButton.click()
実行すると、「zoom.usを開きますか? キャンセル zoomを開く」
といったポップアップが表示されました。
確認ポップアップ(Confirm)っぽいのでswitch_to.alertで何とかなりそうです。
alert = browser.switch_to.alerttext = alert.text
alert.dismiss()
実行すると
Message: no such alert
ぬぬ??
ポップステップアップ
色々確認&調べてみたら、Seleniumが操作出来るのはJavaScriptsのポップアップのみで、表示されているのはシステムダイアログの模様。
そして、システムダイアログはSeleniumで操作出来ないとの記述を発見。
なら、システムダイアログを表示しないように設定すれば良いじゃん。
って事で、Chromeで外部アプリ起動時の確認画面を非表示にする方法を参考に外部アプリ起動時のダイアログを省略するように設定。
defaults write com.google.Chrome ExternalProtocolDialogShowAlwaysOpenCheckbox -bool true
一旦、自分でブラウザを操作して、次回以降ダイアログを表示しないように設定、再びSeleniumで実行。
失敗。
「次回以降は省略しますか?」と聞かれてしまう。。
Seleniumで開いたウィンドウではZoomのページを初めて訪れるから、かなぁ。
結論
Chromeの代わりにSafariを使ったりしてみましたが、同様のシステムダイアログに阻まれました。
思うように出来ませんでしたが、seleniumを初めて使ったこともあり、なかなか良い勉強になりました。
とりあえず、一つ言えることは「授業はちゃんと出席しましょう!!」
以上。
(ちなみに今は朝の4時過ぎ。授業がぁ。。。)
###追記
Chromeの設定を弄って、外部アプリ起動時の確認画面を非表示にしました。
が、セキュリティ的にちょっと不安なので直します。
defaults write com.google.Chrome ExternalProtocolDialogShowAlwaysOpenCheckbox -bool false
と実行しても、非表示のままでした。
実行後、Chromeを終了して、開き直したり、Cookies削除したりしていたら戻りました。一安心。