File size: 7,521 Bytes
eba4f96
2e07b42
 
eba4f96
2e07b42
 
 
7fbacf2
2e07b42
 
 
256ee66
 
 
 
2e07b42
256ee66
 
 
 
 
6bd765e
256ee66
6bd765e
256ee66
 
 
 
 
 
 
 
1c62e5c
2e07b42
 
 
 
 
 
 
 
 
 
6bd765e
2e07b42
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
256ee66
2e07b42
 
 
 
 
8d4cd13
2e07b42
 
1c62e5c
2e07b42
 
 
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
96
97
98
99
100
101
102
103
import threading
import requests
import urllib.parse
import time
import random
from concurrent.futures import ThreadPoolExecutor
import gradio as gr

# --- Scraper setup ---
targetUrl = urllib.parse.quote("https://ntmtmp.xyz/prof.php")
geo_list = ["kr"]
normal_url_template = (
    "http://api.scrape.do/?url=http://fmstarlive.com/newprof.php"
    "&token=2c01f2b399ab4e72ac4f3b40d2190d467bce2197f48"
    "&super=true&geoCode={geo}&sessionId={session}"
    "&render=true&waitUntil=load&customWait=5000"
    "&width=1920&height=1080&returnJSON=true&blockResources=false&screenShot=true"
    "&playWithBrowser=%5B"
    "%7B%22Action%22%3A%22Wait%22%2C%22Timeout%22%3A8000%7D,"
    "%7B%22Action%22%3A%22ScreenShot%22%7D,"
    "%7B%22Action%22%3A%22Wait%22%2C%22Timeout%22%3A1000%7D,"
    "%7B%22Action%22%3A%22Click%22%2C%22Selector%22%3A%22%23ymg1%22%7D,"
    "%7B%22Action%22%3A%22Wait%22%2C%22Timeout%22%3A2000%7D,"
    "%7B%22Action%22%3A%22Click%22%2C%22Selector%22%3A%22%23ymg2%22%7D,"
    "%7B%22Action%22%3A%22Wait%22%2C%22Timeout%22%3A10000%7D,"
    "%7B%22Action%22%3A%22Click%22%2C%22Selector%22%3A%22.mgline-inner%22%7D,"
    "%7B%22Action%22%3A%22Wait%22%2C%22Timeout%22%3A30000%7D,"
    "%7B%22Action%22%3A%22ScrollX%22%2C%22Value%22%3A500%7D,"
    "%7B%22Action%22%3A%22Click%22%2C%22Selector%22%3A%22%23button_id123%22%7D,"
    "%7B%22Action%22%3A%22Wait%22%2C%22Timeout%22%3A10000%7D"
    "%5D"
)

