import requests from bs4 import BeautifulSoup from httpx import Client, HTTPError from pydantic import BaseModel import re import urllib.parse import fake_useragent as fake import random from dotenv import load_dotenv import os from faker import Faker from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.action_chains import ActionChains import time from webdriver_manager.chrome import ChromeDriverManager from tqdm import tqdm import threading import gradio as gr load_dotenv() class Proxy(BaseModel): ip: str port: str type: str class VisitRequest(BaseModel): url: str count: int delay: int parallel_processes: int def get_random_proxy(): try: response = requests.get("https://uhhy-fsfsfs.hf.space/valid") response.raise_for_status() proxies = response.text.splitlines() if proxies: return random.choice(proxies) else: return None except Exception as e: print(f"Error getting proxy: {e}") return None def get_proxies(): try: proxies = [] for _ in range(5): proxy = get_random_proxy() if proxy: proxies.append(proxy) return "\n".join(proxies) except Exception as e: return str(e) def rotate_ip(): try: fake = Faker() random_ip = fake.ipv4() headers = { "X-Forwarded-For": random_ip, "Client-IP": random_ip, "X-Real-IP": random_ip } proxy = get_random_proxy() if not proxy: return "No proxy available." return proxy except Exception as e: return str(e) def extract_video_id(url: str, platform: str) -> str: url = urllib.parse.unquote(url) if platform == "instagram": match = re.search(r"instagram\.com/reel/([^/?]+)", url) elif platform == "tiktok": match = re.search(r"tiktok\.com/@[^/]+/video/(\d+)", url) elif platform == "youtube": match = re.search(r"youtube\.com/watch\?v=([^&]+)", url) elif platform == "facebook": match = re.search(r"facebook\.com/.*/videos/(\d+)", url) elif platform == "twitch": match = re.search(r"twitch\.tv/videos/(\d+)", url) elif platform == "spotify": match = re.search(r"spotify\.com/track/([^/?]+)", url) else: match = None if match: return match.group(1) else: return None def instagram_login(username: str, password: str): login_url = "https://www.instagram.com/accounts/login/ajax/" session = requests.Session() response = session.get("https://www.instagram.com/", headers={"User-Agent": "Mozilla/5.0"}) soup = BeautifulSoup(response.text, "html.parser") csrf_token = soup.find("meta", {"name": "csrf-token"})["content"] login_data = { "username": username, "enc_password": f"#PWD_INSTAGRAM_BROWSER:0:&:{password}" } headers = { "User-Agent": "Mozilla/5.0", "X-CSRFToken": csrf_token, "X-Requested-With": "XMLHttpRequest" } response = session.post(login_url, data=login_data, headers=headers) if response.status_code == 200 and response.json().get("authenticated"): return session else: raise HTTPError("Authentication failed") def tiktok_login(username: str, password: str): login_url = "https://www.tiktok.com/login/" session = requests.Session() login_data = { "username": username, "password": password } response = session.post(login_url, data=login_data) if response.status_code == 200: return session else: raise HTTPError("Authentication failed") def youtube_login(username: str, password: str): login_url = "https://accounts.google.com/ServiceLogin" session = requests.Session() login_data = { "username": username, "password": password } response = session.post(login_url, data=login_data) if response.status_code == 200: return session else: raise HTTPError("Authentication failed") def facebook_login(username: str, password: str): login_url = "https://www.facebook.com/login" session = requests.Session() login_data = { "email": username, "pass": password } response = session.post(login_url, data=login_data) if response.status_code == 200: return session else: raise HTTPError("Authentication failed") def twitch_login(username: str, password: str): login_url = "https://www.twitch.tv/login" session = requests.Session() login_data = { "login": username, "password": password } response = session.post(login_url, data=login_data) if response.status_code == 200: return session else: raise HTTPError("Authentication failed") def spotify_login(username: str, password: str): login_url = "https://accounts.spotify.com/api/token" session = requests.Session() login_data = { "username": username, "password": password } response = session.post(login_url, data=login_data) if response.status_code == 200: return session else: raise HTTPError("Authentication failed") def simulate_view(url: str, proxy: str, session: Client, delay: int): webdriver.DesiredCapabilities.CHROME['proxy'] = { "httpProxy": proxy, "ftpProxy": proxy, "sslProxy": proxy, "proxyType": "MANUAL", } options = webdriver.ChromeOptions() options.add_argument("--headless") options.add_argument("--disable-blink-features=AutomationControlled") options.add_argument("--disable-popup-blocking") options.add_argument("--disable-infobars") options.add_argument("--disable-web-security") options.add_argument("--ignore-certificate-errors") options.add_argument("--disable-notifications") options.add_argument("--disable-extensions") options.add_argument("--disable-gpu") options.add_argument("--no-sandbox") options.add_argument("--disable-dev-shm-usage") options.add_argument("--mute-audio") options.add_argument('--ignore-ssl-errors=yes') options.add_argument('--ignore-certificate-errors') driver = webdriver.Chrome(options=options) try: fake = Faker() fake_ipv4 = fake.ipv4() headers = { "User-Agent": fake.user_agent(), "X-Forwarded-For": fake_ipv4, "Client-IP": fake_ipv4, "X-Real-IP": fake_ipv4 } driver.get(url) try: not_now = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.CLASS_NAME, 'mt3GC'))) a = not_now.find_elements(By.TAG_NAME, "button")[1] actions = ActionChains(driver) actions.click(a) actions.perform() except: pass time.sleep(delay) return True except Exception as e: print(f"Error simulating view: {e}") return False finally: driver.quit() def simulate_views_background(url: str, count: int, delay: int, session: Client = None): proxy = get_random_proxy() if not proxy: print("No proxy available.") return successful_views = 0 failed_views = 0 for i in tqdm(range(count), desc=f"Simulating views for {url}"): try: success = simulate_view(url, proxy, session, delay) if success: successful_views += 1 else: failed_views += 1 remaining_views = count - i - 1 print(f"Successful: {successful_views}, Failed: {failed_views}, Remaining: {remaining_views}, Time Remaining: {((count - i - 1) * delay) / 60:.2f} minutes") except Exception as e: failed_views += 1 remaining_views = count - i - 1 print(f"Successful: {successful_views}, Failed: {failed_views}, Remaining: {remaining_views}, Time Remaining: {((count - i - 1) * delay) / 60:.2f} minutes") def simulate_views_endpoint(request: VisitRequest): try: session = None threading.Thread( target=simulate_views_background, args=( request.url, request.count, request.delay, session, ) ).start() return "Views simulation started in the background." except Exception as e: return str(e) def simulate(urls: str, count: int, delay: int, parallel_processes: int): try: session = None for url in urls.split("\n"): for _ in range(parallel_processes): threading.Thread( target=simulate_views_background, args=( url, count, delay, session ) ).start() return "Simulations started in the background." except Exception as e: return str(e) def rand(min, max): return random.randint(min, max) with gr.Blocks(css=""" body { background-color: #f0f0f0; font-family: sans-serif; } .container { background-color: #fff; padding: 30px; border-radius: 10px; box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1); text-align: center; animation: fadeIn 1s ease-in-out; } h1 { color: #333; margin-bottom: 20px; text-shadow: 0 1px 2px rgba(0, 0, 0, 0.1); } form { display: flex; flex-direction: column; width: 350px; } label { margin-bottom: 5px; font-weight: bold; } input[type="text"], textarea, select, input[type="number"] { padding: 10px; margin-bottom: 15px; border: 1px solid #ddd; border-radius: 5px; } input[type="submit"] { background-color: #007bff; color: #fff; border: none; padding: 12px 20px; border-radius: 5px; cursor: pointer; transition: background-color 0.3s; } input[type="submit"]:hover { background-color: #0056b3; } @keyframes fadeIn { from { opacity: 0; } to { opacity: 1; } } """) as interface: urls = gr.Textbox(label="Website URLs or IP addresses (one per line)") count = gr.Number(label="Number of Views", value=1) delay = gr.Number(label="Delay (seconds)", value=1) parallel_processes = gr.Number(label="Parallel Processes", value=1) simulate_btn = gr.Button("Simulate") output = gr.Textbox(label="Output") simulate_btn.click( fn=simulate, inputs=[urls, count, delay, parallel_processes], outputs=output, ) interface.launch(server_name="0.0.0.0", server_port=7860, share=True)