いんたーねっと日記

141文字以上のものを書くところ

大学の学内WebサービスをクロールしてWebサービスを作った話と、作りながら思ったこととか

1

先日、僕の所属している慶應義塾大学湘南藤沢キャンパス(SFC)の学生のためのWebサービスを作った。
http://履修選抜.死ぬ.jp
SFCでは毎学期のはじめ、授業開始の日から履修登録までの1週間ちょっとはショッピングウィークと呼ばれていて、どの授業にも自由に参加できて、1回目の授業を受けてから実際に履修する授業を選ぶことができる。希望者が殺到する人気授業や機材などの関係で人数を絞る必要のある実習系の授業は履修動機などを書いて提出する履修選抜があって、その結果は今年の春までは本館の掲示板に貼り出された紙から目を凝らして自分の学籍番号を探すことでしか知ることができなかった。



今学期から、これがSFC-SFSというキャンパス向けWebサービスで閲覧できるようになった。SFC-SFSはSFCの学生や教員が日常的に使うように作られたWebサービスで、この時期は授業を検索してシラバスを読んだり、気になる授業を登録すると時間割にして表示したりするのに便利に使われている。授業期間中は授業ごとにページが用意され、授業資料や講義映像が公開されていたり、課題を提出したりすることができる。履修選抜の結果もこの授業ページに表示されるようになった。
履修選抜結果がどこからでもWebで見られるようになったことは、これまで本館に行って人だかりの中A4の紙に小さな文字で印刷された自分の学籍番号を必死になってさがしていたことからすれば革命的だった。このキャンパスの学生は必ずしも毎日学校には来ていなくて、これまではしばしば「学校にいる人、〇〇の履修選抜通ってるか確かめてください」みたいな発言がTwitterにあった。

ところがひとつ問題があって、もともとこの時期はいつもSFC-SFSにアクセスが集中して動作が遅くなってしまうのに、履修選抜結果もその動作の遅いサイトを、数段階ページを辿らないと閲覧できないことだった。しかも選抜結果が公開される場所は授業ごとに別になっていて、複数の授業の履修選抜を通っているかどうかを確かめるためにはさらに時間がかかってしまう。自分が履修したい授業の選抜結果が公開されているかどうかはアクセスしてみないとわからないことも問題だった。

2

僕は今学期には履修選抜のある授業を取ろうとしていなかったのだけど、履修選抜結果がどういうふうに公開されているのかに興味があったので、試しに履修選抜のありそうな授業をいくつか履修希望登録した。履修登録期間まではSFC-SFS上で履修希望登録をすることができて、こうすることでSFC-SFS上の授業ごとのページにアクセスできるようになる。履修登録結果は、このページからさらにリンクをたどった先で、学籍番号一覧のかたちで表示されていた。
さきほど引用した @helosshi24 さんの発言がそもそもそういうことをし始めたきっかけだったのだけど、ここに掲載される番号を全部集めれば、学籍番号を入れるだけで履修選抜を通った科目をチェックできるようになるんじゃないかと思って、とりあえず全ての授業ページを閲覧できるようにするために全ての授業に履修希望登録をする作業をはじめた。幸か不幸か、SFC-SFSを機械的にいじるのは非常に簡単で、履修希望登録用のURLにGETメソッドを送るだけで登録が完了した。ログインする処理を書くのは面倒だったので、Bookmarkletをつくってブラウザ上で処理をした。時間割はよく知らない名前の授業で埋まった。
http://gyazo.com/c678410393f21f5a5f37560e7d6e3b25.png
この日の真夜中にSFC-SFSの中のページを取得して履修選抜結果を収集するスクリプトを完成させて、そっけない見た目のWebサイトも作った。スクリプトは1度全部の授業の情報を取得したあとは、履修選抜がなかったり結果を取得済みのものについてはそれ以上アクセスしないように作った。

3

SFCの情報化は、日本の大学としてはかなり先進的な進み方をしているのだけど、それでも改善を望まれているものは多くて、学生が勝手にそういうところを穴埋めするWebサービスをつくることもよくあった。僕も出席に予約が必要な体育の授業の空き状況を発言しつづけるTwitter Botや、現在は止まっているものの授業の場所や担当者を教えてくれるTwitter Botを作ったことがある。むしろ中途半端に情報化しているからこそ遊び半分でこういったプログラムを作りやすいという面もある。
体育の予約状況や授業の時間割はWebに公開されている情報なので、気軽にその情報を転用して好き勝手することができた。でも今回はわけが違って、SFCのアカウントを持っていないと見ることができない情報を公開してしまうので、正直なところ少なからず抵抗があった。
もともと僕が作った体育のbotは、自分が体育の授業の予約を自動でするスクリプトを書いたときのコードを応用したものだった。SFCの体育は、1年生の最初の学期はクラス制で必修であるものの、そのあとの2単位は3年生までに取り終えればいいことになっていて、これには合計30回の出席が必要になる。いつどの授業に出るかは全くの自由で、Webから予約をしなければ出席としてカウントされない。僕は運動が苦手なので楽な授業に出たいのだけどそういう授業は人気が高く、抽選かキャンセル待ちでしか予約をすることができない。そこで、毎週必ず抽選に応募して、さらに抽選に落ちた場合には根強くキャンセル待ちをして空きが出た瞬間に予約を押さえるというプログラムを書いた。
SFCでは体育は必修なのだけれども、僕のように楽な授業だけで終わらせたいという需要は多く、僕の作ったプログラムもWebサービスとして公開すればいい商売になるんじゃないのと(冗談交じりに)よく言われていた。ただ、予約を自動化するためにはその人からアカウントとパスワードを預からなくてはならなくて、それはもしトラブルが起きたときに責任が大変なことになるので絶対にやりたくなかった。
ここでいうアカウントとかパスワードとかいうものは、SFCのCNSというネットワークですべて共通のもので、これさえあればSFC-SFSにログインして提出済みの課題を全部消すことも、メールを盗み見ることもできてしまう。そんなものを預かるのはあまりにリスクが大きすぎた。
しかしそういうリスクを背負ってでも個人でサービスを公開する人もいて、昨年には履修履歴から次に履修する科目を推薦する「時間割メーカー」というサイトが、先日も「進級・卒業要件チェッカー」がそれぞれ登場した。どちらも学内WebサービスのIDとパスワードを(後者はCNSではなくて慶應共通のアカウントだけれども)入力させ、データを取得するというかたちになっている。

