Skip to content

Commit

Permalink
new
Browse files Browse the repository at this point in the history
  • Loading branch information
kasrakhamesi committed Feb 14, 2023
1 parent 46a7de8 commit dcf7296
Show file tree
Hide file tree
Showing 25 changed files with 433 additions and 56 deletions.
48 changes: 20 additions & 28 deletions index.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,43 +4,35 @@ const cors = require('cors')
const logger = require('morgan')
const workerFarm = require('worker-farm')
require('dotenv').config()
/*
const { Builder, Browser, By, Key, until } = require('selenium-webdriver')

;(async function example() {
let driver = await new Builder().forBrowser(Browser.FIREFOX).build()
try {
await driver.get('https://www.google.com/ncr')
await driver.findElement(By.name('q')).sendKeys('webdriver', Key.RETURN)
await driver.wait(until.titleIs('webdriver - Google Search'), 1000)
} finally {
await driver.quit()
}
})()
*/
const options = {
debug: false,
logs: false,
sort: true,
additionalWait: 0,
browserInstance: undefined
}
const OpenseaScraper = require('./local_modules/opensea-scraper')
const q = async () => {
const type = '24h' // possible values: "24h", "7d", "30d", "total"
const chain = 'ethereum'
const ranking = await OpenseaScraper.rankings(type, chain, options)
console.log(ranking)
app.use(cors())
app.use(logger('dev'))

const services = {
topCollections: workerFarm(
require.resolve('./src/v1/services/opensea/rankings/top.service')
),
trendingCollections: workerFarm(
require.resolve('./src/v1/services/opensea/rankings/trending.service')
)
}

q().then(console.log).catch(console.log)
services.topCollections('hello', (err) => {
if (err) console.log(err)
})

services.trendingCollections('hello', (err) => {
if (err) console.log(err)
})

app.use('/v1', require('./src/v1/routes'))

app.use('*', (req, res) => {
res.status(404).send({
statusCode: 404,
data: null,
error: {
message: 'صفحه یافت نشد'
message: '404 Not Found'
}
})
})
Expand Down
68 changes: 54 additions & 14 deletions local_modules/opensea-scraper/src/functions/rankings.js
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,8 @@ const {
const rankings = async (
type = 'total',
chain = undefined,
optionsGiven = {}
optionsGiven = {},
trending = false
) => {
const optionsDefault = {
debug: false,
Expand All @@ -51,7 +52,7 @@ const rankings = async (

const page = await browser.newPage()

const url = getUrl(type, chain)
const url = getUrl(type, chain, trending)
logs && console.log('...opening url: ' + url)
await page.goto(url)

Expand All @@ -74,12 +75,12 @@ const rankings = async (
})

// extract relevant info
const top100 = _parseNextDataVarible(__NEXT_DATA__)
const top100 = _parseNextDataVarible(__NEXT_DATA__, trending)
logs && console.log(`🥳 DONE. Total ${top100.length} Collections fetched: `)
return top100
}

function _parseNextDataVarible(__NEXT_DATA__) {
function _parseNextDataVarible(__NEXT_DATA__, trending) {
const extractFloorPrice = (windowCollectionStats, extractionMethod) => {
try {
if (extractionMethod === 'multichain') {
Expand All @@ -96,8 +97,37 @@ function _parseNextDataVarible(__NEXT_DATA__) {
return null
}
}
const extractTotalSupply = (windowCollectionStats) => {
try {
return Number(windowCollectionStats.totalSupply)
} catch (err) {
return null
}
}

if (trending) {
const extractCollection = (node) => {
return {
name: node.name,
slug: node.slug,
logo: node.logo,
isVerified: node.isVerified,
floorPrice: extractFloorPrice(node.windowCollectionStats),
floorPriceMultichain: extractFloorPrice(
node.windowCollectionStats,
'multichain'
),
totalSupply: extractTotalSupply(node.windowCollectionStats)
// statsV2: node.statsV2, // 🚧 comment back in if you need additional stats
// windowCollectionStats: node.windowCollectionStats, // 🚧 comment back in if you need additional stats
}
}

return __NEXT_DATA__.props.relayCache[0][1].json.data.trendingCollections.edges.map(
(obj) => extractCollection(obj.node)
)
}
const extractCollection = (node) => {
console.log(node)
return {
name: node.name,
slug: node.slug,
Expand All @@ -107,29 +137,39 @@ function _parseNextDataVarible(__NEXT_DATA__) {
floorPriceMultichain: extractFloorPrice(
node.windowCollectionStats,
'multichain'
)
),
totalSupply: extractTotalSupply(node.windowCollectionStats)
// statsV2: node.statsV2, // 🚧 comment back in if you need additional stats
// windowCollectionStats: node.windowCollectionStats, // 🚧 comment back in if you need additional stats
}
}

return __NEXT_DATA__.props.relayCache[0][1].json.data.trendingCollections.edges.map(
return __NEXT_DATA__.props.relayCache[0][1].json.data.rankings.edges.map(
(obj) => extractCollection(obj.node)
)
}

function getUrl(type, chain) {
function getUrl(type, chain, trending) {
chainExtraQueryParameter = chain ? `&chain=${chain}` : ''
if (trending) {
if (type === '24h') {
return `https://opensea.io/rankings/trending?sortBy=one_day_volume${chainExtraQueryParameter}`
} else if (type === '7d') {
return `https://opensea.io/rankings/trending?sortBy=seven_day_volume${chainExtraQueryParameter}`
} else if (type === '30d') {
return `https://opensea.io/rankings/trending?sortBy=thirty_day_volume${chainExtraQueryParameter}`
} else if (type === 'total') {
return `https://opensea.io/rankings/trending?sortBy=total_volume${chainExtraQueryParameter}`
}
}
if (type === '24h') {
return `https://opensea.io/rankings/trending?sortBy=one_day_volume${chainExtraQueryParameter}`
return `https://opensea.io/rankings?sortBy=one_day_volume${chainExtraQueryParameter}`
} else if (type === '7d') {
return `https://opensea.io/rankings/trending?sortBy=seven_day_volume${chainExtraQueryParameter}`
return `https://opensea.io/rankings?sortBy=seven_day_volume${chainExtraQueryParameter}`
} else if (type === '30d') {
return `https://opensea.io/rankings/trending?sortBy=thirty_day_volume${chainExtraQueryParameter}`
return `https://opensea.io/rankings?sortBy=thirty_day_volume${chainExtraQueryParameter}`
} else if (type === 'total') {
return `https://opensea.io/rankings/trending?sortBy=total_volume${chainExtraQueryParameter}`
return `https://opensea.io/rankings?sortBy=total_volume${chainExtraQueryParameter}`
}

throw new Error(
`Invalid type provided. Expected: 24h,7d,30d,total. Got: ${type}`
)
Expand Down
Loading

0 comments on commit dcf7296

Please sign in to comment.