Simple navegador "anónimo" utilizando PySide y proxies de hola.org

Iniciado por Polsaker, Mayo 27, 2015, 02:05:01 AM

Tema anterior - Siguiente tema

0 Miembros y 1 Visitante están viendo este tema.

Mayo 27, 2015, 02:05:01 AM Ultima modificación: Mayo 27, 2015, 02:22:00 AM por Polsaker
Hace un par de meses estaba aburrido y decidí reversear la extensión de No tienes permitido ver los links. Registrarse o Entrar a mi cuenta (que por cierto no recomendaría usar, ya que transforma tu computadora en uno de sus proxies, pero eso es material para otro post...) y no se me ocurrió mejor idea que crear un prototipo de navegador "anónimo", en el cual puedas cambiar de IP, limpiar las cookies, cambiar de User-Agent, etc, con un solo click de un botón.
Por supuesto, carece de algunas funciones importantes de los navegadores mas comunes, ya que esto es bien básico, pero planeo ir mejorandolo con el tiempo si hay ganas.

Código: python
# -*- coding: utf-8 -*-

# Navegador básico hecho con PySide.
# Utiliza hola.org para buscar proxies y navegar de la forma mas anónima posible
# Por Polsaker (https://github.com/Polsaker)

from PySide import QtCore, QtGui
from PySide import QtWebKit
from PySide import QtNetwork
import pycurl
import random
from StringIO import StringIO
import json
import time


class MyBrowser(QtWebKit.QWebView):
    def __init__(self):
        QtWebKit.QWebView.__init__(self)
        self.currip = ''
        cp = CPage()
        cp.par = self
        self.setPage(cp)

class Navegador(QtGui.QWidget):

    def __init__(self, app):
        self.app = app
        super(Navegador, self).__init__(parent=None)
        self.qnp = QtNetwork.QNetworkProxy()
        self.qnp.setType(QtNetwork.QNetworkProxy.HttpProxy)
       
        self.setWindowTitle("Hola navigator")
        self.gridLayout = QtGui.QGridLayout(self)
        self.label = QtGui.QLabel(u"", self)
        self.gridLayout.addWidget(self.label, 0, 0, 1, 1)
        self.labelStatus = QtGui.QLabel("Ok", self)
        self.gridLayout.addWidget(self.labelStatus, 2, -1, 1, 1)
        self.btnRep = QtGui.QPushButton(self, text='Change IP')
        self.gridLayout.addWidget(self.btnRep, 0, 1, 1, 1)
        self.btnIr = QtGui.QPushButton(self, text='Go')
        self.gridLayout.addWidget(self.btnIr, 0, 3, 1, 1)
        self.addr = QtGui.QLineEdit(self)
        self.gridLayout.addWidget(self.addr, 0, 2, 1, 1)

        self.wvNavegador = MyBrowser()
        self.gridLayout.addWidget(self.wvNavegador, 1, 0, 1, 4)
       
        self.connect(
            self.btnRep,
            QtCore.SIGNAL("clicked()"),
            self.refreshPage)
        self.connect(
            self.btnIr,
            QtCore.SIGNAL("clicked()"),
            self.cargarUrl)
        self.connect(
            self.addr,
            QtCore.SIGNAL("returnPressed()"),
            self.cargarUrl)
       
        QtWebKit.QWebSettings.globalSettings().setAttribute(
            QtWebKit.QWebSettings.PluginsEnabled, True)
        QtWebKit.QWebSettings.globalSettings().setAttribute(
            QtWebKit.QWebSettings.JavascriptCanOpenWindows, True)
        QtWebKit.QWebSettings.globalSettings().setAttribute(
            QtWebKit.QWebSettings.DeveloperExtrasEnabled, True)

        self.wvNavegador.loadProgress.connect(self._progress)
       
        self.addr.setText("http://google.com") # <-- Página por defecto
   
    # Esta función es llamada al cambiar la IP. Borra nuestros rastros, cookies
    # busca un proxy nuevo y cambiar el user-agent.
    def refreshPage(self):
        # Con esto reseteamos las cookies
        self.wvNavegador.page().networkAccessManager().setCookieJar(QtNetwork.QNetworkCookieJar());
        holaproxy = HolaProxyv2(self) # Buscando un proxy nuevo..
       
        self.qnp.setHostName(holaproxy.node)
        self.qnp.setPort(holaproxy.port)
       
        # Credenciales de hola.org, aparentemente varían según cada navegador.
        # Si el script deja de andar, probablemente sea por que las credenciales
        # han cambiado.
        self.qnp.setUser("user-uuid-71317a7827fa928352b29cc7ffe25f4f")
        self.qnp.setPassword("e883692e09c6")
       
        self.qnp.currip = holaproxy.node + ":" + str(holaproxy.port)
        self.cargarUrl()
   
    # Esto evita que la interfaz se congele al procesar eventos.
    def _iloop(self):
        while True:
            k = 0
            while k != 120:
                time.sleep(0.5)
                QtCore.QCoreApplication.processEvents();
                k += 1
            self.refreshPage()
   
    # Actualizar el progreso de carga de cada página
    def _progress(self, progress):
        self.label.setText(str(progress) + "%")
       
    def cargarUrl(self):
        url = self.addr.text()
        url = url if url.startswith(
            "http://") or url.startswith(
                "https://") else "http://{url}".format(
                    url=url)
        # Usamos el proxy...
        QtNetwork.QNetworkProxy.setApplicationProxy(self.qnp)
        request = QtNetwork.QNetworkRequest()
        request.setUrl(url)
       
        # Alteramos el header "Accept-Language", ya que podría revelar
        # nuestra ubicación real.
        request.setRawHeader("Accept-Language","*")
        self.wvNavegador.load(request)

