Skip to content

Instantly share code, notes, and snippets.

@theasder
Last active May 1, 2021 17:34
Show Gist options
  • Save theasder/824782994f52be5a0a2166ae664b4cc2 to your computer and use it in GitHub Desktop.
Save theasder/824782994f52be5a0a2166ae664b4cc2 to your computer and use it in GitHub Desktop.
tor
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