app

 avatar
unknown
python
4 years ago
24 kB
5
Indexable
import time
import sys
import urllib.request, socket
import requests
from PyQt5 import QtWidgets, QtCore, QtGui
from PyQt5.QtCore import QObject, QThread, pyqtSignal, pyqtSlot
from PyQt5.QtWidgets import QApplication, QPushButton, QTextEdit, QVBoxLayout, QWidget


def trap_exc_during_debug(*args):
    # when app raises uncaught exception, print info
    print(args)


# install exception hook: without this, uncaught exception would cause application to exit
sys.excepthook = trap_exc_during_debug

        # Laikinam neimam input, o imam iš šito sarašo ip's.
ProxyList = ["185.60.144.87:12323:7_dac1208285:7293b1beb3",
             "185.60.144.88:12323:7_dac1208285:7293b1beb3",
             "185.60.144.89:12323:7_dac1208285:7293b1beb3",
             "185.60.144.90:12323:7_dac1208285:7293b1beb3",
             "185.60.144.91:12323:7_dac1208285:7293b1beb3",
             "proxy.iproyal.com:12323:iproyaladmin:testadminpassword_session-PoAjNBrg",
             "proxy.iproyal.com:12323:iproyaladmin:testadminpassword_session-FUhYEAjm",
             "proxy.iproyal.com:12323:iproyaladmin:testadminpassword_session-2zTrGXLu",
             "proxy.iproyal.com:12323:iproyaladmin:testadminpassword_session-0J2F6pyM"]

ProxyListFinal = []
class Worker(QObject):



    """
    Must derive from QObject in order to emit signals, connect slots to other signals, and operate in a QThread.
    """

    sig_step = pyqtSignal(int,str)  # worker id, step description: emitted every step through work() loop
    sig_done = pyqtSignal(int)  # worker id: emitted at end of work()
    sig_msg = pyqtSignal(str)  # message to be shown to user
    
    
    
    def __init__(self, id: int):
        super().__init__()
        self.__id = id
        self.__abort = False
        self.ProxyList = ProxyList
        self.ProxyListFinal = ProxyListFinal
        
        

    def get_proxy_list(self):
        #ProxyOriginal = self.ProxyList.split('\n')
        ProxyOriginal = self.ProxyList
        for proxy in ProxyOriginal:
            self.splitted = proxy.split(':')
            proxyEdited = (self.splitted[2] + ':' + self.splitted[3] + '@' + self.splitted[0] + ':' + self.splitted[1])
            self.ProxyListFinal.append(proxyEdited)


    #def ipInfo(self, addr=''):
        #from urllib.request import urlopen
        #from json import load
        #if addr == '':
            #url = 'https://ipinfo.io/json'
        #else:
            #url = 'https://ipinfo.io/' + addr + '/json'
        #self.res = urlopen(url)
        # response from url(if res==None then check connection)
        #self.data = load(self.res)
        # will load the json response into data

        # will print the data line by line
        #self.inforaw = ('IP' + ' ' * 17 + '->' + ' ' * 5 + str(self.data['ip']),
                     #'City' + ' ' * 15 + '->' + ' ' * 5 + str(self.data['city']),
                     #'Country' + ' ' * 9 + '->' + ' ' * 5 + str(self.data['country']),
                     #'Organization' + ' ' * 3 + '->' + ' ' * 5 + str(self.data['org']))
        #self.info = '\n'+'\n'.join(self.inforaw)
        #return self.info

    def is_bad_proxy(self, pip):
        try:
            self.address = 'http://www.usa.gov'
            self.proxy_handler = urllib.request.ProxyHandler({'http': pip})
            self.opener = urllib.request.build_opener(self.proxy_handler)
            self.opener.addheaders = [('User-agent', 'Mozilla/5.0')]
            urllib.request.install_opener(self.opener)
            self.sock = urllib.request.urlopen(self.address)
            self.response = requests.get(self.address)
            self.speedraw = (str(round(self.response.elapsed.total_seconds() * 1000)),'ms')
            self.speed = ' '.join(self.speedraw)+' ->'
        except urllib.error.HTTPError as e:
            print('Error code: ', e.code)
            return e.code
        except Exception as detail:
            print("ERROR:", detail)
            return 1
        return 0

    @pyqtSlot()
    def work(self):
        """
        Pretend this worker method does work that takes a long time. During this time, the thread's
        event loop is blocked, except if the application's processEvents() is called: this gives every
        thread (incl. main) a chance to process events, which in this sample means processing signals
        received from GUI (such as abort).
        """
        thread_name = QThread.currentThread().objectName()
        thread_id = int(QThread.currentThreadId())  # cast to int() is necessary
        self.sig_msg.emit('yRunning worker #{} from thread "{}" (#{})'.format(self.__id, thread_name, thread_id))

        x = 1
        self.get_proxy_list()
        i=1
        for step in self.ProxyListFinal:
            if self.is_bad_proxy(step):
                #result = ("Bad Proxy" + ' -> ' + step, self.ipInfo(self.splitted[0]))
                raw = ("Bad Proxy", ' -> ', str(step))
                result = ' '.join(raw)+'_'*67
                self.sig_step.emit(i,result)
                i = i+1
                print(web_address)
                # send good proxy info to log
                app.processEvents() # process emit signal
            else:
                #result = (self.speed, step, "is working", self.ipInfo(self.splitted[0]))
                raw = (str(self.speed), str(step), "is working")
                result = ' '.join(raw)+'\n'+'_'*67
                self.sig_step.emit(i,result)
                i = i+1
                # send bad proxy info to log
                print(web_address)
                app.processEvents() # process emit signal
            if self.__abort:
                # note that "step" value will not necessarily be same for every thread
                self.sig_msg.emit('Worker #{} aborting work at step {}'.format(self.__id, step))
                break
            #self.sig_done.emit(self.__id)

    def abort(self):
        self.sig_msg.emit('Worker #{} notified to abort'.format(self.__id))
        self.__abort = True


