Skip to content
Extraits de code Groupes Projets
Valider a33f081a rédigé par Bastien Le Querrec's avatar Bastien Le Querrec
Parcourir les fichiers

Attrap: plus besoin du controlport de Tor pour changer d'identité

parent c00cf91f
Aucune branche associée trouvée
Aucune étiquette associée trouvée
Aucune requête de fusion associée trouvée
import os import os
import re import re
import random
import ssl import ssl
import subprocess import subprocess
import shutil import shutil
import string
import logging import logging
import requests import requests
import time import time
...@@ -25,9 +27,6 @@ from pypdf import PdfReader ...@@ -25,9 +27,6 @@ from pypdf import PdfReader
from pypdf import PdfWriter from pypdf import PdfWriter
from pypdf.generic import NameObject, NumberObject from pypdf.generic import NameObject, NumberObject
from stem import Signal
from stem.control import Controller
import hashlib import hashlib
import smtplib import smtplib
import email import email
...@@ -153,6 +152,7 @@ class Attrap: ...@@ -153,6 +152,7 @@ class Attrap:
self.tor_enabled = False self.tor_enabled = False
self.tor_max_requests = 0 self.tor_max_requests = 0
self.tor_requests = 0 self.tor_requests = 0
self.tor_socks5_key = None
self.not_before = datetime.datetime(2024, 1, 1) self.not_before = datetime.datetime(2024, 1, 1)
self.smtp_configured = False self.smtp_configured = False
self.mastodon = None self.mastodon = None
...@@ -189,14 +189,8 @@ class Attrap: ...@@ -189,14 +189,8 @@ class Attrap:
def enable_tor(self, max_requests=0): def enable_tor(self, max_requests=0):
"""Active l'utilisation de Tor pour effectuer les requêtes.""" """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_enabled = True
self.tor_max_requests = max_requests self.tor_max_requests = max_requests
self.tor_requests = 0
self.session.proxies.update(proxies)
self.tor_get_new_id() self.tor_get_new_id()
def disable_tor(self): def disable_tor(self):
...@@ -208,18 +202,15 @@ class Attrap: ...@@ -208,18 +202,15 @@ class Attrap:
self.session.proxies.update(proxies) self.session.proxies.update(proxies)
def tor_get_new_id(self): 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: if self.tor_enabled:
logger.info('Changement d\'identité Tor') self.tor_socks5_key = 'attrap_' + ''.join(random.choices(string.ascii_lowercase, k=20))
try: proxies = {
self.session.close() "http": f"socks5h://attrap:{self.tor_socks5_key}@127.0.0.1:9050",
controller = Controller.from_port(port=9051) "https": f"socks5h://attrap:{self.tor_socks5_key}@127.0.0.1:9050",
controller.authenticate() }
controller.signal(Signal.NEWNYM) self.session.proxies.update(proxies)
time.sleep(5) self.tor_requests = 0
self.tor_requests = 0
except Exception as exc:
logger.debug(f'Impossible de changer d\'identité Tor: {exc}')
def get_sub_pages(self, page_content, element, host, recursive_until_pdf): def get_sub_pages(self, page_content, element, host, recursive_until_pdf):
""" """
...@@ -455,7 +446,7 @@ class Attrap: ...@@ -455,7 +446,7 @@ class Attrap:
if page.status_code == 429: if page.status_code == 429:
logger.warning('Erreur 429 Too Many Requests reçue, temporisation...') logger.warning('Erreur 429 Too Many Requests reçue, temporisation...')
self.tor_get_new_id() self.tor_get_new_id()
time.sleep(55) time.sleep(1)
return self.get_page(url, method, data) return self.get_page(url, method, data)
if self.tor_enabled: if self.tor_enabled:
...@@ -468,7 +459,7 @@ class Attrap: ...@@ -468,7 +459,7 @@ class Attrap:
except requests.exceptions.ConnectionError: except requests.exceptions.ConnectionError:
logger.warning(f'Erreur de connexion, temporisation...') logger.warning(f'Erreur de connexion, temporisation...')
self.tor_get_new_id() self.tor_get_new_id()
time.sleep(55) time.sleep(30)
return self.get_page(url, method, data) return self.get_page(url, method, data)
except requests.exceptions.Timeout: except requests.exceptions.Timeout:
logger.warning(f'Timeout, on relance la requête...') logger.warning(f'Timeout, on relance la requête...')
......
...@@ -8,5 +8,4 @@ RUN apt-get update && \ ...@@ -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 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 && \ apt-get clean && \
rm -rf /var/lib/apt/lists && \ rm -rf /var/lib/apt/lists && \
ln -s /usr/bin/python3 /usr/bin/python && \ ln -s /usr/bin/python3 /usr/bin/python
sed -i '/^#ControlPort 9051/s/^#//' /etc/tor/torrc
...@@ -18,14 +18,6 @@ pip3 install -r requirements.txt ...@@ -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. 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 ## Utilisation
Pour lancer la récupération de toutes les administrations supportées : Pour lancer la récupération de toutes les administrations supportées :
......
...@@ -8,4 +8,3 @@ pypdf>=4.2.0 ...@@ -8,4 +8,3 @@ pypdf>=4.2.0
PyVirtualDisplay>=3.0 PyVirtualDisplay>=3.0
requests>=2.31.0 requests>=2.31.0
selenium>=4.19.0 selenium>=4.19.0
stem>=1.8.2
0% Chargement en cours ou .
You are about to add 0 people to the discussion. Proceed with caution.
Terminez d'abord l'édition de ce message.
Veuillez vous inscrire ou vous pour commenter