2018-08-19

Last Update:2018-08-19

DMM英会話の講師スケジュールを通知するコマンドを作った ( dmmeikaiwa_scrape )

../../_images/dmmeikaiwa_scrape.png

機能

  • コマンドです(デーモンとしては動きません)
  • 講師のスケジュールの空きをチェックし、LINEに通知する
  • 講師はいくつでも登録が可能
  • 事前に予約したい時間帯を指定できる
  • 前回チェックした結果と今回チェックした結果を比較し、「予約可」の時間が増えていれば通知する(余分なものは通知しない)
  • GOで書かれてます

前置き

DMM英会話をここしばらく続けている。

月5000円前後のオンライン英会話はおそらくどこも似たような仕組みだと思うが、特定の講師の レッスンを受け続けることはできない。なぜなら一日1予約の制限(最低料金プランの場合)があり、 講師のレッスン可能時間が開示されたあとに、生徒各自が早いもの順で講師のレッスン可能時間を 抑えていく仕組みであるからだ。

したがって人気のある講師は、他の生徒との奪い合いになり、 講師によってはレッスン可能時間の開示後30分もすればすべて埋まってしまっているということがよくある。

そして講師の予定が開示される時間はおそらく講師に一任されているので、講師によってまちまちである。 (講師は大半が外国の方なので、時差によっては日本の真夜中に開示されることもある。)

作ったもの

https://github.com/nato6933/dmmeikaiwa_scrape

良い講師を抑えたいので、講師のページをスクレイピングし、LINEに通知するようなコマンドを作った。 コマンドであるので一度動作したら終了するが、前回のスクレイピングの結果と今回のスクレイピングの結果で 差分があれば2回目も通知するようにしている。

逆に言うと差分がなければ通知されないので、毎回通知させたいなら前回の結果を削除する必要があるが、 毎回通知が来ても邪魔なだけなので要らないと思う。

なおGo言語にしたのは最近よく書いている言語だから、というくらいの理由しかない。

使い方

LINE通知のためにはLINEのアクセストークンが必要なので、先にアクセストークンを発行する。 以下のページを参考に発行する。

https://qiita.com/iitenkida7/items/576a8226ba6584864d95

次にgo getしてgithubからソースを持ってくる。 git cloneでも良いが、gocollyというスクレイピングフレームワークを利用しているので、git cloneなら gocolly自体も別途持ってくる必要がある。

$ go get github.com/nato6933/dmmeikaiwa_scrape
$ cd dmmeikaiwa_scrape/
$ go build

次にconf/setting.yamlを編集する。

setting.yaml.sampleというファイルがおいてあるので、conf/setting.yamlに名前を変えて、あとは中身を 編集する。

line_access_token: # 発行したLINEのトークンをそのまま書く
    abcdefghigjkelmdafdfad
crawl_duration: # DMMのページにアクセスするときのページごとのアクセス時間の調整(単位は秒)。DMMへのアタックにならないようにある程度時間を開けるためにこの項目を用意している。
    1
log_dir_path: # ログと前回の結果が出力されるディレクトリへのパス。ログはローテーションはしないので必要なければ 動かした後にできる parse.log の削除が必要。
    /path/to/logdir
start_time: # 自分が予約したい時間。講師がこれ以前の時間を開示してもLINEには通知されない。
    17:00
end_time: # 自分が予約したい時間の終わりの時間。講師が end_time+30分 以降の時間を開示してもLINEには通知されない。
    23:00
teachers: # 予約したい講師のid。idは講師の単独ページのURLからわかる。
-
    id: #Kuro
        25231
-
    id: #Goggy
        15263

だいたい上の通りだが、補足すると start_timeからend_timeの間のみ通知される。 すべて通知してほしいなら、start_time:02:00、end_time:25:30を指定すれば良い。

teachersにはいくつでも先生を記載できるが、その分スクレイピング時間が長くなるのでせいぜい10人程度に絞った方が良い。 teachersのidはURLのindexの後に続く数字を指定する。

例えば以下のURLならidは25711。

https://eikaiwa.dmm.com/teacher/index/25711/

あとは

$ ./dmmeikaiwa_scrape

で通知されることを確認する。

なお、このコマンドは前回コマンドを実行した際の講師のスケジュールを log/previous_schedule.gob に保存しており、 このファイルが存在する場合は 前回と今回のコマンドの実行結果に差分があれば通知する、という仕様にしている。 (1回目は必ず通知) このコマンド自体はcronなどで定期的に動かすことを想定しているので、前回のスケジュールとの差分を通知する仕様にしているが、 毎回通知が必要であれば log/previous_schedule.gob をコマンド実行後に削除してしまえばよい。

  1. start_time, end_timeに入っているスケジュールだけを選出
  2. 選出されたスケジュールは前回の得たスケジュールとの差分があるかを確認
  3. 差分があれば”すべて”通知

の順番で動作するので、1回目と2回目のコマンド動作の間にsetting.yamlを編集して講師を追加した場合は、 追加した講師のスケジュールがstart_time,end_timeの間に入っていれば通知される。