用 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