Node.jsで講義情報API作ったった【KawazAdventCalendar 6/6】

Node.js

まずは自己紹介から。

札幌市在住の普通の大学生です。
関数型言語をバリバリ書いたり、バイナリアンだとか、女装して(Twitterの)TLに流したりしている人とは比較にならないほど平凡です。

というのは1年前の話で… 昨年末辺りから気付いたら今までには考えられなかったような環境に置かれていて驚いています。 千葉から札幌に引っ越してきた事自体予想外ですし、今働かせていただいている環境や、このKawazというコミュニティに参加して間もなくKawazポータルの開発者メンバー入りなど… 全てが新鮮で刺激的で楽しい日々を送っています。

と、まあ… どんなに素晴らしい環境に置かれたからといって、自分のスキルが勝手に向上するなんてことは無いので、周りの期待を裏切らないよう地道に努力していこうと思います。

楽しいですが、忙しいです><。。

前置きはここまでにして、一応この記事の本題へ。

大学のホームページ上で公開されている講義の変更・休講・振替の情報をまとめてJSONで返してくれるAPIが欲しい!と思ったので作ってみました。

仕組みは簡単で、HTMLを取得して、その中から必要なデータだけを抜き出してオブジェクトを生成し、JSONにシリアライズするだけです。

JSON(ジェイソン、JavaScript Object Notation)は、JavaScriptにおけるオブジェクトの表記法をベースとした軽量なデータ記述言語である。 ~ Wikipediaから引用

例えば、自己紹介をJSONで表記すると

{
    "id": "ww24",
    "年齢": "18",
    "趣味": [
        "旅行"
        "プログラミング",
        "深夜アニメ",
    ],
    "スキル": [
        "HTML",
        "CSS",
        "JavaScript",
        "PHP"
    ]
}

このように表記できます。 構造がシンプルなので、様々なAPIで利用されている形式です。

ソースコードの説明

HTTPサーバを作成

http.createServer(function (req, res) {
    ~
}).listen(port, '127.0.0.1');

外部からJavaScriptで取得できるようにヘッダを吐かせる

res.writeHead(200, {
    'Access-Control-Allow-Origin': '*'
});

siteからHTMLを取得

request({
    url:site,
    encoding: null
}, function (err, response, body) {
    ~
});

文字コードの変換

body = iconv.convert(body).toString('utf8');

cheerioというjQueryに似た機能を提供してくれるモジュールを使ってHTMLをパース

$ = cheerio.load(body);
var $data = $('#first tbody tr');

オブジェクトを生成(これがJSONにシリアライズされます)

var obj = {
    name: 'HIT講義情報API',
    event: [/*ここに講義情報が入る*/]
};

生成したオブジェクトに講義情報を追加

for (var i = 0, l = $data.length; i < l; i++) {
    var $td = $data.eq(i).find("td");
    obj.event[i] = {
        date: $td.eq(0).text(),
        time: $td.eq(1).text(),
        course: $td.eq(2).text(),
        grade: $td.eq(3).text(),
        class: $td.eq(4).text(),
        subject: $td.eq(5).text(),
        teacher: $td.eq(6).text(),
        change_date: $td.eq(7).text(),
        change_time: $td.eq(8).text(),
        room: $td.eq(9).text(),
        note_1: $td.eq(10).text(),
        note_2: $td.eq(11).text()
    }
}

最後に、HTTPサーバからレスポンスを返して終わり

res.write(JSON.stringify(obj, null, '  '));
res.end();

ということをやっています。 (エラー、例外処理の説明は省きました)

こんなデータが返されます

{
  "name": "HIT講義情報API",
  "event": [
    {
      "date": "2012/05/24(木)",
      "time": "3講目",
      "course": "情報フロンティア工学科",
      "grade": "2年",
      "class": "1・2",
      "subject": "オペレーティングシステム",
      "teacher": "稲垣",
      "change_date": "2012/06/29(金)",
      "change_time": "4講目",
      "room": "G204",
      "note_1": "",
      "note_2": ""
    },
~以下略~

あとは、このデータを使ってアプリや自分に関係のある情報だけ抜き出して通知するようなサービスを簡単に作ることができます。

実際に動いているものはこちら→ HIT講義情報API

ソースコードはこちら

実質2時間ほどで書けました。 技術的な細かいあれこれは、整理してから後日自分のブログへ投稿すると思うので、興味のある方は見ていってね(`・ω・´)

1 サク・リバー (@sakuriver)

記事の書き込みお疲れ様です 若さがうらやましいタンスですry

Alisueさんにつづいて、まさかの第2段JSONが分からないデザイナー やプランナーさんを「?」にさせるプレイですね分かります

JSONで返すAPIを作成すると何に利用しやすいかとか付加的価値がアプリとしての説明がないと「ゲームや物を作りたい」で集まっているKawazメンバーにとっては生殺しかなーという老婆発言です

2 ぎぎねっと (@giginet)

相変わらずプログラマ以外置いてけぼりですねwww

ソースコード読みました。

似たようなモノを作ったときは、RubyのmechanizeやPythonのBeautifulSoupなんかを使ってWebサイトのスクレイピングをしていたんですけど、nodeのこのライブラリ使いやすそうですね。

ちなみに、僕は自動車学校に通っていたときに、毎回講習の予定を登録するのが面倒だったので、会員サイトをスクレイピングしてGoogleカレンダーに自動同期するスクリプト書いてましたよ!

jQueryっぽくCSSセレクタでスクレイピングできるのがいいなぁ。

もっぱら、最近はAPIが提供されていたり、されていなくてもRSSフィードを吐いているケースがほとんどなので、自前でスクレイピングする機会は減りましたよね。

3 テツオ (@Tetchan70s)

ぬう・・・わからん(笑)

もうこうなるとコメントも何も、わからないことばかりなので、率直に「プログラムって便利!」と、感心です。組めたらあんなことやこんなことが・・・。

Only registered users are allowed to comment on the entry. Please log in to comment.