bid-tool/auto-bid-tool/models/product-bid.js

160 lines
4.3 KiB
JavaScript

import * as fs from 'fs';
import path from 'path';
import BID_TYPE from '../system/bid-type.js';
import browser from '../system/browser.js';
import CONSTANTS from '../system/constants.js';
import { delay, getPathProfile, sanitizeFileName } 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);
}
}
}