class CPage(QtWebKit.QWebPage):
    ''' Settings for the browser.'''
   
    def userAgentForUrl(self, url):
        # Con esto alteramos el User-Agent, que es definido de forma
        # distinta dependiendo de la IP que estemos usando.
        return random.Random(self.par.currip).choice(["Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.75.14 (KHTML, like Gecko) Version/7.0.3 Safari/7046A194A",
            "Mozilla/5.0 (iPad; CPU OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A5355d Safari/8536.25",
            "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/537.13+ (KHTML, like Gecko) Version/5.1.7 Safari/534.57.2",
            "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/534.55.3 (KHTML, like Gecko) Version/5.1.3 Safari/534.53.10",
            "Mozilla/5.0 (iPad; CPU OS 5_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko ) Version/5.1 Mobile/9B176 Safari/7534.48.3",
            "Opera/9.80 (X11; Linux i686; Ubuntu/14.10) Presto/2.12.388 Version/12.16",
            "Opera/9.80 (Windows NT 6.0) Presto/2.12.388 Version/12.14",
            "Mozilla/5.0 (Windows NT 6.0; rv:2.0) Gecko/20100101 Firefox/4.0 Opera 12.14",
            "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.0) Opera 12.14",
            "Opera/12.80 (Windows NT 5.1; U; en) Presto/2.10.289 Version/12.02",
            "Mozilla/5.0 (X11; Linux) KHTML/4.9.1 (like Gecko) Konqueror/4.9",
            "Mozilla/5.0 (X11; Linux 3.5.4-1-ARCH i686; es) KHTML/4.9.1 (like Gecko) Konqueror/4.9",
            "Mozilla/5.0 (X11) KHTML/4.9.1 (like Gecko) Konqueror/4.9",
            "Mozilla/5.0 (compatible; Konqueror/4.5; FreeBSD) KHTML/4.5.4 (like Gecko)",
            "Mozilla/5.0 (compatible; Konqueror/4.4; Linux) KHTML/4.4.1 (like Gecko) Fedora/4.4.1-1.fc12",
            "Mozilla/5.0 (compatible, MSIE 11, Windows NT 6.3; Trident/7.0; rv:11.0) like Gecko",
            "Mozilla/5.0 (compatible; MSIE 10.6; Windows NT 6.1; Trident/5.0; InfoPath.2; SLCC1; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET CLR 2.0.50727) 3gpp-gba UNTRUSTED/1.0",
            "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)",
            "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/6.0)",
            "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/5.0)",
            "Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/20121202 Firefox/17.0 Iceweasel/17.0.1",
            "Mozilla/5.0 (X11; Linux x86_64; rv:15.0) Gecko/20100101 Firefox/15.0.1 Iceweasel/15.0.1",
            "Mozilla/5.0 (X11; Linux i686; rv:15.0) Gecko/20100101 Firefox/15.0.1 Iceweasel/15.0.1",
            "Mozilla/5.0 (X11; Linux x86_64; rv:15.0) Gecko/20120724 Debian Iceweasel/15.0",
            "Mozilla/5.0 (X11; Linux x86_64; rv:15.0) Gecko/20100101 Firefox/15.0 Iceweasel/15.0",
            "Mozilla/5.0 (Windows NT 6.3; rv:36.0) Gecko/20100101 Firefox/36.0",
            "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10; rv:33.0) Gecko/20100101 Firefox/33.0",
            "Mozilla/5.0 (X11; Linux i586; rv:31.0) Gecko/20100101 Firefox/31.0",
            "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:31.0) Gecko/20130401 Firefox/31.0",
            "Mozilla/5.0 (Windows NT 5.1; rv:31.0) Gecko/20100101 Firefox/31.0",
            "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36",
            "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2227.1 Safari/537.36",
            "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2227.0 Safari/537.36",
            "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2227.0 Safari/537.36",
            "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2226.0 Safari/537.36",
            "Mozilla/5.0 (BlackBerry; U; BlackBerry 9900; en) AppleWebKit/534.11+ (KHTML, like Gecko) Version/7.1.0.346 Mobile Safari/534.11+",
            "Mozilla/5.0 (BlackBerry; U; BlackBerry 9860; en-US) AppleWebKit/534.11+ (KHTML, like Gecko) Version/7.0.0.254 Mobile Safari/534.11+",
            "Mozilla/5.0 (BlackBerry; U; BlackBerry 9850; en-US) AppleWebKit/534.11+ (KHTML, like Gecko) Version/7.0.0.254 Mobile Safari/534.11+",
            "Mozilla/5.0 (BlackBerry; U; BlackBerry 9850; en-US) AppleWebKit/534.11+ (KHTML, like Gecko) Version/7.0.0.115 Mobile Safari/534.11+",
            "Mozilla/5.0 (BlackBerry; U; BlackBerry 9850; en) AppleWebKit/534.11+ (KHTML, like Gecko) Version/7.0.0.254 Mobile Safari/534.11+",
            "Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0)",
            "HTC_Touch_3G Mozilla/4.0 (compatible; MSIE 6.0; Windows CE; IEMobile 7.11)",
            "Mozilla/4.0 (compatible; MSIE 7.0; Windows Phone OS 7.0; Trident/3.1; IEMobile/7.0; Nokia;N70)",
            "Mozilla/5.0 (X11; U; Linux i686; fr-fr) AppleWebKit/525.1+ (KHTML, like Gecko, Safari/525.1+) midori/1.19",
            "Mozilla/5.0 (X11; Linux; rv:2.0.1) Gecko/20100101 Firefox/4.0.1 Midori/0.4",
            "Opera/9.80 (J2ME/MIDP; Opera Mini/9.80 (S60; SymbOS; Opera Mobi/23.348; U; en) Presto/2.5.25 Version/10.54",
            "Opera/9.80 (J2ME/MIDP; Opera Mini/9.80 (S60; SymbOS; Opera Mobi/23.334; U; id) Presto/2.5.25 Version/10.54",
            "Opera/9.80 (J2ME/MIDP; Opera Mini/9.80 (J2ME/23.377; U; en) Presto/2.5.25 Version/10.54",
            "Opera/9.80 (J2ME/MIDP; Opera Mini/9.80 (J2ME/22.478; U; en) Presto/2.5.25 Version/10.54",
            "Opera/9.80 (J2ME/MIDP; Opera Mini/9 (Compatible; MSIE:9.0; iPhone; BlackBerry9700; AppleWebKit/24.746; U; en) Presto/2.5.25 Version/10.54",
            "Opera/12.02 (Android 4.1; Linux; Opera Mobi/ADR-1111101157; U; en-US) Presto/2.9.201 Version/12.02",
            "Opera/9.80 (Android 2.3.3; Linux; Opera Mobi/ADR-1111101157; U; es-ES) Presto/2.9.201 Version/11.50",
            "Opera/9.80 (S60; SymbOS; Opera Mobi/SYB-1107071606; U; en) Presto/2.8.149 Version/11.10",
            "Opera/9.80 (Android 2.3.4; Linux; Opera Mobi/build-1107180945; U; en-GB) Presto/2.8.149 Version/11.10",
            "Opera/9.80 (Android 2.2.1; Linux; Opera Mobi/ADR-1107051709; U; pl) Presto/2.8.149 Version/11.10"])

