107 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
			
		
		
	
	
			107 lines
		
	
	
		
			3.1 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 { getPathProfile, sanitizeFileName } from '../system/utils.js';
 | 
						|
import { Bid } from './bid.js';
 | 
						|
 | 
						|
export class ApiBid extends Bid {
 | 
						|
    id;
 | 
						|
    account;
 | 
						|
    children = [];
 | 
						|
    children_processing = [];
 | 
						|
    created_at;
 | 
						|
    updated_at;
 | 
						|
    origin_url;
 | 
						|
    active;
 | 
						|
    browser_context;
 | 
						|
    username;
 | 
						|
    password;
 | 
						|
 | 
						|
    constructor({ url, username, password, id, children, created_at, updated_at, origin_url, active }) {
 | 
						|
        super(BID_TYPE.API_BID, url);
 | 
						|
 | 
						|
        this.created_at = created_at;
 | 
						|
        this.updated_at = updated_at;
 | 
						|
        this.children = children;
 | 
						|
        this.origin_url = origin_url;
 | 
						|
        this.active = active;
 | 
						|
        this.username = username;
 | 
						|
        this.password = password;
 | 
						|
        this.id = id;
 | 
						|
    }
 | 
						|
 | 
						|
    setNewData({ url, username, password, id, children, created_at, updated_at, origin_url, active }) {
 | 
						|
        this.created_at = created_at;
 | 
						|
        this.updated_at = updated_at;
 | 
						|
        this.children = children;
 | 
						|
        this.origin_url = origin_url;
 | 
						|
        this.active = active;
 | 
						|
        this.username = username;
 | 
						|
        this.password = password;
 | 
						|
        this.url = url;
 | 
						|
    }
 | 
						|
 | 
						|
    puppeteer_connect = async () => {
 | 
						|
        this.browser_context = await browser.createBrowserContext();
 | 
						|
 | 
						|
        const page = await this.browser_context.newPage();
 | 
						|
 | 
						|
        this.page_context = page;
 | 
						|
 | 
						|
        await this.restoreContext();
 | 
						|
    };
 | 
						|
 | 
						|
    listen_events = async () => {
 | 
						|
        if (this.page_context) return;
 | 
						|
 | 
						|
        await this.puppeteer_connect();
 | 
						|
 | 
						|
        await this.action();
 | 
						|
 | 
						|
        await this.saveContext();
 | 
						|
    };
 | 
						|
 | 
						|
    async saveContext() {
 | 
						|
        if (!this.browser_context || !this.page_context) return;
 | 
						|
 | 
						|
        try {
 | 
						|
            const cookies = await this.browser_context.cookies();
 | 
						|
            const localStorageData = await this.page_context.evaluate(() => JSON.stringify(localStorage));
 | 
						|
 | 
						|
            const contextData = {
 | 
						|
                cookies,
 | 
						|
                localStorage: localStorageData,
 | 
						|
            };
 | 
						|
 | 
						|
            const dirPath = path.join(CONSTANTS.PROFILE_PATH);
 | 
						|
 | 
						|
            if (!fs.existsSync(dirPath)) {
 | 
						|
                fs.mkdirSync(dirPath, { recursive: true });
 | 
						|
                console.log(`📂 Save at folder: ${dirPath}`);
 | 
						|
            }
 | 
						|
 | 
						|
            fs.writeFileSync(path.join(dirPath, sanitizeFileName(this.origin_url) + '.json'), JSON.stringify(contextData, null, 2));
 | 
						|
            console.log('✅ Context saved!');
 | 
						|
        } catch (error) {
 | 
						|
            console.log('Save Context: ', error.message);
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    async restoreContext() {
 | 
						|
        if (!this.browser_context || !this.page_context) return;
 | 
						|
 | 
						|
        const filePath = getPathProfile(this.origin_url);
 | 
						|
 | 
						|
        if (!fs.existsSync(filePath)) return;
 | 
						|
 | 
						|
        const contextData = JSON.parse(fs.readFileSync(filePath, 'utf8'));
 | 
						|
 | 
						|
        // Restore Cookies
 | 
						|
        await this.page_context.setCookie(...contextData.cookies);
 | 
						|
 | 
						|
        console.log('🔄 Context restored!');
 | 
						|
    }
 | 
						|
}
 |