サッキーブログ
NEWS

2016年12月16日 アドベントカレンダー「授業変更BOTの作り方」

2016年12月2日 アドベントカレンダー「留年」

授業変更BOTの作り方

※この記事は、苫小牧高専 Advent Calendar 2016 - Adventar 16日目の記事です。

去年の冬、授業変更が学校のHPから見られるようになった。
以前までは学内LANを利用するか、校内の掲示板を見るしかなく、非常に面倒だった。
(学内にサーバを置いてメール配信していた先輩もいたらしいが・・・)
主な連絡手段がTwitterの俺は『専用のアカウントを作って配信すればいいんじゃね?』なんて思った。
これが地獄の始まりだった

授業変更BOTの作り方 目次

1.授業変更のページからHTMLを取得する。
2.授業変更の部分だけを取り出す。
3.HTMLのタグを削除する。
4.見やすいように整形する。
5.ツイートする。
こういう流れでやっていった。

ちなみに言語は全部Pythonで作成することにした
これからの解説はこのページから当日分の授業変更をツイートするBOTのプログラムを使っています。

1.HTMLの取得

Pythonで特定のWebページのソースコードを取得したかったら以下のコードで取得できる。
※urllib2のimportを忘れずに・・・ 今回は読みやすさ重視で書いてるけど、実際はワンライナーで実装できる、スゴイ。

2.授業変更部分の切り出し

1で取得したHTMLから授業変更の部分だけを切り出す作業をしていきます。
とりあえずタブをスペースに置き換えて表記の揺れを防ぐために全部大文字に変換します。
取得してきた文字列にreplaceで"\t"をスペースに置き換えちゃいます。

そしたらHTMLを眺めて授業変更の部分だけを切り出せるような仕組みを考えます
今回は授業変更の部分だけtr要素のheightが35に設定されているので、
最初にそれが出て来た所の前と後ろで分割するよ
分割したらheightが35以前のところは削除しちゃおう(あっても邪魔なだけだからね)

3.HTMLタグの除去

2までの処理を行うとリストには[ こんな感じでデータが格納されているはず、ここからタグのゴミ
(<hogehogeとか)を除去すれば授業変更データだけのリストが完成する。
これを実装するには、リストを最初から辿っていって先頭の文字が"<"じゃない文字列を<まで
切り出すことをすれば完成!実際のコードは下みたいな感じ
コード内の変数htmlは2で作成したリストで、変数tmpは授業変更情報のリストだよ。
これで準備は整った、後はちゃんと表示されるように整形しよう。

4.文字列の整形

3までで授業変更情報の入ったリストが完成したよ
最後に授業変更がちゃんと分かるように文字列を整形しよう
このプログログラムは本科と専攻科それぞれの授業変更を別々の変数に格納してるよ
今リストには[J4,1時限目,オペレーティングシステム,J5,3時限目,信頼性工学,・・・]って感じで授業変更が格納されてるよ。

行の頭に来る文字で考えられるのは学科のアルファベット略の"M","A","J","S","K","AP","AE"と
各学年の漢字表記の"1年","2年",・・・,"5年"と"専1年","専2年"のいずれか。

ここからがちょっと手間がかかります。
今やりたい表記はこんな感じ
(例)
J4 1時限目 体育
    2時限目 数学

これを実現するにはリストに"J4"などが入っていた場合はそのままテキストに追加
"1時限目"などが入っていた場合は頭にスペースを追加してテキストに追加(例の1行目)
※最後に改行を忘れずに
このときに"1時限目"の前が"J4"であるかどうかで処理をわけないと表示が崩れます
"1時限目"の前が"J4"とうでない場合はインデントが合うようにスペースを追加して
テキストに追加(例の2行目の場合)
※改行を忘れずに(改行大事)

プログラム的には・・・
本科・専攻科フラグ:hs
同クラスの1個めの授業変更化のフラグ:gyo
"n時間目"の表記を行ったかどうかのフラグ:flag
人に見せるように書いてないからわけわからん変数ゴリ押しでスマン
整形が完成したら後はツイートするだけ

5.ツイート

手順4までで整形済みのテキストデータができてるはずなので、本科と専攻科の授業変更をツイートしましょう。 ツイート部分は関数にしちゃいました。
requests_oauthlibでoauth認証出来るので適当にTwitter APIのリファレンスを読みながら、色々なサイトを参考にしながら書きます。
最後のprint分はリダイレクトでログを取っているのでそれ用です。
こんな感じで授業変更がツイートできます。

運用のテストをしていると特定の日だけエラーが吐かれて上手くツイートできない、なんでだろう・・・
( ゚д゚)ハッ!
Twitterって140字制限あったよなぁ

授業変更が140字超える日あるじゃん!!

そんな日は仕方ないので手打ちで予め用意しておいたテキストデータを指定時刻に自動でツイートするようにしてます(半手動)
140字超えの判定は簡単でも、どのタイミングで区切るかをプログラムするのが難しいから仕方ないね
気が向いたら春休みにでもやります

最後に当日の授業変更をツイートするプログラムを置いておきますね〜
Gistだと長いプログラムの表示にはスクロールバーがなくて適さないのでGitHubでリポジトリ作りました
(Gistで5行だけ表示して後はスクロールバーでスクロールできるやり方知ってる人いたら教えてくださいマジで)
リポジトリはこちらです

おわりに

前回の留年話に続いて今回は授業変更BOTの解説記事をアドベントカレンダーで書かせてくれたmktakuyaくんに感謝してます。
アドベントカレンダーの2回の記事はネットからテンプレ探してきてHTML直打ちでやってるのでかなり大変でした。
そのうちRasPiにWordPress入れる予定なので導入できたら記事の移行もします。

以上留年生サッキーによる苫小牧高専アドベントカレンダー16日目「授業変更BOTの作り方」でした。
17日目はjprekzさんです。
よろしくお願いします!

サッキーについて
サッキー
はじめましてサッキーです。
情報系高専生やってます。
RasPiにApache2を入れてウェブページ作ったりPythonのスクリプト動かしたりしてます。