Created
February 16, 2019 11:49
-
-
Save RohanKapurDEV/be0b6a2e473a4aac577246efd0c4a69c to your computer and use it in GitHub Desktop.
Old code for when the bot had errors, is live now @readystatsbot on Twitter.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* Twitter Bot - A twitter bot that scrapes network explorer applications for statistics to tweet about every 24 hours | |
* Current protocols scraped: 0x, Maker, Kyber [More to be added] | |
* | |
* Author: Rohan Kapur | |
* ~ February 2019 | |
*/ | |
var Twit = require('twit'); | |
var TwitterBot = require('node-twitterbot').TwitterBot; | |
var puppeteer = require('puppeteer'); | |
var axios = require('axios'); | |
var Bot = new TwitterBot({ | |
consumer_key: process.env.BOT_CONSUMER_KEY, | |
consumer_secret: process.env.BOT_CONSUMER_SECRET, | |
access_token: process.env.BOT_ACCESS_TOKEN, | |
access_token_secret: process.env.BOT_ACCESS_TOKEN_SECRET | |
}); | |
// This function will open the correct browser pages sequentially, it will tweet relevant data before moving onto next page. | |
// Current browser cycle is as follows - 0x gen stats -> 0x Top Tokens -> 0x Top Relayers -> Makerscan Homepage -> Makerscan leaderboards -> | |
// KyberNet gen stats -> (... more soon!) | |
async function tweet() { | |
let viewport = { | |
width: 1600, | |
height: 800 | |
} | |
let browser = await puppeteer.launch({ args: ['--no-sandbox'] }); // Add necessary option flags for heroku buildpack during deployment phase | |
let zrxPage = await browser.newPage(); | |
await zrxPage.setViewport(viewport); | |
await zrxPage.goto('https://0xtracker.com/', { "waitUntil": "networkidle0"}); | |
let zrxGenStatsPull = await zrxPage.evaluate(() => document.querySelector('#root div div div div').innerText); | |
let zrxGenStatArr = zrxGenStatsPull.split('\n'); | |
// console.log(zrxGenStatArr); | |
let zrxGenStatsTweet = ` | |
#0x Network Statistics [24 hours - Across all relayers] | |
--------------------------------------------------------- | |
Network Volume: ${zrxGenStatArr[1]} | |
Number of Trades: ${zrxGenStatArr[5]} | |
$ZRX Price: ${zrxGenStatArr[7]} | |
--------------------------------------------------------- | |
` | |
Bot.tweet(zrxGenStatsTweet); | |
console.log('0X General Stats tweeted'); | |
let zrxTopTokensPage = await browser.newPage(); | |
await zrxTopTokensPage.setViewport(viewport); | |
await zrxTopTokensPage.goto('https://0xtracker.com/tokens', { "waitUntil": "networkidle0" }); | |
let zrxTopTokensPull = await zrxTopTokensPage.evaluate(() => document.querySelector('#root div div div div div div table tbody').innerText ); | |
let zrxTopTokensArr = zrxTopTokensPull.split('\n'); | |
// let token1Name = zrxTopTokensArr[1].split('\t')[0]; | |
// let token1Price = zrxTopTokensArr[1].split('\t')[1]; | |
// let token1Trades = zrxTopTokensArr[2].split(' ')[2].split('\t')[1]; | |
// let token1Volume = zrxTopTokensArr[2].split(' ')[2].split('\t')[2]; | |
// let token2Name = zrxTopTokensArr[5].split('\t')[0]; | |
// let token2Price = zrxTopTokensArr[5].split('\t')[1];; | |
// let token2Trades = zrxTopTokensArr[6].split(' ')[2].split('\t')[1]; | |
// let token2Volume = zrxTopTokensArr[6].split(' ')[2].split('\t')[2]; | |
// let token3Name = zrxTopTokensArr[9].split('\t')[0]; | |
// let token3Price = zrxTopTokensArr[9].split('\t')[1]; | |
// let token3Trades = zrxTopTokensArr[10].split(' ')[2].split('\t')[1]; | |
// let token3Volume = zrxTopTokensArr[10].split(' ')[2].split('\t')[2]; | |
let zrxTopTokensTweet = ` | |
#0x Top 3 Tokens [24 hours - Across all relayers] | |
------------------------------------------------- | |
[1] $${token1Name} ${token1Price} ~ ${token1Trades} Trades ~ ${token1Volume} in Volume | |
[2] $${token2Name} ${token2Price} ~ ${token2Trades} Trades ~ ${token2Volume} in Volume | |
[3] $${token3Name} ${token3Price} ~ ${token3Trades} Trades ~ ${token3Volume} in Volume | |
` | |
Bot.tweet(zrxTopTokensTweet); | |
console.log('0X Top tokens tweeted') | |
let zrxTopRelayerPage = await browser.newPage(); | |
await zrxTopRelayerPage.setViewport(viewport); | |
await zrxTopRelayerPage.goto('https://0xtracker.com/relayers', { "waitUntil": "networkidle0" }); | |
let zrxTopRelayersPull = await zrxTopRelayerPage.evaluate(() => document.querySelector('#root div div div div div div table tbody').innerText); | |
let zrxTopRelayersArr = zrxTopRelayersPull.split('\n'); | |
// let relay1Name = zrxTopRelayersArr[0].split('\t')[2]; | |
// let relay1Trades = zrxTopRelayersArr[1].split('\t')[1]; | |
// let relay1Volume = zrxTopRelayersArr[1].split('\t')[2]; | |
// let relay2Name = zrxTopRelayersArr[2].split('\t')[2]; | |
// let relay2Trades = zrxTopRelayersArr[3].split('\t')[1]; | |
// let relay2Volume = zrxTopRelayersArr[3].split('\t')[2]; | |
// let relay3Name = zrxTopRelayersArr[4].split('\t')[2]; | |
// let relay3Trades = zrxTopRelayersArr[5].split('\t')[1]; | |
// let relay3Volume = zrxTopRelayersArr[5].split('\t')[2]; | |
let zrxTopRelayersTweet = ` | |
#0x Top 3 Relayers by Volume [24 hours] | |
-------------------------------------------- | |
[1] ${relay1Name} ~ ${relay1Trades} Trades ~ ${relay1Volume} in Volume | |
[2] ${relay2Name} ~ ${relay2Trades} Trades ~ ${relay2Volume} in Volume | |
[3] ${relay3Name} ~ ${relay3Trades} Trades ~ ${relay3Volume} in Volume | |
` | |
Bot.tweet(zrxTopRelayersTweet); | |
console.log('0X Top relayers tweeted') | |
let makerGenStats = await browser.newPage(); | |
await makerGenStats.setViewport(viewport); | |
await makerGenStats.goto('https://makerscan.io/', { "waitUntil": "networkidle0" }); | |
let makerGenStatsPull = await makerGenStats.evaluate(() => document.querySelector('body > div.main-content > div.container.mt--6').innerText); | |
let makerGenStatsArr = makerGenStatsPull.split('\n'); | |
let makerGenStatsTweet = ` | |
#MakerDAO Network Statistics | |
--------------------------------------- | |
Total $DAI Debt: ${makerGenStatsArr[1]} | |
Total $ETH Collateral: ${makerGenStatsArr[3]} | |
Debt/Collateral Ratio: ${makerGenStatsArr[5]} | |
--------------------------------------- | |
` | |
Bot.tweet(makerGenStatsTweet); | |
console.log('Maker gen stats tweeted') | |
let makerTopDebtCdps = await makerGenStats.evaluate(() => document.querySelector('body > div.main-content > div:nth-child(4) > div > div.row.mt-4').innerText); | |
let makerTopDebtCdpsArr = makerTopDebtCdps.split('\n'); | |
let makerTopDebtCdpsTweet = ` | |
#MakerDAO Top CDPs by Debt | |
---------------------------------- | |
[1] CDP ${makerTopDebtCdpsArr[0]} ~ ${makerTopDebtCdpsArr[1]} $DAI | |
[2] CDP ${makerTopDebtCdpsArr[2]} ~ ${makerTopDebtCdpsArr[3]} $DAI | |
[3] CDP ${makerTopDebtCdpsArr[4]} ~ ${makerTopDebtCdpsArr[5]} $DAI | |
[4] CDP ${makerTopDebtCdpsArr[6]} ~ ${makerTopDebtCdpsArr[7]} $DAI | |
[5] CDP ${makerTopDebtCdpsArr[8]} ~ ${makerTopDebtCdpsArr[9]} $DAI | |
---------------------------------- | |
` | |
Bot.tweet(makerTopDebtCdpsTweet); | |
console.log('Maker top debt cdps tweeted') | |
let makerTopCollatCdps = await makerGenStats.evaluate(() => document.querySelector('body > div.main-content > div:nth-child(5) > div > div.row.mt-4').innerText); | |
let makerTopCollatCdpsArr = makerTopCollatCdps.split('\n'); | |
let makerTopCollatCdpsTweet = ` | |
#MakerDAO Top CDPs by Collateral | |
---------------------------------- | |
[1] CDP ${makerTopCollatCdpsArr[0]} ~ ${makerTopCollatCdpsArr[1]} $ETH | |
[2] CDP ${makerTopCollatCdpsArr[2]} ~ ${makerTopCollatCdpsArr[3]} $ETH | |
[3] CDP ${makerTopCollatCdpsArr[4]} ~ ${makerTopCollatCdpsArr[5]} $ETH | |
[4] CDP ${makerTopCollatCdpsArr[6]} ~ ${makerTopCollatCdpsArr[7]} $ETH | |
[5] CDP ${makerTopCollatCdpsArr[8]} ~ ${makerTopCollatCdpsArr[9]} $ETH | |
---------------------------------- | |
` | |
Bot.tweet(makerTopCollatCdpsTweet); | |
console.log('Maker top collat cdps tweeted') | |
const kyberStats = await browser.newPage(); | |
await kyberStats.setViewport(viewport); | |
await kyberStats.goto('https://tracker.kyber.network/#/', { "waitUntil": "networkidle0" }); | |
let kyberGenStatsPull = await kyberStats.evaluate(() => document.querySelector('#page-content nav div ul').innerText); | |
let kyberGenStatsArr = kyberGenStatsPull.split('\n'); | |
let kyberGenStatsTweet = ` | |
#Kyber Network General Statistics | |
--------------------------------- | |
$KNC Price: ${kyberGenStatsArr[3]} | |
$ETH Price: ${kyberGenStatsArr[5]} | |
Collected Fees: ${kyberGenStatsArr[7]} | |
Burnt Fees: ${kyberGenStatsArr[9]} | |
24H Volume: ${kyberGenStatsArr[1]} | |
--------------------------------- | |
` | |
Bot.tweet(kyberGenStatsTweet); | |
console.log('Kyber gen stats tweeted') | |
await browser.close() | |
} | |
async function pullBTCStats(n) { | |
let raw = await axios.get(process.env.BITCOIN_BLOCKCHAIN_GATEWAY) | |
.then(res => res.data.data.GATEWAY_BLOCK_TERM); | |
let network_val = numeral(raw.valueFloat / raw.txVol).format('0.00'); | |
let txCount = numeral(raw.txLedgerCount).format('0,0'); | |
let activeAddresses = numeral(Array.from(raw.block[n].addressTo.append(raw.block[n].addressFrom)).length).format('0,0'); | |
let issuance = numeral(raw.new_issuance).format('$0,0.00') | |
let blocks_added = raw.count_of_blocks_added.toString(); | |
let tweetIt = ` | |
Bitcoin 24 hour On-Chain Stats - $BTC | |
====================== | |
NVT Ratio(Value/Tx Volume): ${network_val} | |
USD Issued on-chain: ${issuance} | |
Active Adddresses: ${activeAddresses} | |
Tx Count: ${txCount} | |
Blocks mined: ${blocks_added} | |
====================== | |
` | |
T.post('statuses/update', { status: tweetIt }, function(err, data, response) { | |
console.log(data) | |
}) | |
// replicate for LTC, DOGE, ETH, and so on... | |
} | |
tweet(); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment