🎄

大学ポータルサイト(manaba)との戦い (およびその他やったことについて)

2022/12/05に公開

この記事はWINC(早稲田コンピュータ研究会) Advent Calendar 2022の5日目の記事として書きました。

私は、プログラミングスキルという面で言うとまだまだ乏しく、そこまでアウトプットできることもないのですが、自分がアウトプットできることはなんだろうと思った時に、そうだ、執拗に大学ポータルサイト「manaba」のスクレイピングを試みていることだ!と思いました。

今回はmanabaスクレイピングの試みを中心に、どっちかというと効率厨である自分が大学関連の作業を効率化・自動化しようとしてやってきたことを振り返ろうと思います。

manaba以外の内容編

ナンバリングコードが日本語になってるシラバスを作る

自分の大学では全ての科目にナンバリングコードが割り振られており、各桁がそれぞれ画像のようにレベルや部門などの意味を持っていて(画像は④科目区分)このコードを見れば分かることはシラバス上の表記で略されていることも多いです。

しかし自分は全くこのコードの見方が覚えられず履修を組む時に大きな苦痛になっていました。
そこで、ナンバリングコードの中で特に「専攻・部門等」と「科目区分」については項目として日本語で明記されているシラバスを作りnotionにまとめました。データ加工はPythonを使用しました。


notionだと普通に絞り込みや並べ替えがしやすいのも良いです。

大学Gmailを全てLINEに転送+大学Classroomの未提出課題を毎朝LINEに送信

GASとLINE Notifyを使いました。この辺は確かネット上のコードをコピペして数行変えただけなのであまり理解はしてないです。 私はLINEの通知は公式アカウントでも放置できない方なので、大学Gmailの内容を見る率が格段に上がって良かったなぁと思っています。未提出課題リストについては、近年バグっているのですが理解が不十分すぎて直せないかも!困ったぞ!

manabaとの戦い編

スクレイピング拡張機能Axiomでmanaba未提出課題リストをスプシに書き出す

私は本当に根気が無さすぎてselenium(動的サイトスクレイピングでよく使われるPythonのフレームワーク、別に難しくはない…はず)で挫折しており、こりゃダメだ(泣)と思ったのですが、そんな私の前に現れたのがノーコード最強スクレイピング拡張機能Axiomであった。

https://chrome.google.com/webstore/detail/axiom-browser-automation/cpgamigjcbffkaiciiepndmonbfdimbb?hl=ja
もしかしたらセキュリティ的に問題あったり等するのかもしれない(AxiomにmanabaのIDとパスワードは書き込んでしまっている。)のですが、manabaのログインありスクレイピング自体は今の所問題なくできています。こういう感じで取得できます。

定期実行は無料枠ではできないので、毎日手動で動かす意志力が必要です。私は意志力が足りないので結局あまり使えていません。。

manaba定期スクレイピングを諦め、事前に登録したスケジュールに沿って課題をリマインドするようにする

manabaから定期的に情報を取得することは、Axiomを使うにせよ、Selenium+何かしらのオンライン実行環境でやるにせよ、無料枠ではできないことのようだと分かり、その案は諦めました。(manaba スクレイピング で検索して出てくるのはSelenium+Herokuの物が多いですがHerokuが無料で使えなってしまったそうなので…Heroku使ったことないので詳細は分からないのですが…)しかし、冷静に考えると、課題が出されるタイミングは大半の課題について初回ガイダンスで告知されているので、それらの課題については事前にリマインダーをスケジュールしておけば十分なのでは?という真理にも至りました。そこで今は 課題リストを事前に作りそれに基づいてリマインドするというしょぼ目なプログラム に落ち着いています。

//ChatGPTに書いてもらったプログラム
function sendTodayMail() {
  var schedule = [
    "12/7 社会倫理学 第7、8回の締切日",
    "12/14 社会倫理学 第9、10回の締切日"
    //本当は流石にもう少し長いリストだが省略した
    //このリストもChatGPTと語り合いながら作っているが、
    //微調整を繰り返していた結果普通に30分くらいかかっていそう、先が思いやられる
  ];
  
  var today = new Date();
  var todayString = today.getMonth() + 1 + "/" + today.getDate();
  
  for (var i = 0; i < schedule.length; i++) {
    var parts = schedule[i].split(" ");
    var date = parts[0];
    var message = parts.slice(1).join(" ");
    if (date === todayString) {
      GmailApp.sendEmail("ここにメールアドレスを入力", "予定のお知らせ", message);
    }
  }
}

今流行りのChatGPTにGASを書いてもらい、面白半分で使ってますがちゃんと動いていてすごいです。でも、課題リストの入力が、若干の効率化はされてますが基本的に人間の労力かけてるのでやっぱり挫折するだろうな。。。。もうここまで来ると、Googleカレンダーを使えば良いのでは という説もありますが、このやり方の方が入力が若干楽なのとガラケーにメール通知ができる(なんと、私はガラケーを使っている)のでこのまどろっこしいやり方を選択しました。探せば普通にもっといいやり方もあるのかもしれないですね…

まとめ、今後について

いかんせん、理解不十分なことを雰囲気でやってしまっているので、詰んでしまうことも多いですが、動く所まで至っている物もある程度の頻度で発生するようになり嬉しいです。サークル等で経験を積み、ググる力などがついてきたのが良かったと思います。manabaとは今後も格闘を続けていこうと思います。

ところで、最近、大学Gmailを見ていて気づいたのですが、


あれ、manabaで課題が追加された時に送られてくる自動送信メール、めちゃくちゃ定型文じゃね?(遅すぎる)

というわけで、次なるタスクは絶対に「do-not-reply@manaba.jp」から送られてくるメールをGASで解体してスプシなどに移行すること❗です❗❗待ってろmanaba❗❗❗❗🔥🔥🔥🔥

Discussion