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