index.js 5.53 KB
"use strict";

const line = require("@line/bot-sdk");
const express = require("express");
const config = require("./config.json");
const bodyParser = require("body-parser");
const axios = require("axios");
const fs = require("fs");
const request = require("request");
const moment = require("moment");
const flexMsg = require("./flexMsg");
const ContentService = require("./services/ContentService");
const LineService = require("./services/LineService");

// create LINE SDK client
const client = new line.Client(config);

const app = express();

// webhook callback
let debugMode = false;
app.use("/webhook", line.middleware(config));
app.post("/webhook", (req, res) => {
  // req.body.events should be an array of events
  if (!Array.isArray(req.body.events)) {
    return res.status(500).end();
  }
  console.log('req.body.events !',req.body.events)
  // handle events separately
  Promise.all(
    req.body.events.map((event) => {
      console.log("event", event);
      // check verify webhook event
      if (
        event.replyToken === "00000000000000000000000000000000" ||
        event.replyToken === "ffffffffffffffffffffffffffffffff"
      ) {
        return;
      }
      return handleEvent(event);
    })
  )
    .then(() => res.end())
    .catch((err) => {
      console.error(err);
      res.status(500).end();
    });
});

const handleEvent = (event) => {
  let payload = {
    type: "text",
    text: "Hello From PUI",
  };

  if (event.type == "message" && event.message.type == "text") {
    let selecttext = String(event.message.text).toLowerCase();
    let get_text = ContentService.mockText()[selecttext];
    if (get_text) {
      payload = get_text;
    }
  } else {
    payload.text = "Other Message =>>>" + JSON.stringify(event);
  }

  console.log("SEND TO ==> " + JSON.stringify(payload));

  return client.replyMessage(event.replyToken, payload);
};

app.use(bodyParser.json());
app.get("/", (req, res) => {
  res.json({ line: "ok" });
});

app.post("/push", (req, res) => {
  let body = req.body;
  let { user_id, message } = body;
  console.log("push =>> body ::", body);
  if (!message) {
    message = {
      type: "text",
      text: `Push Message! to ${user_id}`,
    };
  }
  client.pushMessage(user_id, message);
  res.json(message);
});

app.post("/multicast", (req, res) => {
  let body = req.body;
  let { user_ids } = body;
  console.log("body ::", body);
  let message = [
    {
      type: "text",
      text: `use multicast Message1! to ${JSON.stringify(user_ids)}`,
    },
    {
      type: "text",
      text: `use multicast Message2! to ${JSON.stringify(user_ids)}`,
    },
  ];

  client.multicast(user_ids, message);
  res.json(message);
});

app.post("/multicast", (req, res) => {
  let body = req.body;
  let { user_ids } = body;
  console.log("body ::", body);
  let message = [
    {
      type: "text",
      text: `use multicast Message1! to ${JSON.stringify(user_ids)}`,
    },
    {
      type: "text",
      text: `use multicast Message2! to ${JSON.stringify(user_ids)}`,
    },
  ];

  client.multicast(user_ids, message);
  res.json(message);
});

app.post("/broadcast", async (req, res) => {
  let body = req.body;
  let { messages } = body;
  console.log("body ::", body);

  let resx = await LineService.Broadcast(messages);
  console.log("resx", resx);

  res.json({ message: "OK" });
});

app.post("/save", bodyParser.json(), async (req, res) => {
  console.log("saveFile!");
  try {
    const downloadFile = function (uri, filename, callback) {
      request.head(uri, function (err, res, body) {
        console.log("content-type:", res.headers["content-type"]);
        console.log("content-length:", res.headers["content-length"]);
        console.log("Content-Type:", res.headers["Content-Type"]);
        console.log("res.headers ::", res.headers);

        request(uri, {
          headers: {
            Authorization:
              "Bearer be/XHjQ+gMoypZE78Us7hk0h6PA04TyfpQciMOq+B/OVPmumozdhGzYUwopDgsOMCM7RymTK8m++q20GSj3c6B7gZkgEmuGYEYPvc6j+4as6X5bu7tEg+KAZKMfBVDnk+ekpAorC7FMwVPyt2frGRQdB04t89/1O/w1cDnyilFU=",
          },
        })
          .pipe(fs.createWriteStream(filename))
          .on("close", callback);
      });
    };

    let unquie_file = moment().format("YYYY-MM-DD_HHmmssss");
    let file_name = `filesave_${unquie_file}`;
    let message_id = req.body.message_id;
    let URI = `https://api-data.line.me/v2/bot/message/${message_id}/content`;
    console.log("message_id ::", message_id);
    console.log("file_name ::", file_name);

    axios
      .get(URI, {
        headers: {
          Authorization:
            "Bearer be/XHjQ+gMoypZE78Us7hk0h6PA04TyfpQciMOq+B/OVPmumozdhGzYUwopDgsOMCM7RymTK8m++q20GSj3c6B7gZkgEmuGYEYPvc6j+4as6X5bu7tEg+KAZKMfBVDnk+ekpAorC7FMwVPyt2frGRQdB04t89/1O/w1cDnyilFU=",
        },
      })
      .then(function (response) {
        // handle success
        console.log("axios =>>", response.headers["content-type"]);
        let sp = response.headers["content-type"].split("/");
        let type = sp[sp.length - 1];
        let full_file_name = file_name + "." + type;
        console.log("full_file_name =", full_file_name);
        downloadFile(URI, full_file_name, function () {
          console.log("done!");
          res.json({ LoadFlieName: "Success" });
        });
      })
      .catch(function (error) {
        // handle error
        console.log(error);
        console.error("errorxx ::", error);
        res.json({ error: "error" });
      });
  } catch (error) {
    console.error("errorxx ::", error);
  }
});

const port = config.port;
app.listen(port, () => {
  console.log(`listening on ${port}`);
});