# Clase encargada de descubrir nuevos proxies.
class HolaProxyv2(object):
    def __init__(self, widg):
        widg.labelStatus.setText("Starting proxy discovery..")
        country = random.choice(["ar", "au", "at",
                                "be", "bo",
                                "br",
                                "cl",
                                "fi", "fr", "de", "gi", "gb", "gr",
                                "hk", "is", "in",
                                "it", "jp",
                                "kr", "kw",
                                "mx",
                                "nl",
                                "nz",
                                "py", "pe", "pt", "ro", "ru", "sh", "es", "se", "ch",
                                "tw", "uk", "uy", "us", "ve"])
        country = country + ".peer"
        c = pycurl.Curl()
        buffer = StringIO()
        c.setopt(c.WRITEFUNCTION, buffer.write)
        c.setopt(c.URL, "http://client.hola.org/client_cgi/zgettunnels?country=" + country)
        c.perform()
        jbuf = json.loads(buffer.getvalue())
        petition = jbuf['ztun'][country][0].split()[1].split(":")
        self.node = petition[0]
        self.port = int(petition[1])
        widg.labelStatus.setText("Using {0}:{1} ({2})".format(petition[0], petition[1], country))
       

if __name__ == "__main__":
    import sys
    app = QtGui.QApplication(sys.argv)
    nav = Navegador(app)
    nav.show()
    nav.refreshPage()
    nav._iloop()
    sys.exit(app.exec_())

Mayo 27, 2015, 02:14:21 AM #1 Ultima modificación: Mayo 27, 2015, 02:25:09 AM por Gabriela
Hasta que finalmente, te decidiste a compartir, delincuente (con cariño) !!!!

Sabes que verte por aquí, y leer tus códigos (limpios y claros) es una de esas alegrías inesperadas.

Citar...pero eso es material para otro post...

Espero ese  posts ( y más te vale  ;D ).

Gabi.
Tú te enamoraste de mi valentía, yo me enamoré de tu oscuridad; tú aprendiste a vencer tus miedos, yo aprendí a no perderme en tu abismo.

@No tienes permitido ver los links. Registrarse o Entrar a mi cuenta te ha quedado muy bien.
E interesante funcionalidad esa de poder cambiar de User-Agent y de IP, me parecen geniales.

Saludos!