4

学内サービスにログインしていろいろ操作できるだけの情報を預かるようなサービスに比べれば、僕の履修選抜結果を検索するサービスは大したことないだろうとは思う。しかしそれでも、学籍番号というものがどこまでの運用が許されるべきものなのかがよくわからなくて、公開するのに躊躇した。学籍番号は隠されているべきものなのかもよくわからないし、学籍番号を知っていればどの授業を履修しようとしているかがある程度わかってしまうことももしかしたら危ないのかもしれない。
論理的に考えれば、僕がしていることはSFC-SFSにログイン可能な人であれば知ることができる情報を収集しているだけだ。だからSFC生に公開することは問題ないのだろう。しかし、外部の人間が僕の作ったWebサイトをクロールすることで、有効な学籍番号と、その学籍番号をもつ学生が受講している可能性が比較的高い授業のリストを知ることができる。もしそうやって授業にストーカーが紛れ込んだら、その被害について僕にクレームが来たらどう対応していいのかわからない。
サイトを作ってから1時間か2時間くらいそういうことを考えて、しかしせっかく作ったし、なにより学校側が提供するサービスより便利に使える場面もあるだろうと思って公開した。履修選抜結果のリストは学外からのアクセスに対しては授業名を伏字にするという配慮をして対応した。伏字にして表示すれば、本人はとりあえず何かの科目の選抜に通ったんだという判断をすることができて、それがどの授業か確かめたければVPNを使ったり学校に来たりすればいいわけだし、外部の人間はどの授業に行けばその人に会えるのかはわからないという状態になる。外部の人間にとってできることは、どこかで拾ったりした学籍番号が有効なものである確証を得られるくらいしかない。

5

正直なところ、いちばん怖かったのは情報を公開したことでトラブルが起きたり学校側に怒られたりすることではなくて、「機械的に情報を収集している人がいるのがなんとなく怖い」と思われてしまうことだった。今回の履修選抜にしろ体育にしろ、僕がやっているのはがんばれば人間でもできることで、たまたまそのプロセスをプログラムを書いて自動化しているにすぎない。今回はそういうことがなかったのでひと安心している。
金曜日の夜、バイト先の人に「最近なにしてるの」と聞かれたのでこういうサイトを作ったという話をしたら、「それはやまあるが作るんじゃなくて学校側がオフィシャルに実装するべきなんじゃないの」ということを言われた。たしかにそのとおりで、自分が選抜を通った授業の一覧がすぐに見られるようになっているべきというのは、これからSFC-SFSが公式に実装していくべきものだと思う。しかしおそらくそれが実装されるとしても次学期以降になるだろうし、誰も提案したりしなければこの先ずっと作られないかもしれない。そういう点で意義のあることをしたのではないかとは思っている。

6

ところで、SFCでWeb関連の動きがあると「さすがSFC」のような言葉がキャンパス内外から飛んでくるのだけれども、僕はあんまりそういう状況が好きではない。ここまで文章を書いてきて、あらためてSFCの情報化はまだまだ中途半端だということを再認識したし、そういう環境が僕にとって楽しいのは確かだけれども、それを必要以上に褒めるのはやはりおかしいと思う。
SFCにいるプログラマ界隈では、しばしば冗談まじりにSFC関係のWebサービスのAPIが欲しい、OAuthでアクセスできたりしてほしいという話をしているのだけれども、学校が公式にそれをやるというのもちょっとおかしな話だと思っている。そもそも体育の予約が必要なのはなんでなのかとか、SFC固有のCNSアカウントや慶應全体が使っているkeio.jpのアカウントがある上に履修申告用のパスワードがあって新入生が毎年混乱しているをどうにかできないのかとか、もっと学校側が頑張るべき課題が大量にあるし、学校側が勝手アプリを作ることを奨励する段階ではない。ただ、学生の側からのフィードバックがもっと反映されていけばいいな、と思っている。