pupeteerで情報を取得してメール送信してみる

上記を組み合わせただけでーす。
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秒ごととかで検索をかけて、条件を満たしたらメールで通知するとかがすごく役に立ちそうな気がします。
いい使い方があったら教えてください。