File size: 3,288 Bytes
72a036c
 
 
fa728fc
 
 
72a036c
 
 
 
fa728fc
 
 
72a036c
 
 
 
 
 
 
 
 
 
 
fa728fc
 
 
72a036c
 
 
fa728fc
 
 
72a036c
 
 
bec2194
72a036c
 
 
fa728fc
 
72a036c
 
 
fa728fc
 
 
72a036c
fa728fc
72a036c
 
 
 
 
 
 
81c46e0
fa728fc
81c46e0
 
 
 
 
 
72a036c
 
fa728fc
72a036c
 
 
 
 
fa728fc
72a036c
 
 
fa728fc
 
 
 
 
 
 
 
 
72a036c
fa728fc
72a036c
 
 
 
 
fa728fc
72a036c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
const express = require("express");
const { chromium } = require("playwright-core");
const cheerio = require("cheerio");
const prettify = require("express-prettify"); // Auto-pretty JSON
const prettyjson = require("prettyjson"); // Human-readable formatting
const chalk = require("chalk"); // Colorful console output

const app = express();
const PORT = 7860;

// Use prettify middleware for JSON responses
app.use(prettify({ query: "pretty" }));

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 });

    const html = await page.content();
    const $ = cheerio.load(html);

    let allMatches = [];

    // Extract matches from all competitions
    $(".wtcont").each((_, competitionElement) => {
        const competitionName = $(competitionElement).find(".ptleag").text().trim();

        $(competitionElement).find(".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({
                    competition: competitionName,
                    homeTeam,
                    awayTeam,
                    stake,
                    prediction,
                    score
                });
            }
        });
    });

    await browser.close();
    return allMatches;
}

// Express API route with beautified response
app.get("/draw", async (req, res) => {
    try {
        const matches = await scrapeMatches();

        // Beautify response
        console.log(chalk.green("\nFetched Matches:"));
        console.log(prettyjson.render(matches));

        res.json({
            success: true,
            data: matches
        });
    } catch (error) {
        console.error(chalk.red("Error fetching matches:"), error);
        res.status(500).json({ success: false, message: "Failed to fetch data" });
    }
});

app.listen(PORT, () => {
    console.log(chalk.blue(`\nServer running at http://localhost:${PORT}/draw\n`));
});