LoginSignup
3
3

More than 5 years have passed since last update.

LINEのBotでキャンセル枠の通知

Posted at

はじめに

イベントのキャンセル枠を確認するのにいちいちイベントサイトを確認していたのですが(キャンセル待ちができないイベント…),勉強がてらLineのBotくんにキャンセル枠を通知してもらう仕組みを作ってみました,主にMessaging API - クイックスタートHeroku を使って無料でアプリを開発を参考にしました.だらだらと実装してしまいましたが,難しいことはなく簡単でした.

処理イメージ

Screen Shot 2018-11-20 at 1.05.06.png

ファイル構成

参考までに,ソースコードはGitHubで公開しています.express-generatorのテンプレートから不必要な部分(UIなど)を削除し,後ほど紹介するcron.jsやline.jsなどを少し加えただけです(Procfileは,Herokuのためのファイル).

$ tree -I node_modules
.
├── Procfile
├── README.md
├── app.js
├── bin
│   └── www
├── lib
│   ├── cron.js
│   └── line.js
├── package-lock.json
└── package.json

主なコード

app.js

サーバ本体のコードです.エンドポイントの/healthは,無料のヘルスチェックサービスのUptime Robotから定期的にアクセスされます.無料枠のHeroku(Free Dyno Hours)がスリープしないようにするためです.

app.js
const express = require('express');
const app = express();
require('./lib/cron');

app.get('/health', (_, res) => {
    res.sendStatus(200);
});

module.exports = app;

lib/line.js

LINEのMessage APIにアクセスするためのクライアントです.channelAccessTokenchannelSecretは,Messaging API - クイックスタートを参考に取得できます.

lib/line.js
const line = require("@line/bot-sdk");

const credential = {
    channelAccessToken: process.env.LINE_ACCESS_TOKEN,
    channelSecret: process.env.LINE_CHANNEL_SECRET 
};
const client = new line.Client(credential);

module.exports = {
    client
}

lib/cron.js

node-cronを用いて,Herokuサーバから定期的にイベントページへアクセスさせます(毎日8, 12, 18, 22時にアクセスし確認するように設定).イベントのキャンセル枠は,(雑ですが)タイトルに”空”という文字が含まれるかどうかをみることで確認します.キャンセルがある場合は,ユーザ(USER_ID)にイベントタイトルと申し込みページのURLをプッシュします.勉強目的で開発したため宛先を固定していますが,もう少し手を加えてユーザごとに監視するイベントやタイミングなどをデータベースで管理するということもできるかなと思っています.自分のUSER_IDは,LINE Developersのチャネル基本設定の最後にあります.

lib/cron.js
const request = require('request');
const cron = require('node-cron');
const cheerio = require('cheerio');
const { client } = require('./line');

cron.schedule('0 8,12,18,22 * * *', () => {
    // イベントページにアクセスします.
    request({
        method: 'GET',
        uri: process.env.URL
    }, (err, res, body) => {
        if (err || res.statusCode !== 200) {
            console.error(err || res.statusCode);
        }
        // イベントタイトルを取得します.
        const $ = cheerio.load(body);
        const title = $('.event_name').text().replace(/\s+/g, '');
        if (title.match(/空/) !== null) {
            // キャンセルがある場合,ユーザへメッセージを送信します.
            client.pushMessage(process.env.USER_ID, {
                type: 'text',
                text: `${title} - ${process.env.URL}`
            });
        } else {
            // 確認用のログです.意味はありません.
            console.log('キャンセルはありませんでした');
        }
    });
});

さいごに

日常的に使っているLINEに,キャンセル通知がくることで確認するためのストレスが減りました.なかなか良いです.他にも通知させると楽になりそうなものは手作りしてみようかなという気持ちになっています.今回利用したHerokuやUptime Robotは無料ですし,開発する時間と意欲さえあればという感じです

3
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
3
3