import requests from bs4 import BeautifulSoup import concurrent.futures import gradio as gr URL = "https://tomcat1235.nyc.mn/proxy_list" TIMEOUT = 8 OUTPUT_FILE = "work.txt" def fetch_proxies(): response = requests.get(URL, timeout=15) response.raise_for_status() soup = BeautifulSoup(response.text, "html.parser") proxies = [] rows = soup.find_all("tr") for row in rows: cols = row.find_all("td") if len(cols) >= 3: try: proxy_type = cols[0].get_text(strip=True).lower() ip = cols[1].get_text(strip=True) port = cols[2].get_text(strip=True) if ip.count(".") == 3 and port.isdigit(): proxies.append({ "type": proxy_type, "ip": ip, "port": port }) except: continue return proxies def test_proxy(proxy): ip = proxy["ip"] port = proxy["port"] proxy_type = proxy["type"] proxy_url = f"{proxy_type}://{ip}:{port}" proxies_dict = { "http": proxy_url, "https": proxy_url } try: r = requests.get( "http://httpbin.org/ip", proxies=proxies_dict, timeout=TIMEOUT ) if r.status_code == 200: return f"{ip}:{port}" # ✅ Return without socks5:// except: pass return None def check_proxies(): try: proxies = fetch_proxies() except Exception as e: return f"Error fetching proxies:\n{e}", None working = [] with concurrent.futures.ThreadPoolExecutor(max_workers=20) as executor: results = executor.map(test_proxy, proxies) for result in results: if result: working.append(result) if not working: return "No working proxies found.", None # Save to file with open(OUTPUT_FILE, "w") as f: for proxy in working: f.write(proxy + "\n") return "\n".join(working), OUTPUT_FILE # Gradio Interface with gr.Blocks() as app: gr.Markdown("# Proxy Checker") gr.Markdown("Fetch and test proxies. Returns only working IP:PORT (no socks5:// prefix).") output_box = gr.Textbox(label="Working Proxies", lines=15) download_file = gr.File(label="Download working proxies") check_button = gr.Button("Check Proxies") check_button.click( fn=check_proxies, outputs=[output_box, download_file] ) app.launch()