Node.js에서 특정 기차 지연 정보를 LINE에 전송

환경


  • Node.js (v8.10.0)

  • 필요한 패키지 설치



    아래 패키지를 설치합니다.
  • axios (v0.16.2)
  • querystring(v0.2.0)

  • 도스
    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분 정도 지연이 일어났습니다.)



    Heroku에 배포하고 IFTTT라든지 아침 7:00, 저녁 18:00라든지 API 두드리면 가파른 전철 지연에도 대응할 수 있다! ?

    참고


  • LINE Notify를 node.js에서 사용
  • Promise와 친해지고 기분 좋게 비동기 처리를 작성합시다.
  • 자바스크립트 Promise
  • 좋은 웹페이지 즐겨찾기