Skip to content

Instantly share code, notes, and snippets.

@RohanKapurDEV
Created February 16, 2019 11:49
Show Gist options
  • Save RohanKapurDEV/be0b6a2e473a4aac577246efd0c4a69c to your computer and use it in GitHub Desktop.
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.
/**
* 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