Showing
3 changed files
with
170 additions
and
9 deletions
| 1 | var express = require('express'); | 1 | var express = require('express'); |
| 2 | const Token = require('./apiKey.json'); | 2 | const Token = require('./apiKey.json'); |
| 3 | -const request = require('request');const TARGET_URL = 'https://api.line.me/v2/bot/message/reply' | 3 | +const request = require('request'); |
| 4 | +const TARGET_URL_PUSH = 'https://api.line.me/v2/bot/message/push' | ||
| 5 | +const TARGET_URL_REPLY = 'https://api.line.me/v2/bot/message/reply' | ||
| 6 | +const MULTI_TARGET_URL = 'https://api.line.me/v2/bot/message/multicast' | ||
| 7 | +const BROAD_TARGET_URL = 'https://api.line.me/v2/bot/message/broadcast' | ||
| 8 | +const USER_ID = 'U15e01e0a7f2c980b8cb755421312fba4' | ||
| 4 | const TOKEN = Token.line_token; | 9 | const TOKEN = Token.line_token; |
| 5 | const binanceKey = Token.binance_key; | 10 | const binanceKey = Token.binance_key; |
| 6 | const fs = require('fs'); | 11 | const fs = require('fs'); |
| ... | @@ -11,9 +16,25 @@ const rp = require('request-promise'); | ... | @@ -11,9 +16,25 @@ const rp = require('request-promise'); |
| 11 | const domain = "2018102235.oss2021.tk" | 16 | const domain = "2018102235.oss2021.tk" |
| 12 | const sslport = 23023; | 17 | const sslport = 23023; |
| 13 | const bodyParser = require('body-parser'); | 18 | const bodyParser = require('body-parser'); |
| 19 | +const fs_apikey = require('fs'); | ||
| 20 | +const api_key = fs_apikey.readFileSync('apiKeyWhale', 'ascii') | ||
| 14 | var app = express(); | 21 | var app = express(); |
| 15 | var command = ''; | 22 | var command = ''; |
| 23 | +var cursor = '' | ||
| 24 | + | ||
| 25 | + | ||
| 26 | +const KR_TIME_DIFF = 9 * 60 * 60 * 1000; | ||
| 27 | +var TimeNow = parseInt((new Date()).getTime() / 1000) | ||
| 28 | +var uts2time = new Date() | ||
| 29 | + | ||
| 30 | +var PushTimeId; | ||
| 31 | +console.log(TimeNow) | ||
| 32 | +var explain = 0; | ||
| 33 | + | ||
| 16 | app.use(bodyParser.json()); | 34 | app.use(bodyParser.json()); |
| 35 | +if(explain <1){ | ||
| 36 | + explain_message(); | ||
| 37 | +} | ||
| 17 | app.post('/hook', function (req, res) { | 38 | app.post('/hook', function (req, res) { |
| 18 | 39 | ||
| 19 | var eventObj = req.body.events[0]; | 40 | var eventObj = req.body.events[0]; |
| ... | @@ -24,13 +45,20 @@ app.post('/hook', function (req, res) { | ... | @@ -24,13 +45,20 @@ app.post('/hook', function (req, res) { |
| 24 | console.log('[request]', req.body); | 45 | console.log('[request]', req.body); |
| 25 | console.log('[request source] ', source); | 46 | console.log('[request source] ', source); |
| 26 | console.log('[request message]', message); | 47 | console.log('[request message]', message); |
| 27 | - | 48 | + |
| 28 | if(message.text === '김프'){ | 49 | if(message.text === '김프'){ |
| 29 | command = '김프'; | 50 | command = '김프'; |
| 51 | + | ||
| 30 | } | 52 | } |
| 31 | - else if (message.text === '거래량비율') | 53 | + else if (message.text === '거래량비율'){ |
| 32 | volumePumpingRatioThreeMinutePerWeek(eventObj.replyToken, message.text); | 54 | volumePumpingRatioThreeMinutePerWeek(eventObj.replyToken, message.text); |
| 33 | - | 55 | + } |
| 56 | + else if(message.text == '고래알람'){ | ||
| 57 | + PushTimeId = SetWhaleAlert() | ||
| 58 | + } | ||
| 59 | + else if(message.text == '고래알람해제'){ | ||
| 60 | + clearTimeout(PushTimeId) | ||
| 61 | + } | ||
| 34 | else{ | 62 | else{ |
| 35 | if(command === '김프'){ | 63 | if(command === '김프'){ |
| 36 | kimp(eventObj.replyToken, message.text); | 64 | kimp(eventObj.replyToken, message.text); |
| ... | @@ -39,7 +67,42 @@ app.post('/hook', function (req, res) { | ... | @@ -39,7 +67,42 @@ app.post('/hook', function (req, res) { |
| 39 | 67 | ||
| 40 | res.sendStatus(200); | 68 | res.sendStatus(200); |
| 41 | }); | 69 | }); |
| 42 | - | 70 | +function explain_message(){ |
| 71 | + request.post( | ||
| 72 | + { | ||
| 73 | + url: TARGET_URL_PUSH, | ||
| 74 | + headers: { | ||
| 75 | + 'Authorization': `Bearer ${TOKEN}` | ||
| 76 | + }, | ||
| 77 | + json: { | ||
| 78 | + "to": `${USER_ID}`, | ||
| 79 | + "messages":[ | ||
| 80 | + { | ||
| 81 | + "type":"text", | ||
| 82 | + "text":"코인거래를 도와주는 챗봇입니다." | ||
| 83 | + }, | ||
| 84 | + { | ||
| 85 | + "type":"text", | ||
| 86 | + "text":"명령어 : 김프, 거래량비율, 고래알람, 고래알람해제" | ||
| 87 | + }, | ||
| 88 | + { | ||
| 89 | + "type":"text", | ||
| 90 | + "text":"김프 입력 후 BTC, ETH 등 코인 심볼을 입력하면 국내와 해외 시세 차이를 알 수 있습니다." | ||
| 91 | + }, | ||
| 92 | + { | ||
| 93 | + "type":"text", | ||
| 94 | + "text":"거래량비율 입력을 하면 30~1분 후 최근 거래량이 활발한 10개 상위 종목을 알 수 있습니다." | ||
| 95 | + }, | ||
| 96 | + { | ||
| 97 | + "type":"text", | ||
| 98 | + "text":"고래알람 입력을 하면 실시간으로 고래들이 입금한 코인과 액수를 알 수 있습니다. 급등 급락할 확률이 높다는 것을 의미합니다." | ||
| 99 | + } | ||
| 100 | + ] | ||
| 101 | + } | ||
| 102 | + },(error, response, body) => { | ||
| 103 | + console.log(body, error) | ||
| 104 | + }); | ||
| 105 | +} | ||
| 43 | function kimp(replyToken,message){ | 106 | function kimp(replyToken,message){ |
| 44 | 107 | ||
| 45 | var upbitPrice = 0; | 108 | var upbitPrice = 0; |
| ... | @@ -101,7 +164,7 @@ function compare_price(replyToken, message, upbitPrice){ | ... | @@ -101,7 +164,7 @@ function compare_price(replyToken, message, upbitPrice){ |
| 101 | binance_price().then(function(binancePrice){ | 164 | binance_price().then(function(binancePrice){ |
| 102 | request.post( | 165 | request.post( |
| 103 | { | 166 | { |
| 104 | - url: TARGET_URL, | 167 | + url: TARGET_URL_REPLY, |
| 105 | headers: { | 168 | headers: { |
| 106 | 'Authorization': `Bearer ${TOKEN}` | 169 | 'Authorization': `Bearer ${TOKEN}` |
| 107 | }, | 170 | }, |
| ... | @@ -242,7 +305,7 @@ function volumePumpingRatioThreeMinutePerWeek(replyToken, message) | ... | @@ -242,7 +305,7 @@ function volumePumpingRatioThreeMinutePerWeek(replyToken, message) |
| 242 | console.log(finalArr); | 305 | console.log(finalArr); |
| 243 | request.post( | 306 | request.post( |
| 244 | { | 307 | { |
| 245 | - url: TARGET_URL, | 308 | + url: TARGET_URL_REPLY, |
| 246 | headers: { | 309 | headers: { |
| 247 | 'Authorization': `Bearer ${TOKEN}` | 310 | 'Authorization': `Bearer ${TOKEN}` |
| 248 | }, | 311 | }, |
| ... | @@ -275,7 +338,102 @@ function volumePumpingRatioThreeMinutePerWeek(replyToken, message) | ... | @@ -275,7 +338,102 @@ function volumePumpingRatioThreeMinutePerWeek(replyToken, message) |
| 275 | }) | 338 | }) |
| 276 | }) | 339 | }) |
| 277 | } | 340 | } |
| 341 | +function chk_param(data, query_limit, callback){ | ||
| 342 | + //query_limit (non_int) => return 0; | ||
| 343 | + //query_limit (int) => return query_limit; | ||
| 344 | + query_limit = parseInt(query_limit) | ||
| 345 | + if(isNaN(query_limit)){ return callback(data, 0)} | ||
| 346 | + else {return callback(data, query_limit)} | ||
| 347 | +} | ||
| 348 | +function data_collector(data, limit){ | ||
| 349 | + var ret = new Array(); | ||
| 350 | + var str = ''; | ||
| 351 | + | ||
| 352 | + //ret += '# of Transactions : ' + data.count + '\n' | ||
| 353 | + for(var i = 0; i < data.count; i++){ | ||
| 354 | + uts2time.setTime(data.transactions[i].timestamp * 1000 + KR_TIME_DIFF) | ||
| 355 | + str = /*'#' + (i+1)+*/'Time: ' + uts2time.toLocaleString() + '\nChainName: '+data.transactions[i].blockchain+'\nAmount: '+data.transactions[i].amount+' USD' | ||
| 356 | + if(data.transactions[i].amount > limit){ | ||
| 357 | + //console.log(str) | ||
| 358 | + // ret += '\n\n' + str; | ||
| 359 | + o ={ 'type' : 'text', | ||
| 360 | + 'text' : str} | ||
| 361 | + ret.push(o) | ||
| 362 | + } | ||
| 363 | + else{ | ||
| 364 | + //console.log(str) | ||
| 365 | + } | ||
| 366 | + } | ||
| 367 | + return ret; | ||
| 368 | +} | ||
| 369 | +function SetWhaleAlert(){ | ||
| 370 | + url2 = 'https://api.whale-alert.io/v1/transactions?api_key=' + api_key + '&cursor=' + cursor; | ||
| 371 | + const options = {method: 'GET', headers: {Accept: 'application/json'}}; | ||
| 278 | 372 | ||
| 373 | + fetch(url2, options) | ||
| 374 | + .then(res => res.json()) | ||
| 375 | + .then(json => { | ||
| 376 | + console.log(json) | ||
| 377 | + fetch(url2+json.cursor, options) | ||
| 378 | + .then(res => res.json()) | ||
| 379 | + .then(json => { | ||
| 380 | + console.log(json) | ||
| 381 | + fetch(url2+json.cursor, options) | ||
| 382 | + .then(res => res.json()) | ||
| 383 | + .then(json => { | ||
| 384 | + console.log(json) | ||
| 385 | + if(json.cursor != undefined){ | ||
| 386 | + cursor = json.cursor | ||
| 387 | + } | ||
| 388 | + }) | ||
| 389 | + .catch((err) => { | ||
| 390 | + console.log('error : inital_fetch:'+err) | ||
| 391 | + }) | ||
| 392 | + }) | ||
| 393 | + .catch((err) => { | ||
| 394 | + console.log('error : inital_fetch:'+err) | ||
| 395 | + }) | ||
| 396 | + }) | ||
| 397 | + .catch((err) => { | ||
| 398 | + console.log('error : inital_fetch:'+err) | ||
| 399 | + }) | ||
| 400 | + return setInterval(() => { | ||
| 401 | + fetch(url2+cursor, options) | ||
| 402 | + .then(res => res.json()) | ||
| 403 | + .then(json => { | ||
| 404 | + //API usage limit | ||
| 405 | + console.log(json) | ||
| 406 | + if(json.result == 'error'){ | ||
| 407 | + } | ||
| 408 | + else{ | ||
| 409 | + cursor = json.cursor | ||
| 410 | + var msg2user = chk_param(json,5000000, data_collector) | ||
| 411 | + console.log('msg',msg2user) | ||
| 412 | + if(msg2user.length){ | ||
| 413 | + var i = 0; | ||
| 414 | + for(i; i < msg2user.length; i++){ | ||
| 415 | + request.post( | ||
| 416 | + { | ||
| 417 | + url: TARGET_URL_PUSH, | ||
| 418 | + headers: { | ||
| 419 | + 'Authorization': `Bearer ${TOKEN}` | ||
| 420 | + }, | ||
| 421 | + json: { | ||
| 422 | + "to": `${USER_ID}`, | ||
| 423 | + "messages":[msg2user[i]] | ||
| 424 | + } | ||
| 425 | + },(error, response, body) => { | ||
| 426 | + console.log(body, error) | ||
| 427 | + }); | ||
| 428 | + } | ||
| 429 | + } | ||
| 430 | + } | ||
| 431 | + }) | ||
| 432 | + .catch(err => { | ||
| 433 | + console.error('error: var:fu:' + err) | ||
| 434 | + }) | ||
| 435 | + }, 5000); | ||
| 436 | +} | ||
| 279 | 437 | ||
| 280 | try { | 438 | try { |
| 281 | const option = { | 439 | const option = { | ... | ... |
| 1 | -KRW-BTC,KRW-ETH,KRW-NEO,KRW-MTL,KRW-LTC,KRW-XRP,KRW-ETC,KRW-OMG,KRW-SNT,KRW-WAVES,KRW-XEM,KRW-QTUM,KRW-LSK,KRW-STEEM,KRW-XLM,KRW-ARDR,KRW-KMD,KRW-ARK,KRW-STORJ,KRW-GRS,KRW-REP,KRW-EMC2,KRW-ADA,KRW-SBD,KRW-POWR,KRW-BTG,KRW-ICX,KRW-EOS,KRW-TRX,KRW-SC,KRW-IGNIS,KRW-ONT,KRW-ZIL,KRW-POLY,KRW-ZRX,KRW-LOOM,KRW-BCH,KRW-ADX,KRW-BAT,KRW-IOST,KRW-DMT,KRW-RFR,KRW-CVC,KRW-IQ,KRW-IOTA,KRW-MFT,KRW-ONG,KRW-GAS,KRW-UPP,KRW-ELF,KRW-KNC,KRW-BSV,KRW-THETA,KRW-EDR,KRW-QKC,KRW-BTT,KRW-MOC,KRW-ENJ,KRW-TFUEL,KRW-MANA,KRW-ANKR,KRW-AERGO,KRW-ATOM,KRW-TT,KRW-CRE,KRW-SOLVE,KRW-MBL,KRW-TSHP,KRW-WAXP,KRW-HBAR,KRW-MED,KRW-MLK,KRW-STPT,KRW-ORBS,KRW-VET,KRW-CHZ,KRW-PXL,KRW-STMX,KRW-DKA,KRW-HIVE,KRW-KAVA,KRW-AHT,KRW-LINK,KRW-XTZ,KRW-BORA,KRW-JST,KRW-CRO,KRW-TON,KRW-SXP,KRW-LAMB,KRW-HUNT,KRW-MARO,KRW-PLA,KRW-DOT,KRW-SRM,KRW-MVL,KRW-PCI,KRW-STRAX,KRW-AQT,KRW-BCHA,KRW-GLM,KRW-QTCON,KRW-SSX,KRW-META,KRW-OBSR,KRW-FCT2,KRW-LBC,KRW-CBK,KRW-SAND,KRW-HUM,KRW-DOGE,KRW-STRK,KRW-PUNDIX,KRW-FLOW,KRW-DAWN,KRW-AXS,KRW-STX | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file |
| 1 | +KRW-BTC,KRW-ETH,KRW-NEO,KRW-MTL,KRW-LTC,KRW-XRP,KRW-ETC,KRW-OMG,KRW-SNT,KRW-WAVES,KRW-XEM,KRW-QTUM,KRW-LSK,KRW-STEEM,KRW-XLM,KRW-ARDR,KRW-KMD,KRW-ARK,KRW-STORJ,KRW-GRS,KRW-REP,KRW-EMC2,KRW-ADA,KRW-SBD,KRW-POWR,KRW-BTG,KRW-ICX,KRW-EOS,KRW-TRX,KRW-SC,KRW-IGNIS,KRW-ONT,KRW-ZIL,KRW-POLY,KRW-ZRX,KRW-LOOM,KRW-BCH,KRW-ADX,KRW-BAT,KRW-IOST,KRW-DMT,KRW-RFR,KRW-CVC,KRW-IQ,KRW-IOTA,KRW-MFT,KRW-ONG,KRW-GAS,KRW-UPP,KRW-ELF,KRW-KNC,KRW-BSV,KRW-THETA,KRW-EDR,KRW-QKC,KRW-BTT,KRW-MOC,KRW-ENJ,KRW-TFUEL,KRW-MANA | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file | ... | ... |
-
Please register or login to post a comment