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