app.js 11 KB
var express = require('express');
const Token = require('./apiKey.json');
const request = require('request');const TARGET_URL = 'https://api.line.me/v2/bot/message/reply'
const TOKEN = Token.line_token;
const binanceKey = Token.binance_key;
const fs = require('fs');
const path = require('path');
const HTTPS = require('https');
const fetch = require('node-fetch');
const rp = require('request-promise');
const domain = "2018102235.oss2021.tk"
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 === '김프'){
        command = '김프';
    }
    else if (message.text === '거래량비율')
      volumePumpingRatioThreeMinutePerWeek(eventObj.replyToken, message.text);

    else{
        if(command === '김프'){
            kimp(eventObj.replyToken, message.text);
        }
    }

    res.sendStatus(200);
});

function kimp(replyToken,message){

  var upbitPrice = 0;
  function korean_price(){
      var promise = new Promise(function(resolve,reject){
        const url = 'https://api.upbit.com/v1/candles/minutes/1?market=KRW-'+message+'&count=1';
        const options = {method: 'GET', headers: {Accept: 'application/json'}};
        fetch(url, options)
        .then(res => res.json())
        .then(json => {
            upbitPrice = json[0].trade_price;
            resolve(upbitPrice);
        })
        .catch(err => console.error('error:' + err));  
      });
      return promise;
  } 
  korean_price().then(function(upbitPrice){
    compare_price(replyToken, message, upbitPrice);
  }); 
}

function compare_price(replyToken, message, upbitPrice){
  var binancePrice = 0;
  function binance_price(){
    var promise = new Promise(function(resolve, reject){
      const url = 'https://api.binance.com/api/v3/ticker/price?symbol='+message+'USDT';
      const options = {method: 'GET', headers: {Accept: 'application/json'}};
      const requestOptions = {
        method: 'GET',
        uri: 'https://pro-api.coinmarketcap.com/v1/cryptocurrency/listings/latest',
        qs: {
          'start': '1',
          'limit': '10',
          'convert': 'KRW'
        },
        headers: {
          'X-CMC_PRO_API_KEY': binanceKey
        },
        json: true,
        gzip: true
      };
      fetch(url, options)
        .then(res => res.json())
        .then(json => 
          rp(requestOptions).then(response =>{
            var i=0;
            while(response.data[i].id !== 825){
              i = i+1;
            }
            binancePrice = json.price*response.data[i].quote.KRW.price;
            resolve(binancePrice);
          })
         ).catch(err => console.error('error:' + err));
    });
    return promise;
  }

  binance_price().then(function(binancePrice){
    request.post(
      {
          url: TARGET_URL,
          headers: {
              'Authorization': `Bearer ${TOKEN}`
          },
          json: {
              "replyToken":replyToken,
              "messages":[
                  {
                      "type":"text",
                      "text":"binance : "+String(binancePrice.toFixed())+"원"
                  },
                  {
                    "type":"text",
                    "text":"Upbit : "+String(upbitPrice)+"원"
                  },
                  {
                    "type":"text",
                    "text":"김치프리미엄 : "+String(((upbitPrice-binancePrice)/upbitPrice*100).toFixed(2))+"%"
                  }
               ]
          }
      },(error, response, body) => {
          console.log(body)
    });
    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);
  }