152 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
			
		
		
	
	
			152 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
import fs from "fs";
 | 
						|
import configs from "../../system/config.js";
 | 
						|
import { delay, getPathProfile, safeClosePage } from "../../system/utils.js";
 | 
						|
import { ApiBid } from "../api-bid.js";
 | 
						|
 | 
						|
export class PicklesApiBid extends ApiBid {
 | 
						|
  reloadInterval = null;
 | 
						|
  constructor({ ...prev }) {
 | 
						|
    super(prev);
 | 
						|
  }
 | 
						|
 | 
						|
  action = async () => {
 | 
						|
    try {
 | 
						|
      const page = this.page_context;
 | 
						|
 | 
						|
      page.on("response", async (response) => {
 | 
						|
        const request = response.request();
 | 
						|
        if (request.redirectChain().length > 0) {
 | 
						|
          if (response.url().includes(configs.WEB_CONFIGS.PICKLES.LOGIN_URL)) {
 | 
						|
            await this.handleLogin();
 | 
						|
          }
 | 
						|
        }
 | 
						|
      });
 | 
						|
 | 
						|
      await page.goto(this.url, { waitUntil: "networkidle2" });
 | 
						|
 | 
						|
      await page.bringToFront();
 | 
						|
 | 
						|
      // Set userAgent
 | 
						|
      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"
 | 
						|
      );
 | 
						|
    } catch (error) {
 | 
						|
      console.log("Error [action]: ", error.message);
 | 
						|
    }
 | 
						|
  };
 | 
						|
 | 
						|
  isLogin = async () => {
 | 
						|
    if (!this.page_context) return false;
 | 
						|
 | 
						|
    const filePath = getPathProfile(this.origin_url);
 | 
						|
 | 
						|
    return (
 | 
						|
      !(await this.page_context.$('[name="_58_login"]')) &&
 | 
						|
      fs.existsSync(filePath)
 | 
						|
    );
 | 
						|
  };
 | 
						|
 | 
						|
  async handleLogin() {
 | 
						|
    const page = this.page_context;
 | 
						|
 | 
						|
    global.IS_CLEANING = false;
 | 
						|
 | 
						|
    const filePath = getPathProfile(this.origin_url);
 | 
						|
 | 
						|
    await page.waitForNavigation({ waitUntil: "domcontentloaded" });
 | 
						|
 | 
						|
    // 🛠 Check if already logged in (login input should not be visible or profile exists)
 | 
						|
    if (!(await page.$('[name="_58_login"]')) && fs.existsSync(filePath)) {
 | 
						|
      console.log(`✅ [${this.id}] Already logged in, skipping login process.`);
 | 
						|
      return;
 | 
						|
    }
 | 
						|
 | 
						|
    if (fs.existsSync(filePath)) {
 | 
						|
      console.log(`🗑 [${this.id}] Deleting existing file: ${filePath}`);
 | 
						|
      fs.unlinkSync(filePath);
 | 
						|
    }
 | 
						|
 | 
						|
    const children = this.children.filter((item) => item?.page_context);
 | 
						|
    console.log(
 | 
						|
      `🔍 [${this.id}] Found ${children.length} child pages to close.`
 | 
						|
    );
 | 
						|
 | 
						|
    if (children.length > 0) {
 | 
						|
      console.log(`🛑 [${this.id}] Closing child pages...`);
 | 
						|
      await Promise.all(
 | 
						|
        children.map((item) => {
 | 
						|
          console.log(
 | 
						|
            `➡ [${this.id}] Closing child page with context: ${item?.page_context}`
 | 
						|
          );
 | 
						|
          return safeClosePage(item);
 | 
						|
        })
 | 
						|
      );
 | 
						|
 | 
						|
      console.log(
 | 
						|
        `➡ [${this.id}] Closing main page context: ${this.page_context}`
 | 
						|
      );
 | 
						|
      await safeClosePage(this);
 | 
						|
    }
 | 
						|
 | 
						|
    console.log(`🔑 [${this.id}] Starting login process...`);
 | 
						|
 | 
						|
    try {
 | 
						|
      // ⌨ Enter email
 | 
						|
      console.log(`✍ [${this.id}] Entering email:`, this.username);
 | 
						|
      await page.type('[name="_58_login"]', this.username, { delay: 100 });
 | 
						|
 | 
						|
      // ⌨ Enter password
 | 
						|
      console.log(`✍ [${this.id}] Entering password...`);
 | 
						|
      await page.type('[name="_58_password"]', this.password, { delay: 150 });
 | 
						|
 | 
						|
      // 🚀 Click the login button
 | 
						|
      console.log(`🔘 [${this.id}] Clicking the "Login" button`);
 | 
						|
      await page.click("#sign-in-btn", { delay: 92 });
 | 
						|
 | 
						|
      await page.waitForNavigation({
 | 
						|
        timeout: 8000,
 | 
						|
        waitUntil: "domcontentloaded",
 | 
						|
      });
 | 
						|
 | 
						|
      if (this.page_context.url() == this.url) {
 | 
						|
        // 📂 Save session context to avoid re-login
 | 
						|
        await this.saveContext();
 | 
						|
        console.log(`✅ [${this.id}] Login successful!`);
 | 
						|
      } else {
 | 
						|
        console.log(`❌ [${this.id}] Login Failure!`);
 | 
						|
      }
 | 
						|
    } catch (error) {
 | 
						|
      console.error(
 | 
						|
        `❌ [${this.id}] Error during login process:`,
 | 
						|
        error.message
 | 
						|
      );
 | 
						|
    } finally {
 | 
						|
      global.IS_CLEANING = true;
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  listen_events = async () => {
 | 
						|
    if (this.page_context) return;
 | 
						|
 | 
						|
    await this.puppeteer_connect();
 | 
						|
    await this.action();
 | 
						|
 | 
						|
    this.reloadInterval = setInterval(async () => {
 | 
						|
      try {
 | 
						|
        if (this.page_context && !this.page_context.isClosed()) {
 | 
						|
          console.log(`🔄 [${this.id}] Reloading page...`);
 | 
						|
          await this.page_context.reload({ waitUntil: "networkidle2" });
 | 
						|
          console.log(`✅ [${this.id}] Page reloaded successfully.`);
 | 
						|
        } else {
 | 
						|
          console.log(
 | 
						|
            `❌ [${this.id}] Page context is closed. Stopping reload.`
 | 
						|
          );
 | 
						|
          clearInterval(this.reloadInterval);
 | 
						|
        }
 | 
						|
      } catch (error) {
 | 
						|
        console.error(`🚨 [${this.id}] Error reloading page:`, error.message);
 | 
						|
      }
 | 
						|
    }, 60000); // 1p reload
 | 
						|
  };
 | 
						|
}
 |