app
unknown
python
5 years ago
24 kB
10
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...