From e074d96f02ba9859aaab1bd360c53b3b21ee9486 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9mi=20Oudin?= Date: Sun, 25 Feb 2018 21:27:15 +0100 Subject: [PATCH] tor_runner can make requests --- histories/tor_runner.py | 40 +++++++++++++++++++++++++++++++++++----- requirements.txt | 4 +++- 2 files changed, 38 insertions(+), 6 deletions(-) diff --git a/histories/tor_runner.py b/histories/tor_runner.py index e9797fd..887495b 100644 --- a/histories/tor_runner.py +++ b/histories/tor_runner.py @@ -5,6 +5,11 @@ Modules that handles tor instaces creations in order to safely run histories import stem.process as tor import shutil import asyncio +import aiohttp +import aiosocks +from aiosocks.connector import ProxyConnector, ProxyClientRequest +import async_timeout +import io class TorInstance(): """ @@ -17,7 +22,7 @@ class TorInstance(): TOR_RUNNER = 0 @classmethod - async def create(cls): + async def create(cls, history): """ Factory creation of tor processes""" socks_port = cls.BASE_SOCKS_PORT + cls.TOR_RUNNER control_port = cls.BASE_CONTROL_PORT + cls.TOR_RUNNER @@ -27,6 +32,9 @@ class TorInstance(): self.socks_port = socks_port self.control_port = control_port self.data_dir = data_dir + self.history = history + self.proxy = "socks5://127.0.0.1:{}".format(self.socks_port) + self.session = self.create_session() self.process = tor.launch_tor_with_config( config = { 'ControlPort' : str(control_port), @@ -36,21 +44,43 @@ class TorInstance(): ) return self + def create_session(self): + conn = ProxyConnector(remote_resolve=True) + return aiohttp.ClientSession( + connector=conn, + request_class=ProxyClientRequest + ) + + async def query(self, url): + async with async_timeout.timeout(30): + async with self.session.get( + url, + proxy=self.proxy, + proxy_auth=None) as resp: + try: + return await resp.text() + except UnicodeDecodeError: + return None + + def __str__(self): """ Utility function """ - return "[TOR] SOCKSPort: {0.socks_port}, ControlPort: " - "{0.control_port}, DataDir: {0.data_dir}".format(self) + return ('[TOR] SOCKSPort: {0.socks_port}, ControlPort: ' + '{0.control_port}, DataDir: {0.data_dir}'.format(self)) async def kill(self): """ Kills the process and remove the data dir""" self.process.kill() + self.session.close() shutil.rmtree(self.data_dir) + async def main(): """ Test function """ for i in range(3): - a = await TorInstance.create() - print(a) + a = await TorInstance.create(None) + output = await a.query("https://python.org/") + print("One page received") await a.kill() if __name__ == "__main__": diff --git a/requirements.txt b/requirements.txt index 480760f..604da4e 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,5 +1,5 @@ aiodns==1.1.1 -aiohttp==3.0.1 +aiohttp==2.3.2 async-timeout==2.0.0 attrs==17.4.0 cchardet==2.1.1 @@ -12,3 +12,5 @@ pycares==2.3.0 pytz==2017.3 yarl==1.1.1 beautifulsoup4==4.6.0 +stem==1.6.0 +pycurl==7.43.0.1