import * as fs from "fs"; import BID_TYPE from "../system/bid-type.js"; import browser from "../system/browser.js"; import { getPathProfile } from "../system/utils.js"; import { Bid } from "./bid.js"; export class ProductBid extends Bid { id; max_price; model; lot_id; plus_price; close_time; first_bid; quantity; created_at; updated_at; histories; start_bid_time; parent_browser_context; web_bid; current_price; name; reserve_price; update; constructor({ url, max_price, plus_price, model, first_bid = false, id, created_at, updated_at, quantity = 1, histories = [], close_time, lot_id, start_bid_time, web_bid, current_price, reserve_price, name, }) { super(BID_TYPE.PRODUCT_TAB, url); this.max_price = max_price || 0; this.model = model; this.plus_price = plus_price || 0; this.first_bid = first_bid; this.id = id; this.created_at = created_at; this.updated_at = updated_at; this.quantity = quantity; this.histories = histories; this.close_time = close_time; this.lot_id = lot_id; this.start_bid_time = start_bid_time; this.web_bid = web_bid; this.current_price = current_price; this.name = name; this.reserve_price = reserve_price; } setNewData({ url, max_price, plus_price, model, first_bid = false, id, created_at, updated_at, quantity = 1, histories = [], close_time, lot_id, start_bid_time, web_bid, current_price, reserve_price, name, }) { this.max_price = max_price || 0; this.model = model; this.plus_price = plus_price || 0; this.first_bid = first_bid; this.id = id; this.created_at = created_at; this.updated_at = updated_at; this.quantity = quantity; this.histories = histories; this.close_time = close_time; this.lot_id = lot_id; this.start_bid_time = start_bid_time; this.web_bid = web_bid; this.url = url; this.current_price = current_price; this.name = name; this.reserve_price = reserve_price; } puppeteer_connect = async () => { if (!this.parent_browser_context) { console.log( `❌ Connect fail. parent_browser_context is null: ${this.id}` ); return; } const context = await browser.createBrowserContext(); const statusInit = await this.restoreContext(context); if (!statusInit) { console.log(`⚠️ Restore failed.`); return; } const page = await context.newPage(); this.page_context = page; }; async restoreContext(context) { const filePath = getPathProfile(this.web_bid.origin_url); if (!fs.existsSync(filePath)) return false; const contextData = JSON.parse(fs.readFileSync(filePath, "utf8")); // Restore Cookies await context.setCookie(...contextData.cookies); return true; } async gotoLink() { const page = this.page_context; if (page.isClosed()) { console.error("❌ Page has been closed, cannot navigate."); return; } console.log("🔄 Starting the bidding process..."); try { await page.goto(this.url, { waitUntil: "networkidle2" }); console.log(`✅ Navigated to: ${this.url}`); await page.bringToFront(); await page.setUserAgent( "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" ); console.log("👀 Brought the tab to the foreground."); } catch (error) { console.error("❌ Error during navigation:", error); } } }