Merge pull request 'use-api' (#1) from use-api into master
Some checks failed
continuous-integration/drone/push Build is failing
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:
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()
|
require('dotenv').config()
|
||||||
const puppeteer = require('puppeteer')
|
|
||||||
const items = require('./items')
|
const items = require('./items')
|
||||||
const output = require('./output')
|
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()
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
(async () => {
|
(async () => {
|
||||||
const browser = await puppeteer.launch({
|
|
||||||
executablePath: process.env.EXECUTABLE
|
|
||||||
})
|
|
||||||
const page = await browser.newPage()
|
|
||||||
await initPuppeteer(page)
|
|
||||||
|
|
||||||
for (const item of items) {
|
for (const item of items) {
|
||||||
console.log(`Looking at ${item.name}`)
|
console.log(`Looking at ${item.name}`)
|
||||||
|
|
||||||
let partsPrice = 0
|
let partsPrice = 0
|
||||||
for (const part of item.parts) {
|
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) {
|
if (partsPrice < setPrice) {
|
||||||
output.addItem(item.name, partsPrice, setPrice)
|
output.addItem(item.name, partsPrice, setPrice)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
await browser.close()
|
|
||||||
output.submit()
|
output.submit()
|
||||||
})()
|
})()
|
||||||
|
|||||||
@@ -1,3 +1,5 @@
|
|||||||
|
const Api = require('../api')
|
||||||
|
|
||||||
module.exports = class Part {
|
module.exports = class Part {
|
||||||
constructor (set, part, amount) {
|
constructor (set, part, amount) {
|
||||||
this.part = part
|
this.part = part
|
||||||
@@ -5,12 +7,8 @@ module.exports = class Part {
|
|||||||
this.amount = amount ?? 1
|
this.amount = amount ?? 1
|
||||||
}
|
}
|
||||||
|
|
||||||
async getPrice (page) {
|
async getPrice () {
|
||||||
const marketUrl = 'https://warframe.market/items/'
|
const orders = await Api.getSortedOrders(this.url)
|
||||||
|
return Number(orders[0].platinum) * this.amount
|
||||||
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
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
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",
|
"author": "Anatoly Kopyl",
|
||||||
"license": "ISC",
|
"license": "ISC",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
"axios": "^0.26.0",
|
||||||
"dotenv": "^16.0.0",
|
"dotenv": "^16.0.0",
|
||||||
"handlebars": "^4.7.7",
|
"handlebars": "^4.7.7",
|
||||||
"puppeteer": "^13.3.2"
|
"limiter": "^2.1.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"eslint-config-standard": "^16.0.3"
|
"eslint-config-standard": "^16.0.3"
|
||||||
|
|||||||
Reference in New Issue
Block a user