Compare commits
3 Commits
f6d600e9ae
...
76fdee2cfc
| Author | SHA1 | Date | |
|---|---|---|---|
| 76fdee2cfc | |||
| 13a1bd9ab0 | |||
| 7bfb00ad77 |
31
api.js
Normal file
31
api.js
Normal file
@@ -0,0 +1,31 @@
|
||||
const axios = require('axios')
|
||||
const { RateLimiter } = require('limiter')
|
||||
|
||||
class Api {
|
||||
constructor () {
|
||||
this.baseUrl = 'https://api.warframe.market/v1/'
|
||||
this.delay = process.env.API_DELAY ?? 3000
|
||||
this.limiter = new RateLimiter({ tokensPerInterval: 1, interval: Number(this.delay) })
|
||||
}
|
||||
|
||||
async _get (url) {
|
||||
await this.limiter.removeTokens(1)
|
||||
return axios.get(url)
|
||||
}
|
||||
|
||||
async getOrders (url) {
|
||||
const response = await this._get(this.baseUrl + 'items/' + url + '/orders')
|
||||
return response.data.payload.orders.filter(function (order) {
|
||||
return order.order_type === 'sell' && order.user.status !== 'offline'
|
||||
})
|
||||
}
|
||||
|
||||
async getSortedOrders (url) {
|
||||
const orders = await this.getOrders(url)
|
||||
return orders.sort(function (a, b) {
|
||||
return a.platinum - b.platinum
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = new Api()
|
||||
23
index.js
23
index.js
@@ -1,38 +1,21 @@
|
||||
require('dotenv').config()
|
||||
const puppeteer = require('puppeteer')
|
||||
const items = require('./items')
|
||||
const output = require('./output')
|
||||
|
||||
async function initPuppeteer (page) {
|
||||
await page.setDefaultNavigationTimeout(0)
|
||||
await page.setRequestInterception(true)
|
||||
page.on('request', (request) => {
|
||||
if (['image'].includes(request.resourceType())) request.abort()
|
||||
else request.continue()
|
||||
})
|
||||
}
|
||||
const output = require('./output');
|
||||
|
||||
(async () => {
|
||||
const browser = await puppeteer.launch({
|
||||
executablePath: process.env.EXECUTABLE
|
||||
})
|
||||
const page = await browser.newPage()
|
||||
await initPuppeteer(page)
|
||||
|
||||
for (const item of items) {
|
||||
console.log(`Looking at ${item.name}`)
|
||||
|
||||
let partsPrice = 0
|
||||
for (const part of item.parts) {
|
||||
partsPrice += await part.getPrice(page)
|
||||
partsPrice += await part.getPrice()
|
||||
}
|
||||
|
||||
const setPrice = await item.set.getPrice(page)
|
||||
const setPrice = await item.set.getPrice()
|
||||
if (partsPrice < setPrice) {
|
||||
output.addItem(item.name, partsPrice, setPrice)
|
||||
}
|
||||
}
|
||||
|
||||
await browser.close()
|
||||
output.submit()
|
||||
})()
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
const Api = require('../api')
|
||||
|
||||
module.exports = class Part {
|
||||
constructor (set, part, amount) {
|
||||
this.part = part
|
||||
@@ -5,12 +7,8 @@ module.exports = class Part {
|
||||
this.amount = amount ?? 1
|
||||
}
|
||||
|
||||
async getPrice (page) {
|
||||
const marketUrl = 'https://warframe.market/items/'
|
||||
|
||||
await page.goto(marketUrl + this.url)
|
||||
const element = await page.waitForSelector('b.price')
|
||||
const value = await element.evaluate(el => el.textContent)
|
||||
return Number(value) * this.amount
|
||||
async getPrice () {
|
||||
const orders = await Api.getSortedOrders(this.url)
|
||||
return Number(orders[0].platinum) * this.amount
|
||||
}
|
||||
}
|
||||
|
||||
929
package-lock.json
generated
929
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@@ -9,9 +9,10 @@
|
||||
"author": "Anatoly Kopyl",
|
||||
"license": "ISC",
|
||||
"dependencies": {
|
||||
"axios": "^0.26.0",
|
||||
"dotenv": "^16.0.0",
|
||||
"handlebars": "^4.7.7",
|
||||
"puppeteer": "^13.3.2"
|
||||
"limiter": "^2.1.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"eslint-config-standard": "^16.0.3"
|
||||
|
||||
Reference in New Issue
Block a user