-
Notifications
You must be signed in to change notification settings - Fork 3
/
pyPr0xyChecker.py
204 lines (164 loc) · 6.84 KB
/
pyPr0xyChecker.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
'''
pyPr0xyChecker
a fast python proxy checker
made by github.com/n0nexist
'''
import threading # for multithreading
import requests # to make http requests
import argparse # to parse command-line arguments
from pystyle import Colors, Colorate # to print colored text
import time
import os
import signal
import sys
from colorama import Fore, Back, Style
from colorama import init # to print the colored status bar
init()
class logging:
'''
Functions for
loggin errors and informations
'''
def info(text):
print(Colorate.Horizontal(Colors.blue_to_cyan, f"🔹 {text}", 1))
def error(text):
print(Colorate.Horizontal(Colors.blue_to_red, f"❌ {text}", 1))
def printProgressBar(iteration, total, prefix = '', suffix = '', decimals = 1, length = 100, fill = '█'):
'''
Taken (and modified) from:
https://stackoverflow.com/questions/3173320/text-progress-bar-in-terminal-with-block-characters/13685020
(the only function in this code that isn't mine)
'''
percent = ("{0:." + str(decimals) + "f}").format(100 * (iteration / float(total)))
filledLength = int(length * iteration // total)
bar = fill * filledLength + '-' * (length - filledLength)
print(f'\r {Fore.BLUE}{prefix}{Fore.CYAN} |{Fore.BLUE}{bar}{Fore.CYAN}|{Fore.BLUE} {percent}%{Fore.CYAN} {suffix}{Fore.RESET}',end="\r")
if iteration == total:
print()
# Arguments
parser = argparse.ArgumentParser(
prog = 'pyPr0xyChecker',
description = 'a fast python proxy checker',
epilog = 'www.github.com/n0nexist')
parser.add_argument('-t', '--threads',
help="The number of threads the program will use. (default=25)")
parser.add_argument('-i', '--input',
help="The input file to check proxies from.")
parser.add_argument('-o', '--output',
help="The output file to save the results in.")
parser.add_argument('-pt', '--type',
help="Proxies type, http/socks4/socks5. (default=http)")
parser.add_argument('-v', '--verbose',
action='store_true',
help="Shows errors. (default=False)")
args = vars(parser.parse_args())
arg_threads = args['threads']
arg_input = args['input']
arg_output = args['output']
arg_type = args['type']
arg_verbose = args['verbose']
if arg_threads == None:
arg_threads = 25
if arg_type == None:
arg_type = "http"
if arg_input == None or arg_output == None:
parser.print_help()
logging.error("You must at least provide --input and --output arguments.")
exit()
class proxies:
'''
All the functions this program needs
to work with proxies
'''
def checkproxy(proxy,proxytype,f):
'''
Checks if a proxy is working and it's delay
when making a request to ifconfig.me/ip.
Valid proxy types:
http, socks4, socks5
'''
try:
start = time.perf_counter()
# makes a request with the selected proxy to
# this website, which tells the visitor their ip address
response = requests.get("http://www.ifconfig.me/ip", proxies={'http': f'{proxytype}://{proxy}'})
request_time = time.perf_counter() - start # calculate how much milliseconds have passed
request_time = str(request_time)[:3] # limits this string by the first 3 characters
# writes proxy's info on the output file
valid = proxy.startswith(response.text)
content = f"Proxy({proxytype}): {proxy} - Working: {valid} - Delay(seconds): {request_time}\n"
except requests.exceptions.ProxyError: # if we get this error, the proxy doesen't work at all
pass
except ValueError as e: # we probably already closed the file, hence we're done with the task of checking
if "operation on closed file" in str(e):
exit()
except Exception as e:
if arg_verbose:
logging.error(str(e))
pass
def load_list(path,proxytype,threads,output):
'''
Loads the proxy lists
and divides (in threads)
the task to complete, which
is checking every proxy's delay
'''
try:
f = open(path,"r") # opens the file
logging.info("loading proxy list..")
content = f.readlines() # saves the lines in a list inside of this variable
f.close() # closes the file
logging.info("proxy list loaded")
# starts checking the proxies
logging.info("checking proxies..")
f = open(output,"a")
l = len(content)
print("")
logging.printProgressBar(0, l, prefix = 'Progress:', suffix = 'Complete', length = 50) # creates the progress bar
for x in range(l):
proxy = content[x].strip() # .strip() removes any newline from the string
logging.printProgressBar(x, l-1, prefix = 'Progress:', suffix = 'Complete', length = 50) # updates the progress bar
threading.Thread(target=proxies.checkproxy,args=(proxy, proxytype, f)).start()
f.close()
except Exception as e:
logging.error(str(e)) # if there's an error, print it
class main:
'''
The main functions of the program
'''
def cls():
'''
Clears the screen
(working for windows and linux)
'''
os.system("cls" if os.name=="nt" else "clear")
def logo():
'''
Returns the program's ascii logo
'''
return """
┌─┐┬ ┬
├─┘└┬┘
┴ ┴
╔═╗┬─┐─┐ ┬┬ ┬
╠═╝├┬┘┌┴┬┘└┬┘
╩ ┴└─┴ └─ ┴
╔═╗┬ ┬┌─┐┌─┐┬┌─┌─┐┬─┐
║ ├─┤├┤ │ ├┴┐├┤ ├┬┘
╚═╝┴ ┴└─┘└─┘┴ ┴└─┘┴└─
> Fast python proxy checker by github.com/n0nexist
"""
def main():
'''
Prints the logo and processes system arguments
'''
main.cls()
print(Colorate.Diagonal(Colors.blue_to_cyan, main.logo(), 1))
logging.info(f"threads > {arg_threads}")
logging.info(f"input file > {arg_input}")
logging.info(f"output file > {arg_output}")
logging.info(f"proxy type > {arg_type}")
logging.info(f"verbosity > {arg_verbose}")
print("")
proxies.load_list(arg_input,arg_type,int(arg_threads),arg_output)
main.main()