From a33f081abc80a05506d11c692ae863f2d0ee81ed Mon Sep 17 00:00:00 2001 From: Bastien Le Querrec <blq@laquadrature.net> Date: Fri, 21 Jun 2024 16:16:37 +0200 Subject: [PATCH] =?UTF-8?q?Attrap:=20plus=20besoin=20du=20controlport=20de?= =?UTF-8?q?=20Tor=20pour=20changer=20d'identit=C3=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Attrap.py | 35 +++++++++++++---------------------- Dockerfile-base | 3 +-- README.md | 8 -------- requirements.txt | 1 - 4 files changed, 14 insertions(+), 33 deletions(-) diff --git a/Attrap.py b/Attrap.py index f8c788c..478eeec 100644 --- a/Attrap.py +++ b/Attrap.py @@ -1,8 +1,10 @@ import os import re +import random import ssl import subprocess import shutil +import string import logging import requests import time @@ -25,9 +27,6 @@ from pypdf import PdfReader from pypdf import PdfWriter from pypdf.generic import NameObject, NumberObject -from stem import Signal -from stem.control import Controller - import hashlib import smtplib import email @@ -153,6 +152,7 @@ class Attrap: self.tor_enabled = False self.tor_max_requests = 0 self.tor_requests = 0 + self.tor_socks5_key = None self.not_before = datetime.datetime(2024, 1, 1) self.smtp_configured = False self.mastodon = None @@ -189,14 +189,8 @@ class Attrap: def enable_tor(self, max_requests=0): """Active l'utilisation de Tor pour effectuer les requêtes.""" - proxies = { - "http": f"socks5h://127.0.0.1:9050", - "https": f"socks5h://127.0.0.1:9050", - } self.tor_enabled = True self.tor_max_requests = max_requests - self.tor_requests = 0 - self.session.proxies.update(proxies) self.tor_get_new_id() def disable_tor(self): @@ -208,18 +202,15 @@ class Attrap: self.session.proxies.update(proxies) def tor_get_new_id(self): - """Change d'identité Tor. Cela permet de changer de noeud de sortie donc d'IP.""" + """Change de circuit Tor. Cela permet de changer de noeud de sortie donc d'IP.""" if self.tor_enabled: - logger.info('Changement d\'identité Tor') - try: - self.session.close() - controller = Controller.from_port(port=9051) - controller.authenticate() - controller.signal(Signal.NEWNYM) - time.sleep(5) - self.tor_requests = 0 - except Exception as exc: - logger.debug(f'Impossible de changer d\'identité Tor: {exc}') + self.tor_socks5_key = 'attrap_' + ''.join(random.choices(string.ascii_lowercase, k=20)) + proxies = { + "http": f"socks5h://attrap:{self.tor_socks5_key}@127.0.0.1:9050", + "https": f"socks5h://attrap:{self.tor_socks5_key}@127.0.0.1:9050", + } + self.session.proxies.update(proxies) + self.tor_requests = 0 def get_sub_pages(self, page_content, element, host, recursive_until_pdf): """ @@ -455,7 +446,7 @@ class Attrap: if page.status_code == 429: logger.warning('Erreur 429 Too Many Requests reçue, temporisation...') self.tor_get_new_id() - time.sleep(55) + time.sleep(1) return self.get_page(url, method, data) if self.tor_enabled: @@ -468,7 +459,7 @@ class Attrap: except requests.exceptions.ConnectionError: logger.warning(f'Erreur de connexion, temporisation...') self.tor_get_new_id() - time.sleep(55) + time.sleep(30) return self.get_page(url, method, data) except requests.exceptions.Timeout: logger.warning(f'Timeout, on relance la requête...') diff --git a/Dockerfile-base b/Dockerfile-base index d3ecee8..bef978b 100644 --- a/Dockerfile-base +++ b/Dockerfile-base @@ -8,5 +8,4 @@ RUN apt-get update && \ apt-get install --no-install-recommends -y python3 python3-virtualenv chromium-driver make xauth xvfb tesseract-ocr tesseract-ocr-eng tesseract-ocr-fra curl unzip zip tor file ghostscript && \ apt-get clean && \ rm -rf /var/lib/apt/lists && \ - ln -s /usr/bin/python3 /usr/bin/python && \ - sed -i '/^#ControlPort 9051/s/^#//' /etc/tor/torrc + ln -s /usr/bin/python3 /usr/bin/python diff --git a/README.md b/README.md index 2011c87..3c4337b 100644 --- a/README.md +++ b/README.md @@ -18,14 +18,6 @@ pip3 install -r requirements.txt Vous devez avoir installé les données `eng` et `fra` de Tesseract et le démon Tor. -### Configuration du démon Tor - -Il faut que le port de contrôle 9051 du démon Tor soit ouvert pour permettre à Attrap de s'y connecter. Vous pouvez exécuter la ligne suivante pour faire cela : - -```bash -sed -i '/^#ControlPort 9051/s/^#//' /etc/tor/torrc -``` - ## Utilisation Pour lancer la récupération de toutes les administrations supportées : diff --git a/requirements.txt b/requirements.txt index efe28e5..bd604ec 100644 --- a/requirements.txt +++ b/requirements.txt @@ -8,4 +8,3 @@ pypdf>=4.2.0 PyVirtualDisplay>=3.0 requests>=2.31.0 selenium>=4.19.0 -stem>=1.8.2 -- GitLab