用 Node.js 打造 FB 天氣機器人

2016/11/03

盧承億(Larry Lu)

  • 台大資工系二年級

  • Backend Developer

  • iOS Developer

  • Github:Larry850806

為什麼想做天氣機器人

 

  • 寫爬蟲抓天氣資料

  • 發送 FB 訊息

  • 佈署到可靠的環境

機器人三步驟

Node.js 是什麼

Node.js 是以 Chrome V8 為基礎的 JS 執行環境

為什麼要使用 Node.js

  • 事件驅動

  • 非同步 I/O

  • 統一前後端語言

  • 用 JavaScript 統治世界

NPM(Node Package manager)

CommonJS

// export module
module.exports = $;
// import module
var $ = require('jquery');

寫爬蟲抓天氣資料

爬蟲是什麼

攻略目標:中央氣象局

會用到的模組

  • request:抓取頁面的 HTML

  • cheerio:分析 HTML

request

var request = require('request');

var url = 'http://www.cwb.gov.tw/V7/forecast/taiwan/Taipei_City.htm';
request(url, function(err, res, body){
    console.log(body);
});
npm install request

cheerio

cheerio 語法

  • tag_name

  • #id

  • .class_name

var cheerio = require('cheerio')
var $ = cheerio.load(body)

var weather = [];
$('table.FcstBoxTable01 > tbody > tr').each(function(){
    weather.push($(this).text().split('\n'));
});

weather

[ 
    [
        '', '\t\t今晚至明晨 06/07 00:00~06/07 06:00', '\t\t25 ~ 26',
        '\t\t', '\t\t', '\t\t舒適', '\t\t30 %', '\t\t' 
    ],
    [
        '', '\t\t明日白天 06/07 06:00~06/07 18:00', '\t\t25 ~ 31',
        '\t\t', '\t\t', '\t\t舒適至悶熱', '\t\t30 %', '\t\t'
    ],
    [
        '', '\t\t明日晚上 06/07 18:00~06/08 06:00', '\t\t26 ~ 29',
        '\t\t', '\t\t', '\t\t舒適至悶熱', '\t\t20 %', '\t\t'
    ]
]

整理一下

weather = weather.map(function(elem){
    return {
        time: elem[1].trim().split(' ')[0],
        temp: elem[2].trim(),
        rain: elem[6].trim()
    }
});
[
    { time: '今晚至明晨', temp: '25 ~ 26', rain: '30 %' },
    { time: '明日白天', temp: '25 ~ 31', rain: '30 %' },
    { time: '明日晚上', temp: '26 ~ 29', rain: '20 %' }
]
var message = weather.map(function(e){
    return e.time + ':溫度 ' + e.temp + ',降雨機率 ' + e.rain;
}).join('\n');
今晚至明晨:溫度 27 ~ 32,降雨機率 0 %
明日白天:溫度 27 ~ 35,降雨機率 30 %
明日晚上:溫度 27 ~ 31,降雨機率 10 %

getWeather.js

var request = require('request');
var cheerio = require('cheerio');

var url = 'http://www.cwb.gov.tw/V7/forecast/taiwan/Taipei_City.htm';
request(url, function(err, res, body){
    var $ = cheerio.load(body);

    var weather = [];
    $('table.FcstBoxTable01 > tbody > tr').each(function(){
        weather.push($(this).text().split('\n'));
    });

    weather = weather.map(function(elem){
        return {
            time: elem[1].trim().split(' ')[0],
            temp: elem[2].trim(),
            rain: elem[6].trim()
        }
    });

    var message = weather.map(function(e){
        return e.time + ':溫度 ' + e.temp + ',降雨機率 ' + e.rain;
    }).join('\n');

    console.log(message);
});

發送 FB 訊息

會用到的模組

  • facebook-chat-api

  • 沒別的了

facebook-chat-api

var login = require('facebook-chat-api');

var user = {
    email: 'FB_EMAIL',
    password: 'FB_PASSWORD'
};

login(user, function(err, api){
    var message = '你好阿';
    var id = 100001567752835;
    api.sendMessage(message, id);
});

send.js

var login = require('facebook-chat-api');
var getWeather = require('./getWeather');

var user = {
    email: 'FB_EMAIL',
    password: 'FB_PASSWORD'
};

login(user, function(err, api){
    getWeather(function(err, weather){
        var id = 100001567752835;
        api.sendMessage(weather, id);
    });
});

定時發送訊息

var interval = 3 * 3600 * 1000;  // 3 hour

setInterval(function(){
    ...
    ...
}, interval);

send.js

var user = {
    email: 'FB_EMAIL',
    password: 'FB_PASSWORD'
};

login(user, function(err, api){
    var id = 100001567752835;
    var interval = 3 * 3600 * 1000; // 3 hour

    setInterval(function(){
        getWeather(function(err, weather){
            api.sendMessage(weather, id);
        });
    }, interval);
});

佈署到可靠的環境

AWS(Amazon Web Service)

用 pm2 監控

Heroku

過程中遇到的困難

其他應用

結合不同平台

Data Visualization

Machine Learning

Chat Bot

謝謝大家

用 Node.js 打造 FB 天氣機器人

By Larry Lu

用 Node.js 打造 FB 天氣機器人

  • 491