上記を組み合わせただけでーす。
classとか使えばもっといい感じに連携できるのかも知れませんが、今回は愚直にやります。
お天気情報のメール配信プログラムです
yahooから天気情報にアクセスして、画像を取得の上、メールに天気情報をのせて送信します。
いろいろ必要なので事前にインストールしておいてください。
npm i co
npm i nodemailer
npm i fs
npm i puppeteer
npm i date-utils
npm i bluebird
で、ぜんぶかな(たぶん)
tenkimail.js
const co = require('co');
const mailer = require('nodemailer');
const fs = require('fs');
const puppeteer = require('puppeteer');
//時間
require('date-utils');
let now = new Date();
(async () => {
const mail_config = {
"host": "xxxxxxxxxx.ne.jp", //SMTPホスト
"port": "587", // ポート
"auth": {
"user": "メールアドレス@aaa.aaaa", //ユーザー名
"pass": "xxxxxxxxxxx" // パスワード
}
}
const browser = await puppeteer.launch({ args: ['--no-sandbox'] });
const page = await browser.newPage();
// ページ作成
await page.goto('https://weather.yahoo.co.jp/weather/');
await page.waitFor(2000);
// 文章の取得
console.log(await page.title());
const texts = await page.$eval('#condition .text', item => { return item.innerHTML });
console.log(texts);
// スクリーンショット撮影
let element = await page.$('#forecastMap');
await element.screenshot({ path: 'screenshot-tenki.png' });
await browser.close();
//SMTPの接続
var smtp_tmp = mailer.createTransport(mail_config);
// プロミス化
var smtp = require('bluebird').promisifyAll(smtp_tmp);
// メール内容の設定
var mail = {
from: "メールアドレス@aaa.aaaa", //送信元
to: "xxxxxxxxxxxxxx@gmail.com", // 送信先
subject: now.toFormat('YYYY年MM月DD日 HH24時MI分SS秒') + "天気予報", //メールのタイトル
text: texts, //メール本文
attachments:[{
filename: "screenshot-tenki.png",
content: fs.readFileSync("screenshot-tenki.png")
}]
};
co(function*(){
try{
var res = yield smtp.sendMailAsync(mail);
console.log(res);
}catch(e){
console.log("Error");
console.log(e);
}
smtp.close();
});
})();
実行は
node tenkimail.js
スケジューラーに組み込んだり、PM2でデーモン化したりするといいですよ。
活用アイデア
毎日の株価の配信とか?
30秒ごととかで検索をかけて、条件を満たしたらメールで通知するとかがすごく役に立ちそうな気がします。
いい使い方があったら教えてください。