line.js 8.23 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 fetch = require('node-fetch');
const rp = require('request-promise');
const domain = "/* 수정 */"
const sslport = 23023;
const bodyParser = require('body-parser');
var app = express();
var command = '';
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] ', source);
    console.log('[request message]', message);

    /*=============================================================*/
    
    if(message.text === '거래량비율')
        volumePumpingRatioThreeMinutePerWeek(eventObj.replyToken, message.text);

    /*=============================================================*/

    res.sendStatus(200);
});

function volumePumpingRatioThreeMinutePerWeek(replyToken, message)
{
    fs.readFile('coin_name.txt', 'utf8', function(err,data){
        coinNameArr = data.split(",");
        

        var volumePerWeekArr = new Array();
        function getWeekVolume()
        {
            var promise = new Promise(function(resolve, reject)
            {
                for (i = 0; i < coinNameArr.length; ++i)
                {
                    (function (i)
                    {
                        setTimeout(function () {
                            const url = 'https://api.upbit.com/v1/candles/weeks/?market='+coinNameArr[i]+'&count=1';
                            const options = {method: 'GET', headers: {Accept: 'application/json'}};
                            var coinJson = new Object();
                            fetch(url, options)
                            .then(res => res.json())
                            .then(json => {
                                coinJson.coin = coinNameArr[i];
                                coinJson.tradeVolumePerWeek = json[0].candle_acc_trade_volume;
                                volumePerWeekArr.push(coinJson);
                                console.log(coinJson);
                                if (volumePerWeekArr.length >= coinNameArr.length)
                                    resolve(volumePerWeekArr);
                            })
                            .catch(err => console.error('error:' + err));
                        }, i*220);    
                    })(i);
                }
            });
            return promise;
        }


        var volumePerThreeMinArr = new Array();
        function getThreeMinVolume()
        {
            var promise = new Promise(function(resolve, reject)
            {
                for (i = 0; i < coinNameArr.length; ++i)
                {
                    (function (i)
                    {
                        setTimeout(function () {
                            const url = 'https://api.upbit.com/v1/candles/minutes/3?market='+coinNameArr[i]+'&count=1';
                            const options = {method: 'GET', headers: {Accept: 'application/json'}};
                            var coinJson = new Object();
                            fetch(url, options)
                            .then(res => res.json())
                            .then(json => {
                                coinJson.coin = coinNameArr[i];
                                coinJson.tradeVolumePerThreeMin = json[0].candle_acc_trade_volume;
                                volumePerThreeMinArr.push(coinJson);
                                console.log(coinJson);
                                if (volumePerThreeMinArr.length >= coinNameArr.length)
                                    resolve(volumePerThreeMinArr);
                            })
                            .catch(err => console.error('error:' + err));
                        }, i*220);    
                    })(i);
                }

            });
            return promise;
        }


        var pumpingArr = new Array();
        function getResultArr(volArr, minArr)
        {   
            var promise = new Promise(function(resolve, reject)
            {
                for (var i = 0; i < coinNameArr.length; i++)
                {
                    var coinJson = new Object();
                    coinJson.name = coinNameArr[i];
                    coinJson.pumpingRatio = minArr[i].tradeVolumePerThreeMin / volArr[i].tradeVolumePerWeek * 1000000
                    pumpingArr.push(coinJson);
                    if (pumpingArr.length >= coinNameArr.length)
                        resolve(pumpingArr);
                }    
            })
        return promise;
        }
        
        function sortingArr(data, ratio) 
        {    
            var promise = new Promise(function(resolve, reject)
            {
                resolve(data.sort(function(first, second)
                {
                    var a = first[ratio];
                    var b = second[ratio];
                    
                    return a > b ? -1 : a < b ? 1 : 0;
                }))
            });

            return promise;
        };

        getWeekVolume().then(function(volArr){
            getThreeMinVolume().then(function(minArr){
                getResultArr(volArr, minArr).then(function(result){
                    sortingArr(result, "pumpingRatio").then(function(finalArr){
                        
                        console.log(finalArr);
                        request.post(
                            {
                                url: TARGET_URL,
                                headers: {
                                    'Authorization': `Bearer ${TOKEN}`
                                },
                                json: {
                                    "replyToken":replyToken,
                                    "messages": [
                                        {
                                            "type":"text",
                                            "text": finalArr[0].name + ' : ' + String(finalArr[0].pumpingRatio) + '\n'
                                            + finalArr[1].name + ' : ' + String(finalArr[1].pumpingRatio) + '\n'
                                            + finalArr[2].name + ' : ' + String(finalArr[2].pumpingRatio) + '\n'
                                            + finalArr[3].name + ' : ' + String(finalArr[3].pumpingRatio) + '\n'
                                            + finalArr[4].name + ' : ' + String(finalArr[4].pumpingRatio) + '\n'
                                            + finalArr[5].name + ' : ' + String(finalArr[5].pumpingRatio) + '\n'
                                            + finalArr[6].name + ' : ' + String(finalArr[6].pumpingRatio) + '\n'
                                            + finalArr[7].name + ' : ' + String(finalArr[7].pumpingRatio) + '\n'
                                            + finalArr[8].name + ' : ' + String(finalArr[8].pumpingRatio) + '\n'
                                            + finalArr[9].name + ' : ' + String(finalArr[9].pumpingRatio) + '\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);
  }