5
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

[Node.js][LINE] 毎日 LINE に花粉情報を通知する

Last updated at Posted at 2021-02-27

概要

に引き続き、LINE Notify を使って LINE に通知するシリーズです!

花粉 (デス・パウダー)が辛い季節ですね :disappointed_relieved: 花粉情報が非常に気になる毎日なので、当日の花粉情報を LINE に通知するようにしました。

方法

バージョン情報

  • Node.js 14.15.5
  • Playwright 1.9.1
  • axios 0.21.1

コード

まず Playwright を使ってヘッドレス Chrome を操作し、Yahoo! JAPAN の花粉情報のスクリーンショットを撮影します。花粉情報のページの URL は任意の地域のものに書き換えてください。なお、本当は 日本気象協会 tenki.jp の花粉情報を通知したかったのですが、Playwright でのアクセスがタイムアウトになってしまうので諦めました。スクレイピング対策されているのかもしれませんね。

そして axios を使って LINE Notify の API を叩き、LINE に通知します。LINE Notify はメッセージを送信できるだけでなく、画像を送信することもできます。

~/workspace/death_powder_forcast/main.js
const { chromium } = require('playwright');
const fs = require('fs');
const axios = require('axios');
const FormData = require('form-data');

// Yahoo! JAPAN の福岡市中央区の花粉情報。
const POLLEN_FORCAST_URL = 'https://weather.yahoo.co.jp/weather/pollen/10/40/40133/'; 
const SCREENSHOT_FILEPATH = './today.png';
const LINE_NOTIFY_TOKEN = 'ここに LINE Notify のトークンを入力する。';

// 指定した要素のスクリーンショットを撮影する。
const takeScreenshot = async ({ url, selector, filepath }) => {
  // Raspberry Pi では ARM 用の Chromium を使用する必要があるので executablePath を指定する。
  const browser = await chromium.launch({ executablePath: '/usr/bin/chromium-browser' });
  const context = await browser.newContext();
  const page = await context.newPage();
  await page.goto(url);
  const element = await page.$(selector);
  await element.screenshot({ path: filepath });
  await browser.close();
};

// LINE Notify に通知する。
const notifyLINE = async ({ token, message, imageFilepath = null }) => {
  const LINE_NOTIFY_API_URL = 'https://notify-api.line.me/api/notify';

  const formData = new FormData();
  formData.append('message', message);
  if (imageFilepath) {
    formData.append('imageFile', fs.createReadStream(imageFilepath));
  }

  const headers = {
    'Authorization': `Bearer ${token}`,
    ...formData.getHeaders()
  };

  await axios.post(LINE_NOTIFY_API_URL, formData, { headers });
};

(async () => {
  await takeScreenshot({
    url: POLLEN_FORCAST_URL,
    selector: '.pollenFlying_city_day:first-child',
    filepath: SCREENSHOT_FILEPATH
  });

  if (!fs.existsSync(SCREENSHOT_FILEPATH)) {
    process.exit(1);
  }

  await notifyLINE({
    token: LINE_NOTIFY_TOKEN,
    message: '今日の花粉情報です。',
    imageFilepath: SCREENSHOT_FILEPATH
  });

  fs.unlinkSync(SCREENSHOT_FILEPATH);
})();

上記の Node.js ファイルを cron で定期実行します。通知してほしい時刻を指定してください。

crontab
# 設定例
0 7 * * * /bin/bash -c 'export PATH=$HOME/.nodenv/bin:$PATH; eval "$(nodenv init -)"; cd $HOME/workspace/death_powder_forcast; node main.js'

これで通知が届きました 💖

5
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?