const express = require("express"); const { chromium } = require("playwright-core"); const cheerio = require("cheerio"); const app = express(); const PORT = 7860; async function scrapeMatches() { const browser = await chromium.launch({ headless: true, executablePath: "/usr/bin/chromium", args: ["--no-sandbox", "--disable-setuid-sandbox"] }); const page = await browser.newPage(); // Set headers to bypass bot detection await page.setExtraHTTPHeaders({ 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36', 'Accept-Language': 'en-US,en;q=0.9', 'Referer': 'https://www.google.com/' }); // Block unnecessary requests (images, CSS, etc.) await page.route('**/*', (route) => { return ['image', 'stylesheet', 'font', 'media'].includes(route.request().resourceType()) ? route.abort() : route.continue(); }); // Navigate to main draw predictions page const baseURL = "https://www.windrawwin.com/predictions/today/all-games/large-stakes/draws/"; await page.goto(baseURL, { waitUntil: "domcontentloaded", timeout: 60000 }); // Get all league URLs const leagueLinks = await page.evaluate(() => { return Array.from(document.querySelectorAll("select#predregion option")) .map(option => option.value) .filter(link => link.includes("/predictions/today/")); }); let allMatches = []; for (let link of leagueLinks) { await page.goto(link, { waitUntil: "domcontentloaded", timeout: 60000 }); const html = await page.content(); const $ = cheerio.load(html); $(".wttr").each((_, element) => { const homeTeam = $(element).find(".wtteam .wtmoblnk").eq(0).text().trim(); const awayTeam = $(element).find(".wtteam .wtmoblnk").eq(1).text().trim(); const stake = $(element).find(".wttd.wtstk").text().trim(); const prediction = $(element).find(".wttd.wtprd").text().trim(); const score = $(element).find(".predscore").text().trim(); if (homeTeam && awayTeam) { allMatches.push({ homeTeam, awayTeam, stake, prediction, score }); } }); } await browser.close(); return allMatches; } // Express API route app.get("/draw", async (req, res) => { try { const matches = await scrapeMatches(); res.json({ success: true, data: matches }); } catch (error) { console.error("Error:", error); res.status(500).json({ success: false, message: "Failed to fetch data" }); } }); app.listen(PORT, () => { console.log(`Server running at http://localhost:${PORT}/draw`); });