Merge pull request 'use-api' (#1) from use-api into master
Some checks failed
continuous-integration/drone/push Build is failing

Reviewed-on: anatolykopyl/warframe-market-bot#1
This commit was merged in pull request #1.
This commit is contained in:
2022-03-06 22:37:17 +00:00
5 changed files with 175 additions and 823 deletions

31
api.js Normal file
View 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()

View File

@@ -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()
})()

View File

@@ -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

File diff suppressed because it is too large Load Diff

View File

@@ -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"