import time
import requests
import threading
from stem import Signal
from stem.control import Controller
from fake_useragent import UserAgent
TOR_SOCKS_PROXY = 'socks5h://127.0.0.1:9050'
TOR_CONTROL_PORT = 9051
CONTROL_PASSWORD = None # Isi jika pakai password
LOG_FILE = 'log.txt'
URLS_FILE = 'urls.txt' # File berisi daftar URL, satu URL per baris
def log(message):
print(message)
with open(LOG_FILE, 'a', encoding='utf-8') as f:
f.write(message + '\n')
def change_tor_ip():
with Controller.from_port(port=TOR_CONTROL_PORT) as controller:
if CONTROL_PASSWORD:
controller.authenticate(password=CONTROL_PASSWORD)
else:
controller.authenticate()
controller.signal(Signal.NEWNYM)
log("[*] Tor IP changed (NEWNYM signal sent)")
def get_current_ip(user_agent):
headers = {'User-Agent': user_agent}
proxies = {
'http': TOR_SOCKS_PROXY,
'https': TOR_SOCKS_PROXY
}
try:
response = requests.get('https://api.ipify.org', proxies=proxies, headers=headers, timeout=10)
return response.text.strip()
except requests.RequestException as e:
log(f"[!] Error getting IP: {e}")
return None
def open_url(url, user_agent):
headers = {'User-Agent': user_agent}
proxies = {
'http': TOR_SOCKS_PROXY,
'https': TOR_SOCKS_PROXY
}
try:
response = requests.get(url, proxies=proxies, headers=headers, timeout=15)
log(f"[+] Opened URL: {url}")
log(f"[+] Status code: {response.status_code}")
content_preview = response.text[:500].replace('\n', ' ').replace('\r', ' ')
log(f"[+] Content preview (first 500 chars): {content_preview}")
except requests.RequestException as e:
log(f"[!] Error membuka URL {url}: {e}")
def load_urls(filename):
try:
with open(filename, 'r', encoding='utf-8') as f:
urls = [line.strip() for line in f if line.strip()]
return urls
except FileNotFoundError:
log(f"[!] File {filename} tidak ditemukan.")
return []
def open_all_urls_concurrently(urls, user_agent):
threads = []
for url in urls:
t = threading.Thread(target=open_url, args=(url, user_agent))
t.start()
threads.append(t)
for t in threads:
t.join() # Tunggu semua thread selesai
def main():
ua = UserAgent()
log("[*] Starting auto IP changer with Tor and concurrent URL opener...")
urls = load_urls(URLS_FILE)
if not urls:
log("[!] Daftar URL kosong. Silakan isi file urls.txt dengan URL yang ingin dibuka, satu per baris.")
return
while True:
user_agent = ua.random
change_tor_ip()
time.sleep(10) # Delay agar circuit Tor berganti
ip = get_current_ip(user_agent)
if ip:
log(f"[+] Current IP: {ip}")
log(f"[+] Using User-Agent: {user_agent}")
open_all_urls_concurrently(urls, user_agent)
else:
log("[!] Gagal mendapatkan IP melalui Tor")
log("-" * 80)
time.sleep(10) # Delay sebelum ganti IP dan buka URL berikutnya
if __name__ == "__main__":
main()