Agent/AuctionServices/Scraper/Interencheres/Interencheres.js

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