reply.js 5.47 KB
var express = require('express');
const request = require('request');
const TARGET_URL = 'https://api.line.me/v2/bot/message/reply'
const TOKEN = '채널 토큰으로 변경'
const fs = require('fs');
const path = require('path');
const HTTPS = require('https');
const domain = "도메인 변경"
const sslport = 23023;

var client_id = 'YOUR_CLIENT_ID';
var client_secret = 'YOUR_CLIENT_SECRET';

var newsOn = false;
var newsOff = true;

const bodyParser = require('body-parser');
var app = express();
app.use(bodyParser.json());
app.post('/hook', function (req, res) {

    var eventObj = req.body.events[0];
    var source = eventObj.source;
    var message = eventObj.message;

   // request log
   console.log('======================', new Date() ,'======================');
   console.log('[request]', req.body);
   console.log('[request source] ', eventObj.source);
   console.log('[request message]', eventObj.message);

   if (message.text == 'news on') {
     newsOn = true;
     newsOff = false;
     request.post(
       {
           url: TARGET_URL,
           headers: {
               'Authorization': `Bearer ${TOKEN}`
           },
           json: {
               "replyToken":eventObj.replyToken,
               "messages":[
                   {
                       "type":"text",
                       "text":"[news On] 키워드를 입력 하세요."
                   }
               ]
           }
       },(error, response, body) => {
           console.log(body)
       });
   } else if ( message.text == 'news off') {
     newsOn = false;
     newsOff = true;
     request.post(
       {
           url: TARGET_URL,
           headers: {
               'Authorization': `Bearer ${TOKEN}`
           },
           json: {
               "replyToken":eventObj.replyToken,
               "messages":[
                   {
                       "type":"text",
                       "text":"[news Off] 뉴스를 종료합니다."
                   }
               ]
           }
       },(error, response, body) => {
           console.log(body)
       });
   }

   if (newsOn & message.text != 'help' & message.text != 'news on') {
       var api_url = 'https://openapi.naver.com/v1/search/news?query=' + encodeURI(message.text); // json 결과
       var options = {
           url: api_url,
           headers: {'X-Naver-Client-Id':client_id, 'X-Naver-Client-Secret': client_secret}
        };
        request.get(options, function (error, response, body) {
           const obj = JSON.parse(body);
           const str = JSON.stringify(obj.items[0]);
           const obj2 = JSON.parse(str);
           if (!error && response.statusCode == 200) {
             request.post(
                 {
                     url: TARGET_URL,
                     headers: {
                       'Authorization': `Bearer ${TOKEN}`
                     },              
                     json: {
                       "replyToken":eventObj.replyToken,
                       "messages": [
                           {
                             "type":"text",
                             "text": "<<<헤드라인>>>\n" + JSON.stringify(obj2.title).replace(/<[^>]*>?/g, '')
                           },
                           {
                            "type":"text",
                            "text": "<<<주요문단>>>\n" + JSON.stringify(obj2.description).replace(/<[^>]*>?/g, '')
                           },
                           {
                             "type":"text",
                             "text": "뉴스 바로가기\n" + JSON.stringify(obj2.link)
                           }
                       ]
                   }
                 },(error, response, body) => {
                   console.log(body)
               }
             )
           } else {
             res.status(response.statusCode).end();
             console.log('error = ' + response.statusCode);
           }
         });

   }

   if (message.text == 'help') {
       request.post(
           {
               url: TARGET_URL,
               headers: {
                   'Authorization': `Bearer ${TOKEN}`
               },
               json: {
                   "replyToken":eventObj.replyToken,
                   "messages":[
                       {
                           "type":"text",
                           "text":"*****************\
                           \n반갑습니다. 주식 news 알리미 입니다.\
                           \n1. 뉴스 검색 기능 활성화\
                           \n\'news on\' 입력\
                           \n2. 뉴스 검색 기능 비활성화\
                           \n\'news off\' 입력\
                           \n*****************"
                       }
                   ]
               }
           },(error, response, body) => {
               console.log(body)
           });
   }
   

   res.sendStatus(200);
});

try {
   const option = {
     ca: fs.readFileSync('/etc/letsencrypt/live/' + domain +'/fullchain.pem'),
     key: fs.readFileSync(path.resolve(process.cwd(), '/etc/letsencrypt/live/' + domain +'/privkey.pem'), 'utf8').toString(),
     cert: fs.readFileSync(path.resolve(process.cwd(), '/etc/letsencrypt/live/' + domain +'/cert.pem'), 'utf8').toString(),
   };
 
   HTTPS.createServer(option, app).listen(sslport, () => {
     console.log(`[HTTPS] Server is started on port ${sslport}`);
   });
 } catch (error) {
   console.log('[HTTPS] HTTPS 오류가 발생하였습니다. HTTPS 서버는 실행되지 않습니다.');
   console.log(error);
 }