libreria python urllib2 socks tor

libreria - Python urllib sobre TOR?



urllib.urlopen python 3 (3)

Esta pregunta ya tiene una respuesta aquí:

Código de muestra:

#!/usr/bin/python import socks import socket import urllib2 socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS4, "127.0.0.1", 9050, True) socket.socket = socks.socksocket print urllib2.urlopen("http://almien.co.uk/m/tools/net/ip/").read()

TOR está ejecutando un proxy SOCKS en el puerto 9050 (su valor predeterminado). La solicitud pasa por TOR y aparece en una dirección IP distinta a la mía. Sin embargo, la consola TOR da la advertencia:

"28 de febrero 22: 44: 26,233 [advertir] Su aplicación (el uso de socks4 en el puerto 80) le da a Tor solo una dirección IP. Las aplicaciones que resuelven DNS por sí mismas pueden perder información. Considere el uso de Socks4A (por ejemplo, a través de privoxy o socat). Para obtener más información, consulte https://wiki.torproject.org/TheOnionRouter/TorFAQ#SOCKSAndDNS ".

Es decir, las búsquedas de DNS no están pasando por el proxy. Pero eso es lo que el 4to parámetro para setdefaultproxy debe hacer, ¿verdad?

De http://socksipy.sourceforge.net/readme.txt :

setproxy (proxytype, addr [, puerto [, rdns [, nombre de usuario [, contraseña]]])

rdns: este es un indicador booleano que modifica el comportamiento con respecto a la resolución de DNS. Si se establece en Verdadero, la resolución de DNS se realizará de forma remota en el servidor.

Mismo efecto con PROXY_TYPE_SOCKS4 y PROXY_TYPE_SOCKS5 seleccionados.

No puede ser un caché de DNS local (si urllib2 lo admite) porque sucede cuando cambio la URL a un dominio que esta computadora nunca ha visitado antes.


El problema es que httplib.HTTPConnection utiliza la función auxiliar de create_connection del módulo de create_connection que realiza la solicitud de DNS a través del método habitual getaddrinfo antes de conectar el socket.

La solución es crear su propia función create_connection y aplicar un parche mono en el módulo de socket antes de importar urllib2 , tal como lo hacemos con la clase socket .

import socks import socket def create_connection(address, timeout=None, source_address=None): sock = socks.socksocket() sock.connect(address) return sock socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS5, "127.0.0.1", 9050) # patch the socket module socket.socket = socks.socksocket socket.create_connection = create_connection import urllib2 # Now you can go ahead and scrape those shady darknet .onion sites


El problema es que está importando urllib2 antes de configurar la conexión de calcetines.

Intenta esto en su lugar:

import socks import socket socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS4, ''127.0.0.1'', 9050, True) socket.socket = socks.socksocket import urllib2 print urllib2.urlopen("http://almien.co.uk/m/tools/net/ip/").read()

Ejemplo de solicitud manual:

import socks import urlparse SOCKS_HOST = ''localhost'' SOCKS_PORT = 9050 SOCKS_TYPE = socks.PROXY_TYPE_SOCKS5 url = ''http://www.whatismyip.com/automation/n09230945.asp'' parsed = urlparse.urlparse(url) socket = socks.socksocket() socket.setproxy(SOCKS_TYPE, SOCKS_HOST, SOCKS_PORT) socket.connect((parsed.netloc, 80)) socket.send(''''''GET %(uri)s HTTP/1.1 host: %(host)s connection: close '''''' % dict( uri=parsed.path, host=parsed.netloc, )) print socket.recv(1024) socket.close()