Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

Node.jsで特定の電車遅延情報をLINEに送信する

More than 1 year has passed since last update.

環境

  • Node.js(v8.10.0)

必要なパッケージのインストール

下記のパッケージをインストールします。

  • axios(v0.16.2)
  • querystring(v0.2.0)
DOS
npm install axios
npm install querystring

遅延情報をJSONで取得するモジュール

遅延情報はこちらのAPIを使用させて頂きました。
鉄道遅延情報のjson

deley.js
let https = require('https');
const URL = 'https://rti-giken.jp/fhc/api/train_tetsudo/delay.json';

const Deley = function () {};

Deley.prototype.getDeleyData = function () {
    return new Promise(function (resolve) {
        https.get(URL, (res) => {
            let body = '';
            res.setEncoding('utf8');

            res.on('data', (chunk) => {
                body += chunk;
            });

            res.on('end', (res) => {
                res = JSON.parse(body);
                resolve(res);
            });
        }).on('error', (e) => {
            console.log(e.message);
        });
    });
};

module.exports = Deley;

httpモジュールもhttpsモジュールもgetメソッドが非同期なので、単純に呼び出しても大変扱いにくいという・・・
そんな時にPromiseが役に立つということで、こんな感じにしてみました。
下のLINEモジュールはaxiosを使用していますが、こっちはaxiosを使わずに生Promiseで書いています。

LINEに投稿するモジュール

line.js
const axios = require('axios');
const querystring = require('querystring');

const Line = function () {};

Line.prototype.setToken = function (token) {
    this.token = token;
};

Line.prototype.notify = function (text) {
    // トークンチェック
    if (this.token == undefined || this.token == null) {
        return;
    }
    // 投稿
    axios({
            method: 'post',
            url: 'https://notify-api.line.me/api/notify',
            headers: {
                Authorization: `Bearer ${this.token}`,
                'Content-Type': 'application/x-www-form-urlencoded',
            },
            // リクエストデータの生成にquerystringを使用
            data: querystring.stringify({
                message: text,
            }),
        })
        .then(function (res) {
            console.log(res.data);
        })
        .catch(function (error) {
            console.error(error);
        });
};

module.exports = Line;

投稿してみる

実際に投稿するには【公式】LINE Notifyでトークンを発行する必要があります。
発行したトークンはsetToken()の引数に渡してください。

index.js
const Line = require('./line');
const Deley = require('./deley');

const myLine = new Line();
const myDeley = new Deley();

// LINE Notify トークンセット
myLine.setToken("トークン文字列");

// 遅延情報を取得
myDeley.getDeleyData().then(function(res){
    res.forEach(function(data){
       // LINE Notify 実行
       if(data.name == "東海道線" || data.name == "上野東京ライン"){
           myLine.notify("現在、" + data.name + "が遅延しています。");
       }
    });
});

今回は僕がよく使う東海道線と上野東京ラインの遅延情報だけを通知しています。
(コーディングした日はどちらの線も実際に15分程度遅延が起きていました。)

linenotify.png

HerokuにデプロイしてIFTTTとかで朝7:00、夕方18:00とかにAPI叩けば急な電車遅延にも対応できる!?

参考

tsumasakky
自社WebアプリケーションのSE(開発、販売、営業) -> Webアプリケーション受託開発のPG ※ 記事の内容は個人の見解であり所属する組織の公式見解ではありません。(当然ながら)
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away