class MyWidget(QWidget):
    
    NUM_THREADS = 1

    # sig_start = pyqtSignal()  # needed only due to PyCharm debugger bug (!)
    sig_abort_workers = pyqtSignal()
    
    
    def setupUi(self, MainWindow):
        global web_address
        MainWindow.setObjectName("MainWindow")
        MainWindow.setWindowModality(QtCore.Qt.NonModal)
        MainWindow.resize(800, 800)
        MainWindow.setMinimumSize(QtCore.QSize(800, 800))
        MainWindow.setMaximumSize(QtCore.QSize(900, 900))
        MainWindow.setAcceptDrops(False)
        icon = QtGui.QIcon()
        icon.addPixmap(QtGui.QPixmap("static/window-icon.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
        MainWindow.setWindowIcon(icon)
        MainWindow.setWindowOpacity(1.0)
        MainWindow.setStyleSheet("background-color: qradialgradient(spread:pad, cx:0.737, cy:0.318182, radius:0.86, fx:1, fy:0, stop:0 rgba(60, 5, 94, 255), stop:1 rgba(47, 14, 90, 255));")
        MainWindow.setDocumentMode(False)
        MainWindow.setTabShape(QtWidgets.QTabWidget.Rounded)
        MainWindow.setDockNestingEnabled(False)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setAutoFillBackground(False)
        self.centralwidget.setStyleSheet("")
        self.centralwidget.setObjectName("centralwidget")
        self.logo = QtWidgets.QLabel(self.centralwidget)
        self.logo.setGeometry(QtCore.QRect(30, 30, 251, 71))
        self.logo.setStyleSheet("color: rgb(255, 255, 205,00);\n"
                                "background-color: rgba(0, 0, 0, 0)")
        self.logo.setText("")
        self.logo.setPixmap(QtGui.QPixmap("static/logo-w.png"))
        self.logo.setScaledContents(True)
        self.logo.setObjectName("logo")
        self.web_address_input = QtWidgets.QLineEdit(self.centralwidget)
        web_address = self.web_address_input.text()
        self.web_address_input.setGeometry(QtCore.QRect(30, 340, 260, 33))
        self.web_address_input.setStyleSheet("background-color:#250F49;\n"
                                            "border-radius:10px;\n"
                                            "color:white;\n"
                                            "padding-left:30px;\n"
                                            "font: 9pt \"Exo Medium\";")
        self.web_address_input.setInputMethodHints(QtCore.Qt.ImhNone)
        self.web_address_input.setClearButtonEnabled(False)
        self.web_address_input.setObjectName("web_address_input")
        self.more_text = QtWidgets.QLabel(self.centralwidget)
        self.more_text.setGeometry(QtCore.QRect(50, 140, 311, 110))
        self.more_text.setStyleSheet("color:#8A7BAA;\n"
                                    "font: 25 9pt \"Gotham\";\n"
                                    "background-color: rgba(0, 0, 0, 0)")
        self.more_text.setObjectName("more_text")
        self.web_icon = QtWidgets.QLabel(self.centralwidget)
        self.web_icon.setGeometry(QtCore.QRect(35, 345, 20, 20))
        self.web_icon.setStyleSheet("background-color: rgba(0, 0, 0, 0)")
        self.web_icon.setText("")
        self.web_icon.setPixmap(QtGui.QPixmap("static/web.png"))
        self.web_icon.setScaledContents(True)
        self.web_icon.setObjectName("web_icon")
        self.log = QtWidgets.QTextEdit(self.centralwidget)
        self.log.setGeometry(QtCore.QRect(300, 340, 470, 113))
        self.log.setStyleSheet("background-color:#250F49;\n"
                                        "border-radius: 10px;\n"
                                        "color:white;\n"
                                        "font: 9pt \"Exo Medium\";\n"
                                        "")
        self.log.setFrameShape(QtWidgets.QFrame.NoFrame)
        self.log.setFrameShadow(QtWidgets.QFrame.Plain)
        self.log.setObjectName("log")
        self.enter_proxy_text = QtWidgets.QLabel(self.centralwidget)
        self.enter_proxy_text.setGeometry(QtCore.QRect(300, 320, 291, 16))
        self.enter_proxy_text.setStyleSheet("color:white;\n"
                                            "font: 57 9pt \"Gotham Black\";\n"
                                            "background-color: rgba(0, 0, 0, 0)")
        self.enter_proxy_text.setObjectName("enter_proxy_text")
        self.enter_proxy_detailed_text = QtWidgets.QLabel(self.centralwidget)
        self.enter_proxy_detailed_text.setGeometry(QtCore.QRect(480, 455, 351, 16))
        self.enter_proxy_detailed_text.setStyleSheet("color:#8A7BAA;\n"
                                                    "font: 57 italic 9pt \"Exo Medium\";\n"
                                                    "background-color: rgba(0, 0, 0, 0)")
        self.enter_proxy_detailed_text.setScaledContents(False)
        self.enter_proxy_detailed_text.setObjectName("enter_proxy_detailed_text")
        self.button_stop_threads = QtWidgets.QPushButton(self.centralwidget)
        self.button_stop_threads.setGeometry(QtCore.QRect(30, 420, 80, 33))
        self.button_stop_threads.setStyleSheet("border-radius: 5px 5px 0px 5px;\n"
                                                "color:white;\n"
                                                "font: 57 10pt \"Gotham Black\";\n"
                                                "border-color:#D0349C;\n"
                                                "border-style:solid;\n"
                                                "border-width:2px;")
        self.button_stop_threads.setObjectName("button_stop_threads")
        self.progress = QtWidgets.QTextEdit(self.centralwidget)
        self.progress.setGeometry(QtCore.QRect(30, 480, 740, 250))
        self.progress.setStyleSheet("background-color:#250F49;\n"
                                    "border-radius:6px;\n"
                                    "color:white;\n"
                                    "font: 9pt \"Exo Medium\";")
        self.progress.setReadOnly(True)
        self.progress.setObjectName("progress")
        self.clear_button = QtWidgets.QPushButton(self.centralwidget)
        self.clear_button.setGeometry(QtCore.QRect(210, 420, 80, 33))
        self.clear_button.setStyleSheet("border-radius:6px;\n"
                                        "color:white;\n"
                                        "font: 57 10pt \"Gotham Black\";\n"
                                        "background:#D0349C;")
        self.clear_button.setObjectName("clear_button")
        self.hero = QtWidgets.QLabel(self.centralwidget)
        self.hero.setEnabled(True)
        self.hero.setGeometry(QtCore.QRect(340, 0, 460, 380))
        self.hero.setStyleSheet("color: rgb(255, 255, 205,00);\n"
                                "background-color: rgba(0, 0, 0, 0)")
        self.hero.setText("")
        self.hero.setPixmap(QtGui.QPixmap("static/hero-v2.png"))
        self.hero.setScaledContents(True)
        self.hero.setObjectName("hero")
        self.main_heading = QtWidgets.QLabel(self.centralwidget)
        self.main_heading.setGeometry(QtCore.QRect(50, 110, 231, 60))
        self.main_heading.setStyleSheet("background-color: rgba(0, 0, 0, 0);\n"
                                        "color:white;\n"
                                        "font: 30pt \"Bebas\";")
        self.main_heading.setObjectName("main_heading")
        self.web_button = QtWidgets.QPushButton(self.centralwidget)
        self.web_button.setGeometry(QtCore.QRect(50, 240, 151, 31))
        self.web_button.setStyleSheet("border-radius:10px;\n"
                                        "color:white;\n"
                                        "background-color:#00000000;\n"
                                        "border-style:solid;\n"
                                        "border-width:2px;\n"
                                        "font-family:\"Bebas\";\n"
                                        "font-size:15px;\n"
                                        "border-color: rgb(192, 222, 217);")
        self.web_button.setObjectName("web_button")
        self.web_address_text = QtWidgets.QLabel(self.centralwidget)
        self.web_address_text.setGeometry(QtCore.QRect(30, 320, 291, 20))
        self.web_address_text.setStyleSheet("color:white;\n"
                                            "font: 57 9pt \"Gotham Black\";\n"
                                            "background-color: rgba(0, 0, 0, 0)")
        self.web_address_text.setObjectName("web_address_text")
        self.button_start_threads = QtWidgets.QPushButton(self.centralwidget)
        self.button_start_threads.setGeometry(QtCore.QRect(30, 380, 260, 33))
        self.button_start_threads.setStyleSheet("border-radius:6px;\n"
                                                "color:white;\n"
                                                "font: 57 10pt \"Gotham Black\";\n"
                                                "background:#6B22C3;")
        self.button_start_threads.setObjectName("button_start_threads")
        self.button_start_threads.clicked.connect(self.start_threads)
        self.import_button = QtWidgets.QPushButton(self.centralwidget)
        self.import_button.setGeometry(QtCore.QRect(120, 420, 80, 33))
        self.import_button.setStyleSheet("border-radius:6px;\n"
                                        "color:white;\n"
                                        "font: 57 10pt \"Gotham Black\";\n"
                                        "background:#6B22C3;")
        self.import_button.setObjectName("import_button")
        self.proxy_output_text = QtWidgets.QLabel(self.centralwidget)
        self.proxy_output_text.setGeometry(QtCore.QRect(30, 460, 291, 20))
        self.proxy_output_text.setStyleSheet("color:white;\n"
                                            "font: 57 9pt \"Gotham Black\";\n"
                                            "background-color: rgba(0, 0, 0, 0)")
        self.proxy_output_text.setObjectName("proxy_output_text")
        self.progressBar = QtWidgets.QProgressBar(self.centralwidget)
        self.progressBar.setGeometry(QtCore.QRect(30, 740, 741, 23))
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Fixed)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.progressBar.sizePolicy().hasHeightForWidth())
        self.progressBar.setSizePolicy(sizePolicy)
        self.progressBar.setStyleSheet("QProgressBar\n"
                                        "{\n"
                                        "border-radius: 10px;\n"
                                        "border: solid grey;\n"
                                        "background-color:#250F49;\n"
                                        "}\n"
                                        "QProgressBar::chunk \n"
                                        "{background-color: qlineargradient(spread:pad, x1:0, y1:0.5, x2:1, y2:0.5, stop:0 rgba(90, 97, 210, 255), stop:1 rgba(219, 48, 151, 255));\n"
                                        "border-radius :10px;}\n"
                                        "\n"
                                        "")
        self.progressBar.setInputMethodHints(QtCore.Qt.ImhNone)
        self.progressBar.setProperty("value", 75)
        self.progressBar.setTextVisible(False)
        self.progressBar.setInvertedAppearance(False)
        self.progressBar.setObjectName("progressBar")
        self.hero.raise_()
        self.logo.raise_()
        self.web_address_input.raise_()
        self.more_text.raise_()
        self.web_icon.raise_()
        self.log.raise_()
        self.enter_proxy_text.raise_()
        self.enter_proxy_detailed_text.raise_()
        self.button_stop_threads.raise_()
        self.progress.raise_()
        self.clear_button.raise_()
        self.main_heading.raise_()
        self.web_button.raise_()
        self.web_address_text.raise_()
        self.button_start_threads.raise_()
        self.import_button.raise_()
        self.proxy_output_text.raise_()
        self.progressBar.raise_()
        MainWindow.setCentralWidget(self.centralwidget)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)
        

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "IPRoyal Proxy Tester"))
        self.web_address_input.setToolTip(_translate("MainWindow", "<html><head/><body><p>asdasd</p></body></html>"))
        self.web_address_input.setText(_translate("MainWindow", "https://www.google.com"))
        self.more_text.setText(_translate("MainWindow", "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/REC-html40/strict.dtd\">\n"
        "<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/css\">\n"
        "p, li { white-space: pre-wrap; }\n"
        "</style></head><body style=\" font-family:\'Oswald\'; font-size:9pt; font-weight:400; font-style:normal;line-height:75%\">\n"
        "<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">\n"
        "Lorem Ipsum is simply dummy text of the printing and<br>\n"
        "typesetting industry. Lorem Ipsum has been the industry\'s<br>\n"
        "standard dummy text ever since the 1500s, when an unknown<br>\n"
        "printer took a galley of type and scrambled it to make a type specimen book.</p></body></html>"))
        self.enter_proxy_text.setText(_translate("MainWindow", "Enter proxy IP\'s to check:"))
        self.enter_proxy_detailed_text.setText(_translate("MainWindow", "Enter one IP per line. (Format: USER:PASS:IP:PORT)"))
        self.button_stop_threads.setText(_translate("MainWindow", "STOP"))
        self.clear_button.setText(_translate("MainWindow", "CLEAR"))
        self.main_heading.setText(_translate("MainWindow", "IP PROXY TESTER"))
        self.web_button.setText(_translate("MainWindow", "VISIT WWW.IPROYAL.COM"))
        self.web_address_text.setText(_translate("MainWindow", "Web address to check proxy against:"))
        self.button_start_threads.setText(_translate("MainWindow", "TEXT PROXY IP\'S!"))
        self.import_button.setText(_translate("MainWindow", "IMPORT"))
        self.proxy_output_text.setText(_translate("MainWindow", "Checked IP’s:"))

    def start_threads(self):
        #self.log.append('starting {} threads'.format(self.NUM_THREADS))
        self.button_start_threads.setDisabled(True)
        self.button_stop_threads.setEnabled(True)
        #self.log.append(self.log.toPlainText())

        self.__workers_done = 0
        self.__threads = []
        for idx in range(self.NUM_THREADS):
            worker = Worker(idx)
            thread = QThread()
            thread.setObjectName('thread_' + str(idx))
            self.__threads.append((thread, worker))  # need to store worker too otherwise will be gc'd
            worker.moveToThread(thread)

            # get progress messages from worker:
            worker.sig_step.connect(self.on_worker_step)
            worker.sig_done.connect(self.on_worker_done)
            #worker.sig_msg.connect(self.log.append)

            # control worker:
            self.sig_abort_workers.connect(worker.abort)

            # get read to start worker:
            # self.sig_start.connect(worker.work)  # needed due to PyCharm debugger bug (!); comment out next line
            thread.started.connect(worker.work)
            thread.start()  # this will emit 'started' and start thread's event loop

        # self.sig_start.emit()  # needed due to PyCharm debugger bug (!)

    #def get_proxy_list(self):
        #self.proxy_list = self.proxy_input

    @pyqtSlot(int, str)
    def on_worker_step(self, worker_id: int, data: str):
        #self.log.append('Worker #{}: {}'.format(worker_id, data))
        self.progress.append('{}: {}'.format(worker_id, data))


    @pyqtSlot(int)
    def on_worker_done(self, worker_id):
        #self.log.append('worker #{} done'.format(worker_id))
        self.progress.append('-- Worker {} DONE'.format(worker_id))
        self.__workers_done += 1
        if self.__workers_done == self.NUM_THREADS:
            #self.log.append('No more workers active')
            self.button_start_threads.setEnabled(True)
            self.button_stop_threads.setDisabled(True)
            # self.__threads = None

    @pyqtSlot()
    def abort_workers(self):
        self.sig_abort_workers.emit()
        #self.log.append('Asking each worker to abort')
        for thread, worker in self.__threads:  # note nice unpacking by Python, avoids indexing
            thread.quit()  # this will quit **as soon as thread event loop unblocks**
            thread.wait()  # <- so you need to wait for it to *actually* quit

        # even though threads have exited, there may still be messages on the main thread's
        # queue (messages that threads emitted before the abort):
        #self.log.append('All threads exited')
    

if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = MyWidget()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())
Editor is loading...