special_url_template = "http://api.scrape.do/?url=https%3A%2F%2Ffmstarlive.com%2Fnewprof.php&token=2c01f2b399ab4e72ac4f3b40d2190d467bce2197f48&super=true&regionalGeoCode={geo}&render=true&waitUntil=domcontentloaded&customWait=4000&width=1920&height=1080&returnJSON=true&blockResources=false&screenShot=true&playWithBrowser=%5B%7B%22Action%22%3A%22Wait%22%2C%22Timeout%22%3A1000%7D%2C%7B%22Action%22%3A%22ScreenShot%22%7D%2C%7B%22Action%22%3A%22Execute%22%2C%22Execute%22%3A%22var+iframe+%3D+document.querySelector%28%27iframe%5Bsrcdoc%5D%27%29%3B+if+%28iframe%29+%7B+var+doc+%3D+iframe.contentDocument+%7C%7C+iframe.contentWindow.document%3B+var+el+%3D+doc.querySelector%28%27.wrapper%27%29%3B+if+%28el%29+%7B+el.click%28%29%3B+console.log%28%27clicked%27%29%3B+%7D+else+%7B+console.log%28%27wrapper+not+found%27%29%3B+%7D+%7D+else+%7B+console.log%28%27iframe+not+found%27%29%3B+%7D%22%7D%2C%7B%22Action%22%3A%22Execute%22%2C%22Execute%22%3A%22var+iframe+%3D+document.querySelector%28%27iframe%5Bsrcdoc%5D%27%29%3B+var+result+%3D+%27init%27%3B+if+%28iframe%29+%7B+var+doc+%3D+iframe.contentDocument+%7C%7C+iframe.contentWindow.document%3B+var+el+%3D+doc.querySelector%28%27.wrapper%27%29%3B+if+%28el%29+%7B+el.click%28%29%3B+result+%3D+%27clicked%27%3B+%7D+else+%7B+result+%3D+%27wrapper+not+found%27%3B+%7D+%7D+else+%7B+result+%3D+%27iframe+not+found%27%3B+%7D+result%3B%22%7D%2C%7B%22Action%22%3A%22Execute%22%2C%22Execute%22%3A%22var+iframe+%3D+document.querySelectorAll%28%27iframe%27%29%5B1%5D%3B+if+%28iframe%29+%7B+var+doc+%3D+iframe.contentDocument+%7C%7C+iframe.contentWindow.document%3B+var+el+%3D+doc.querySelector%28%27.wrapper%27%29%3B+if+%28el%29+el.click%28%29%3B+%7D%22%7D%2C%7B%22Action%22%3A%22Execute%22%2C%22Execute%22%3A%22var+iframe+%3D+document.querySelector%28%27iframe%5Bsrcdoc%5D%27%29%3B+if+%28iframe%29+%7B+var+doc+%3D+iframe.contentDocument+%7C%7C+iframe.contentWindow.document%3B+var+el+%3D+doc.querySelector%28%27.wrapper%27%29%3B+if+%28el%29+%7B+var+rect+%3D+el.getBoundingClientRect%28%29%3B+var+x+%3D+rect.left+%2B+rect.width%2F2%3B+var+y+%3D+rect.top+%2B+rect.height%2F2%3B+%5B%27mousedown%27%2C%27mouseup%27%2C%27click%27%5D.forEach%28function%28type%29%7B+var+evt+%3D+new+MouseEvent%28type%2C%7Bbubbles%3Atrue%2Ccancelable%3Atrue%2Cview%3Awindow%2CclientX%3Ax%2CclientY%3Ay%7D%29%3B+el.dispatchEvent%28evt%29%3B+%7D%29%3B+console.log%28%27dispatched%27%29%3B+%7D+%7D%22%7D%2C%7B%22Action%22%3A%22Execute%22%2C%22Execute%22%3A%22var+iframe+%3D+document.querySelector%28%27iframe%5Bsrcdoc%5D%27%29%3B+if+%28iframe%29+%7B+iframe.click%28%29%3B+%7D%22%7D%2C%7B%22Action%22%3A%22Click%22%2C%22Selector%22%3A%22iframe%22%7D%2C%7B%22Action%22%3A%22Execute%22%2C%22Execute%22%3A%22var+iframe+%3D+document.querySelector%28%27iframe%5Bsrcdoc%5D%27%29%3B+if+%28iframe%29+%7B+var+r+%3D+iframe.getBoundingClientRect%28%29%3B+var+x+%3D+r.left+%2B+r.width%2F2%3B+var+y+%3D+r.top+%2B+r.height%2F2%3B+var+el+%3D+document.elementFromPoint%28x%2Cy%29%3B+if%28el%29+el.click%28%29%3B+%7D%22%7D%2C%7B%22Action%22%3A%22Click%22%2C%22Selector%22%3A%22iframe%5Bsrcdoc%5D%22%7D%2C%7B%22Action%22%3A%22Execute%22%2C%22Execute%22%3A%22document.querySelector%28%27iframe%5Bsrcdoc%5D%27%29%3F.click%28%29%22%7D%2C%7B%22Action%22%3A%22Wait%22%2C%22Timeout%22%3A10000%7D%2C%7B%22Action%22%3A%22ScrollX%22%2C%22Value%22%3A174%7D%2C%7B%22Action%22%3A%22ScrollY%22%2C%22Value%22%3A145%7D%2C%7B%22Action%22%3A%22Wait%22%2C%22Timeout%22%3A5000%7D%2C%7B%22Action%22%3A%22Click%22%2C%22Selector%22%3A%22%23button_id%22%7D%2C%7B%22Action%22%3A%22Wait%22%2C%22Timeout%22%3A19000%7D%2C%7B%22Action%22%3A%22Wait%22%2C%22Timeout%22%3A1000%7D%2C%7B%22Action%22%3A%22Click%22%2C%22Selector%22%3A%22div%22%7D%2C%7B%22Action%22%3A%22Wait%22%2C%22Timeout%22%3A10000%7D%2C%7B%22Action%22%3A%22ScrollX%22%2C%22Value%22%3A100%7D%2C%7B%22Action%22%3A%22ScrollY%22%2C%22Value%22%3A100%7D%2C%7B%22Action%22%3A%22Wait%22%2C%22Timeout%22%3A10000%7D%2C%7B%22Action%22%3A%22Click%22%2C%22Selector%22%3A%22button%22%7D%2C%7B%22Action%22%3A%22Wait%22%2C%22Timeout%22%3A10000%7D%2C%7B%22Action%22%3A%22Click%22%2C%22Selector%22%3A%22iframe%22%7D%2C%7B%22Action%22%3A%22Wait%22%2C%22Timeout%22%3A10000%7D%5D"
# --- Control flag ---
running = False

# --- Function to send a single request ---
def send_request(counter):
    session_id = random.randint(1000, 99999)
    geo = random.choice(geo_list)

    if counter % 2 == 0:
        url = normal_url_template.format(geo=geo, session=session_id)
        print(f"[{counter}] SPECIAL | geo={geo} | session={session_id}")
    else:
        url = normal_url_template.format(geo=geo, session=session_id)
        print(f"[{counter}] NORMAL  | geo={geo} | session={session_id}")

    try:
        response = requests.get(url, timeout=60)
        print(f"Response {counter}:", response.status_code)
    except Exception as e:
        print(f"Error {counter}:", e)

# --- Main loop ---
def scraper_loop_concurrent():
    global running
    counter = 0

    with ThreadPoolExecutor(max_workers=5) as executor:
        while running:
            counter += 1
            futures = [executor.submit(send_request, counter + i) for i in range(5)]

            for future in futures:
                future.result()

            print("Batch done, waiting 10 seconds...\n")
            time.sleep(10)

# --- Start function (Gradio button) ---
def start_scraper():
    global running
    if running:
        return "Already running"

    running = True
    thread = threading.Thread(target=scraper_loop_concurrent, daemon=True)
    thread.start()

    return "Scraper started"

# --- Stop function (optional but useful) ---
def stop_scraper():
    global running
    running = False
    return "Scraper stopped"

# --- Gradio UI ---
with gr.Blocks() as demo:
    gr.Markdown("## Scraper Control Panel")

    start_btn = gr.Button("Start Scraper")
    stop_btn = gr.Button("Stop Scraper")
    output = gr.Textbox(label="Status")

    start_btn.click(fn=start_scraper, outputs=output)
    stop_btn.click(fn=stop_scraper, outputs=output)

# --- Launch UI ---
if __name__ == "__main__":
    demo.launch()