Agent/AuctionServices/Scraper/Drouot/Drouot.js

350 lines
10 KiB
JavaScript

// Interencheres.js
'use strict';
const { platform } = require('os');
const {Scraper} = require('../Scraper');
const DrouotData = require('./DrouotData');
class Drouot extends Scraper {
constructor(Url) {
super(Url);
this.platformData = new DrouotData();
this.platformData.getUrlInfo(Url).then((data) => {
if(data.lotID == 0 && data.saleID == 0){
throw new Error('Invalid URL');
}
});
this._Name = 'drouot'
this._PAGE_MAIN = "https://drouot.com/fr/"
this._PAGE_LOGIN = "https://auth.drouot.com/login"
this._USER = "jp.ranu@cogip.de"
this._PWD = "LYPYRKDUsSMH5BaWQxvH#"
this._PATH_SESSION_FILE = ".session/session_drouot.json"
}
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)
// ## Title
let title = await this.platformData.getLotTitle(page);
console.log('title : '+title)
// ## 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.getSaleID(page);
console.log('SellNumber : '+id_sale)
console.log('url : '+urlSale)
let LotInfos = {
idPlatform: idLot,
platform : this._Name,
url: this.Url,
title: title,
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 {saleID, urlSale} = await this.platformData.getUrlInfo(this.Url);
console.log('saleID : '+saleID)
console.log('urlSale : '+urlSale)
// ## Title
let title = await this.platformData.getSaleTitle(page);
console.log('title : '+title)
// ## Date
let date = await this.platformData.getSaleDate(page);
console.log('date : '+date)
// ## Location
let location = await this.platformData.getSaleLocation(page);
console.log('location : '+location)
// ## SaleHouseName
let saleHouseName = await this.platformData.getSaleHouseName(page);
console.log('saleHouseName : '+saleHouseName)
// ## 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: saleID,
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
}
async CheckAndConnect(page) {
return new Promise(async (resolve, reject) => {
await page.goto(this._PAGE_MAIN);
//get the Connexion button
const [Connexion] = await page.$x("//div[contains(@class, 'btn') and contains(@class, 'ghost') and contains(text(), 'Connexion')]");
console.log(Connexion)
// if Connection button found => Login
if (Connexion) {
console.log("-- Login --")
await page.goto(this._PAGE_LOGIN);
//get the Email field
//console.log("-- get Email Input --")
await page.type('#email', this._USER);
//console.log("-- get password Input --")
await page.type("#password", this._PWD);
//console.log("-- get ConnexionButton --")
const [ConnexionButton] = await page.$x("//button[contains(text(), 'Connexion')]");
await ConnexionButton.evaluate(b => b.click());
//console.log("-- Login wait --")
await page.waitForTimeout(1000);
//resolve(page)
const [ConnexionOK] = await page.$x("//button[contains(text(), 'Continuer en tant que')]");
if (ConnexionOK) {
console.log("-- Connection OK --")
await ConnexionOK.evaluate(b => b.click());
await page.waitForTimeout(1000);
await this._saveSession(page)
// const sessionData = await page.session.dumpString({
// storageProviders: [
// StorageProviderName.Cookie,
// StorageProviderName.LocalStorage,
// StorageProviderName.SessionStorage,
// StorageProviderName.IndexedDB,
// ],
// })
// fs.writeFileSync(this._PATH_SESSION_FILE, sessionData);
// console.log("-- Connection OK --")
resolve(page)
} else {
console.error("-- !!!! Connection ERROR !!!! --");
reject()
}
// Allready connected
} else {
console.log("-- Allready connected --")
resolve(page)
}
})
}
Live = async (browser) => {
console.log("Live "+this._Name+": "+this.Url)
const page = await browser.newPage();
page = await this.CheckAndConnect(page);
let CheckAskStop = null;
let Socket = null;
const StopLive = async (params) => {
clearInterval(CheckAskStop);
Socket.off('Network.webSocketFrameReceived', listener);
page.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()
}
})
}, 10000); // 10000 milliseconds = 10 seconds
}catch(e){
console.log('Error : '+e)
throw new Error('Error: '+e)
}
}
};
module.exports = Drouot