Last active
May 1, 2021 17:34
-
-
Save theasder/824782994f52be5a0a2166ae664b4cc2 to your computer and use it in GitHub Desktop.
tor
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import os | |
import socket | |
import requests | |
import time | |
import random | |
import socks | |
import stem.process | |
from stem import Signal | |
from stem.control import Controller | |
current_time = lambda: int(round(time.time())) | |
def generate_user_agent(): | |
return random.choice(user_agents).strip() | |
class Network: | |
def switch_ip(self): | |
self.controller.signal(Signal.NEWNYM) | |
print("Switching IP. Waiting.") | |
t = current_time() | |
time.sleep(self.controller.get_newnym_wait()) | |
print("{0}s gone".format(current_time() - t)) | |
def print_bootstrap_lines(self, line): | |
print(line) | |
def init_tor(self, password='supersafe', log_handler=None): | |
self.tor_process = None | |
self.controller = None | |
try: | |
self.tor_process = stem.process.launch_tor_with_config( | |
tor_cmd=self.tor_path, | |
config=self.tor_config, | |
init_msg_handler=log_handler | |
) | |
self.controller = Controller.from_port(port=self.SOCKS_PORT + 1) | |
self.controller.authenticate(password) | |
except: | |
if self.tor_process is not None: | |
self.tor_process.terminate() | |
if self.controller is not None: | |
self.controller.close() | |
raise RuntimeError('Failed to initialize Tor') | |
socket.socket = self.proxySocket | |
def kill_tor(self): | |
print('Killing Tor process') | |
if self.controller: | |
self.controller.signal(Signal.SHUTDOWN) | |
self.controller.close() | |
self.controller = None | |
if self.tor_process: | |
self.tor_process.kill() | |
self.tor_process.wait() | |
self.tor_process = None | |
# if os.path.exists(self.dataDir): | |
# shutil.rmtree(self.dataDir) | |
def __init__(self): | |
# путь к директории файлов браузера Tor. В данном случае, директория для OS X | |
TOR_DIR = '/Applications/Tor Browser.app/Contents/Resources/TorBrowser/Tor' | |
PASS_HASH = 'SECRET' | |
IP_ADDRESS = '127.0.0.1' | |
self.SOCKS_PORT = 9150 | |
self.tor_config = { | |
'SocksPort': str(self.SOCKS_PORT), | |
'ControlPort': str(self.SOCKS_PORT + 1), | |
'HashedControlPassword': PASS_HASH, | |
'GeoIPFile': os.path.join(TOR_DIR, 'geoip'), | |
'GeoIPv6File': os.path.join(TOR_DIR, 'geoip6') | |
} | |
self.tor_path = os.path.join(TOR_DIR, 'tor') | |
# Setup proxy | |
socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS5, IP_ADDRESS, self.SOCKS_PORT) | |
self.nonProxySocket = socket.socket | |
self.proxySocket = socks.socksocket | |
def main(): | |
try: | |
network = Network() | |
network.init_tor('supersafe', network.print_bootstrap_lines) | |
url = 'http://checkip.amazonaws.com/' | |
headers = {'User-Agent': generate_user_agent()} | |
req = requests.get(url, headers=headers) | |
print(req.content) | |
network.switch_ip() | |
req = requests.get(url, headers=headers) | |
print(req.content) | |
finally: | |
network.kill_tor() | |
if __name__ == "__main__": | |
main() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment