295 lines
8.3 KiB
JavaScript
295 lines
8.3 KiB
JavaScript
// Interencheres.js
|
|
'use strict';
|
|
const {Scraper} = require('../Scraper');
|
|
const InterencheresData = require('./InterencheresData');
|
|
|
|
class Interencheres extends Scraper {
|
|
|
|
constructor(Url) {
|
|
super(Url);
|
|
|
|
this.platformData = new InterencheresData();
|
|
|
|
this.platformData.getUrlInfo(Url).then((data) => {
|
|
if(data.lotID == 0 && data.saleID == 0){
|
|
throw new Error('Invalid URL');
|
|
}
|
|
});
|
|
|
|
this._Name = 'interencheres'
|
|
this._PAGE_MAIN = ""
|
|
this._PAGE_LOGIN = ""
|
|
|
|
this._USER = ""
|
|
this._PWD = ""
|
|
this._PATH_SESSION_FILE = ".session/session_inter.json"
|
|
this._BROWSER_TOOL = "puppeteerBrowser"
|
|
}
|
|
|
|
getPictures = async ({ page, data}) => {
|
|
|
|
const PictList = await this.platformData.getPictures(page, this.Url);
|
|
console.log('PictList : '+PictList)
|
|
return PictList
|
|
}
|
|
|
|
getLotInfos = async ({ page, data}) => {
|
|
|
|
console.log("getLotInfos "+this._Name+": "+this.Url)
|
|
|
|
// Navigate the page to a URL
|
|
await page.goto(this.Url);
|
|
|
|
let idLot = await this.platformData.getLotID(this.Url);
|
|
console.log('idLot : '+idLot)
|
|
|
|
// ## LotNumber
|
|
|
|
let lotNumber = await this.platformData.getLotNumber(page);
|
|
console.log('lotNumber : '+lotNumber)
|
|
|
|
|
|
// ## Estimate
|
|
let {EstimateLow, EstimateHigh} = await this.platformData.getEstimate(page);
|
|
console.log('EstimateLow : '+EstimateLow)
|
|
|
|
// ## Description
|
|
let Description = await this.platformData.getDescription(page);
|
|
//console.log('Description : '+Description)
|
|
|
|
// ## Fees
|
|
let {feesText, fees} = await this.platformData.getFees(page);
|
|
|
|
console.log('feesText : '+feesText)
|
|
console.log('fees : '+fees)
|
|
|
|
// ################
|
|
// ### SALE
|
|
|
|
let {id_sale, urlSale} = await this.platformData.getSaleIdUrl(this.Url);
|
|
|
|
console.log('SellNumber : '+id_sale)
|
|
console.log('url : '+urlSale)
|
|
|
|
let LotInfos = {
|
|
idPlatform: idLot,
|
|
platform : this._Name,
|
|
url: this.Url,
|
|
title: 'Lot '+lotNumber,
|
|
lotNumber: lotNumber,
|
|
EstimateLow: EstimateLow,
|
|
EstimateHigh: EstimateHigh,
|
|
Description: Description,
|
|
feesText: feesText,
|
|
fees: fees,
|
|
saleInfo: {
|
|
idSale: id_sale,
|
|
url: urlSale
|
|
}
|
|
}
|
|
|
|
console.log('LotInfos : '+LotInfos)
|
|
|
|
return LotInfos
|
|
}
|
|
|
|
getSaleInfos = async ({ page, data}) => {
|
|
console.log("getSaleInfos "+this._Name+": "+this.Url)
|
|
|
|
// Navigate the page to a URL
|
|
await page.goto(this.Url);
|
|
|
|
let {id_sale, urlSale} = await this.platformData.getSaleIdUrl(this.Url);
|
|
|
|
console.log('url : '+urlSale)
|
|
// ## Title
|
|
let title = await this.platformData.getSaleTitle(page);
|
|
|
|
// ## Date
|
|
let date = await this.platformData.getSaleDate(page);
|
|
|
|
// ## Location
|
|
let location = await this.platformData.getSaleLocation(page);
|
|
|
|
// ## SaleHouseName
|
|
let saleHouseName = await this.platformData.getSaleHouseName(page);
|
|
|
|
// ## Status
|
|
// ready : ready to be followed
|
|
// following : sale is followed by the AuctionAgent
|
|
// askStop : sale is followed by the AuctionAgent and the user ask to stop following
|
|
// pause : the Sale is stopped by the Auction House and ready to restart
|
|
// end : the Sale is ended
|
|
|
|
let status = 'ready'
|
|
|
|
let SaleInfo = {
|
|
idPlatform: id_sale,
|
|
platform : this._Name,
|
|
url: urlSale,
|
|
title: title,
|
|
date: date,
|
|
location: location,
|
|
saleHouseName: saleHouseName,
|
|
status: status
|
|
}
|
|
|
|
//console.log('SaleInfo : ', JSON.stringify(SaleInfo, null, 2));
|
|
return SaleInfo
|
|
}
|
|
|
|
getLotList = async ({ page, data}) => {
|
|
console.log("getLotList "+this._Name+": "+this.Url)
|
|
|
|
// Navigate the page to a URL
|
|
await page.goto(this.Url);
|
|
|
|
const LotList = await this.platformData.getLotList(page);
|
|
console.log('LotList : '+LotList)
|
|
return LotList
|
|
}
|
|
|
|
// ### Puppeteer
|
|
// ###########################################################################
|
|
|
|
async CheckCookieDialog(page) {
|
|
console.log("-- CheckCookieDialog --")
|
|
return new Promise(async (resolve, reject) => {
|
|
|
|
const CookieButton = await page.$('//button[contains(@class, "cpm-cookies-bar-cta-refus") and contains(text(), "Refuser")]');
|
|
//console.log(CookieButton)
|
|
if (CookieButton && await CookieButton.isVisible()) {
|
|
console.log("-- Click on CookieButton --")
|
|
await CookieButton.click();
|
|
}
|
|
|
|
resolve(true)
|
|
})
|
|
}
|
|
|
|
Live = async (browser) => {
|
|
|
|
console.log("Live "+this._Name+": "+this.Url)
|
|
|
|
const page = await browser.newPage();
|
|
|
|
let CheckAskStop = null;
|
|
let Socket = null;
|
|
const StopLive = async (params) => {
|
|
clearInterval(CheckAskStop);
|
|
//Socket.off('Network.webSocketFrameReceived', listener);
|
|
page.close()
|
|
browser.close()
|
|
}
|
|
|
|
const listener = async (params) => {
|
|
|
|
let payload = params.response.payloadData
|
|
if(payload.length>1 && payload.substring(0, 2) == '42'){
|
|
payload = JSON.parse(payload.substring(2))
|
|
//console.log(payload)
|
|
|
|
const type = payload[0];
|
|
const payloadData = payload[1];
|
|
|
|
switch (type) {
|
|
|
|
case 'startSale':
|
|
break;
|
|
case 'listAuctionedItems':
|
|
break;
|
|
|
|
case 'joinedSale':
|
|
await this.JucunduNextItem(
|
|
payloadData.sale_id,
|
|
payloadData.timestamp,
|
|
payloadData.item_id,
|
|
payloadData.order_number.primary,
|
|
payloadData.title,
|
|
payloadData.description,
|
|
payloadData.pricing.estimates.min,
|
|
payloadData.pricing.estimates.max,
|
|
payloadData
|
|
);
|
|
break;
|
|
|
|
case 'auctionedItem':
|
|
await this.JucunduAuctionedItem(
|
|
payloadData.item_id,
|
|
payloadData.timestamp,
|
|
payloadData.auctioned.amount,
|
|
payloadData.auctioned.sold,
|
|
payloadData.auctioned.type
|
|
);
|
|
break;
|
|
|
|
case 'nextItem':
|
|
await this.JucunduNextItem(
|
|
payloadData.sale_id,
|
|
payloadData.timestamp,
|
|
payloadData.item_id,
|
|
payloadData.order_number.primary,
|
|
payloadData.title,
|
|
payloadData.description,
|
|
payloadData.pricing.estimates.min,
|
|
payloadData.pricing.estimates.max,
|
|
payloadData
|
|
);
|
|
break;
|
|
|
|
case 'bid':
|
|
await this.JucundusBid(
|
|
payloadData.item_id,
|
|
payloadData.timestamp,
|
|
payloadData.amount,
|
|
payloadData.auctioned_type
|
|
);
|
|
break;
|
|
|
|
case 'pauseSale':
|
|
console.error('** Pause **');
|
|
console.log(payloadData);
|
|
// await this.JucundusEndSale()
|
|
// StopLive()
|
|
break;
|
|
|
|
case 'endSale':
|
|
// await this.JucundusEndSale()
|
|
// StopLive()
|
|
break;
|
|
|
|
default:
|
|
console.error('Unknown data type:', type);
|
|
console.log(payloadData);
|
|
}
|
|
}
|
|
};
|
|
|
|
try{
|
|
await page.goto(this.Url);
|
|
|
|
Socket = await page.target().createCDPSession();
|
|
await Socket.send('Network.enable');
|
|
await Socket.send('Page.enable');
|
|
Socket.on('Network.webSocketFrameReceived', listener);
|
|
console.log('Listener set up for Network.webSocketFrameReceived event');
|
|
|
|
// check if stop was asked
|
|
CheckAskStop = setInterval(async () => {
|
|
this.JucundusCheckStop()
|
|
.then(AskStop => {
|
|
if(AskStop){
|
|
StopLive()
|
|
}
|
|
})
|
|
}, 5000); // 10000 milliseconds = 5 seconds
|
|
|
|
}catch(e){
|
|
console.log('Error : '+e)
|
|
throw new Error('Error: '+e)
|
|
}
|
|
|
|
}
|
|
};
|
|
|
|
module.exports = Interencheres |