iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 26
0
DevOps

Puppeteer系列 第 26

Puppeteer & line 通知 (三)

介紹

前篇寫了些 line bot 與heroku 對應的介紹,那樣的寫法是可以透過 endpoint payload 打查詢資料去撈到主機的訊息 ,雖然也可以透過line 的 notifaction 去做推播通知但是這是要付費的,所以如果要做line通知的話可以使用 notify 這個是沒有雙向的服務單純只是通知所以很適合用在 Puppeteer 的通知或是主機的通知

https://notify-bot.line.me/zh_TW/

申請完後會出現這樣的畫面,然後要去Email那邊認證一下信箱

https://ithelp.ithome.com.tw/upload/images/20180117/20103438yWpWVLVweO.png

右上的選單有個個人服務,這邊有個人頁面裡面有個開發人員的設定可以指定哪些line 的朋友可以使用這個服務
指定

接下來接續上兩篇的 hreoku + linebot 這篇要來介紹的是 notify的單向推播通知功能
先透過 spwan 這個打開頁面 ,並把config值帶入打開頁面先註冊line notify 認證

var url = "https://notify-bot.line.me/oauth/authorize?client_id=" + client_id + "&response_type=code&redirect_uri=" + redirect_uri + "&scope=notify&state=" + state + "&response_mode=form_post";

webhook callback的地方設定如下
如果 "getAuthCode" === req.body.state 時候 打入的 payload有包含認證過的就發一個post到line提供的
oauth


  request.post({
            url: "https://notify-bot.line.me/oauth/token",
            formData: formData
        },
        

這邊裝一個 readline 可以 在console底下 繼續發送 request post 給 notify去給他推播


  const rl = readline.createInterface({
                    input: process.stdin,
                    output: process.stdout
                });


讓console 輸入資料 rl.question('say words? ', (answer)...

request.post({
                            url: "https://notify-api.line.me/api/notify",
                            headers: {
                                "Content-Type": "application/x-www-form-urlencoded",
                                "Authorization": "Bearer " + access_token
                            },
                            formData: {
                                message: answer,
                            }
                            

import { KeyData } from '../keyData/key'

var client_id = KeyData.client_id;
var client_secret = KeyData.client_secret;
var redirect_uri = KeyData.redirect_uri;

var spawn = require('child_process').spawn
import https = require("https");
import express = require("express");
import bodyParser = require('body-parser');
import request = require("request");
var readline = require("readline");

//1.start to get auth code
var state = "getAuthCode"
var url = "https://notify-bot.line.me/oauth/authorize?client_id=" + client_id + "&response_type=code&redirect_uri=" + redirect_uri + "&scope=notify&state=" + state + "&response_mode=form_post";
console.log(url)
spawn('open', [url]);


let app = express();
app.use(bodyParser.json());
app.use(bodyParser.urlencoded());

app.post('/callback', function (req, rep) {
    let code = req.body.code;
    let uid = req.query.uid;
    if ("getAuthCode" === req.body.state) {
        //2.start get auth token
        var formData = {
            grant_type: "authorization_code",
            code: code,
            redirect_uri: redirect_uri,
            client_id: client_id,
            client_secret: client_secret
        }
        request.post({
            url: "https://notify-bot.line.me/oauth/token",
            formData: formData
        },
            (err, httpResponse, body) => {
                var json = JSON.parse(body);
                const access_token = json.access_token;
                //set uid with access_token

                const rl = readline.createInterface({
                    input: process.stdin,
                    output: process.stdout
                });

                let ansyncQ = () => {
                    rl.question('say words? ', (answer) => {
                        //3.start to notify
                        console.log(answer, access_token)

                        request.post({
                            url: "https://notify-api.line.me/api/notify",
                            headers: {
                                "Content-Type": "application/x-www-form-urlencoded",
                                "Authorization": "Bearer " + access_token
                            },
                            formData: {
                                message: answer,
                            }
                        },
                            (err, httpResponse, body) => {
                                console.log(body);
                            }
                        )
                        ansyncQ();
                        // rl.close();
                    });
                }
                ansyncQ();


            });
    }
    rep.end("ok")
})
app.listen(3000);

總結

nofify 設定上比較多些,但是因為 puppeteer 用這個個人覺得不用錢的可以做到line通知也是很不錯,附上程式碼

github.com/polo13999/linenotify

原始碼參考程式 特別感謝 wolke lin 大大 教學

https://github.com/Wolke/line_notify_example


上一篇
Puppeteer & line 通知 (二)
下一篇
Puppeteer & Mouse
系列文
Puppeteer30

尚未有邦友留言

立即登入留言