swiftshadow 1.0.2__py3-none-any.whl → 1.1.0__py3-none-any.whl
Sign up to get free protection for your applications and to get access to all the features.
- swiftshadow/cache.py +0 -1
- swiftshadow/classes.py +28 -40
- swiftshadow/helpers.py +0 -9
- {swiftshadow-1.0.2.dist-info → swiftshadow-1.1.0.dist-info}/METADATA +1 -1
- swiftshadow-1.1.0.dist-info/RECORD +11 -0
- swiftshadow-1.0.2.dist-info/RECORD +0 -11
- {swiftshadow-1.0.2.dist-info → swiftshadow-1.1.0.dist-info}/LICENSE +0 -0
- {swiftshadow-1.0.2.dist-info → swiftshadow-1.1.0.dist-info}/WHEEL +0 -0
- {swiftshadow-1.0.2.dist-info → swiftshadow-1.1.0.dist-info}/top_level.txt +0 -0
swiftshadow/cache.py
CHANGED
swiftshadow/classes.py
CHANGED
@@ -1,10 +1,17 @@
|
|
1
1
|
from requests import get
|
2
2
|
from random import choice
|
3
3
|
from json import dump, load
|
4
|
-
from swiftshadow.helpers import log
|
5
4
|
from swiftshadow.providers import Proxyscrape, Scrapingant, Providers
|
6
5
|
import swiftshadow.cache as cache
|
7
|
-
import
|
6
|
+
import logging
|
7
|
+
import sys
|
8
|
+
|
9
|
+
logger = logging.getLogger("swiftshadow")
|
10
|
+
logger.setLevel(logging.INFO)
|
11
|
+
logFormat = logging.Formatter("%(asctime)s - %(name)s [%(levelname)s]:%(message)s")
|
12
|
+
streamhandler = logging.StreamHandler(stream=sys.stdout)
|
13
|
+
streamhandler.setFormatter(logFormat)
|
14
|
+
logger.addHandler(streamhandler)
|
8
15
|
|
9
16
|
|
10
17
|
class Proxy:
|
@@ -16,6 +23,8 @@ class Proxy:
|
|
16
23
|
autoRotate: bool = False,
|
17
24
|
cachePeriod: int = 10,
|
18
25
|
cacheFolder: str = "",
|
26
|
+
debug: bool = False,
|
27
|
+
logToFile: bool = False,
|
19
28
|
):
|
20
29
|
"""
|
21
30
|
The one class for everything.
|
@@ -29,6 +38,8 @@ class Proxy:
|
|
29
38
|
autoRotate: Rotates proxy when `Proxy.proxy()` function is called.
|
30
39
|
cachePeriod: Time to cache proxies in minutes.
|
31
40
|
cacheFolder: Folder to store cache file.
|
41
|
+
debug: Sets Log Level to Debug.
|
42
|
+
logToFile: Whether to pipe log to a log file. If cacheFolder is set log file is saved there.
|
32
43
|
|
33
44
|
Returns:
|
34
45
|
proxyClass (swiftshadow.Proxy): `swiftshadow.Proxy` class instance
|
@@ -51,7 +62,16 @@ class Proxy:
|
|
51
62
|
self.cacheFilePath = ".swiftshadow.json"
|
52
63
|
else:
|
53
64
|
self.cacheFilePath = f"{cacheFolder}/.swiftshadow.json"
|
54
|
-
|
65
|
+
if debug:
|
66
|
+
logger.setLevel(logging.DEBUG)
|
67
|
+
if logToFile:
|
68
|
+
if cacheFolder == "":
|
69
|
+
logFilePath = "swiftshadow.log"
|
70
|
+
else:
|
71
|
+
logFilePath = f"{cacheFolder}/swiftshadow.log"
|
72
|
+
fileHandler = logging.FileHandler(logFilePath)
|
73
|
+
fileHandler.setFormatter(logFormat)
|
74
|
+
logger.addHandler(fileHandler)
|
55
75
|
self.update()
|
56
76
|
|
57
77
|
def checkIp(self, ip, cc, protocol):
|
@@ -75,8 +95,7 @@ class Proxy:
|
|
75
95
|
self.expiry = data[0]
|
76
96
|
expired = cache.checkExpiry(self.expiry)
|
77
97
|
if not expired:
|
78
|
-
|
79
|
-
"info",
|
98
|
+
logger.info(
|
80
99
|
"Loaded proxies from cache",
|
81
100
|
)
|
82
101
|
self.proxies = data[1]
|
@@ -84,12 +103,11 @@ class Proxy:
|
|
84
103
|
self.current = self.proxies[0]
|
85
104
|
return
|
86
105
|
else:
|
87
|
-
|
88
|
-
"
|
89
|
-
"Cache expired. Updating cache...",
|
106
|
+
logger.info(
|
107
|
+
"Cache expired. Updating cache.",
|
90
108
|
)
|
91
109
|
except FileNotFoundError:
|
92
|
-
|
110
|
+
logger.info("No cache found. Cache will be created after update")
|
93
111
|
|
94
112
|
self.proxies = []
|
95
113
|
self.proxies.extend(Proxyscrape(self.maxProxies, self.countries, self.protocol))
|
@@ -98,8 +116,7 @@ class Proxy:
|
|
98
116
|
Scrapingant(self.maxProxies, self.countries, self.protocol)
|
99
117
|
)
|
100
118
|
if len(self.proxies) == 0:
|
101
|
-
|
102
|
-
"warning",
|
119
|
+
logger.warning(
|
103
120
|
"No proxies found for current settings. To prevent runtime error updating the proxy list again.",
|
104
121
|
)
|
105
122
|
self.update()
|
@@ -134,32 +151,3 @@ class Proxy:
|
|
134
151
|
return choice(self.proxies)
|
135
152
|
else:
|
136
153
|
return self.current
|
137
|
-
|
138
|
-
|
139
|
-
class ProxyChains:
|
140
|
-
def __init__(
|
141
|
-
self, countries: list = [], protocol: str = "http", maxProxies: int = 10
|
142
|
-
):
|
143
|
-
self.countries = [i.upper() for i in countries]
|
144
|
-
self.protocol = protocol
|
145
|
-
self.maxProxies = maxProxies
|
146
|
-
self.update()
|
147
|
-
|
148
|
-
def update(self):
|
149
|
-
proxies = []
|
150
|
-
for provider in Providers:
|
151
|
-
print(len(proxies))
|
152
|
-
if len(proxies) == self.maxProxies:
|
153
|
-
break
|
154
|
-
log("INFO", f"{provider}")
|
155
|
-
for proxyDict in provider(self.maxProxies, self.countries, self.protocol):
|
156
|
-
proxyRaw = list(proxyDict.items())[0]
|
157
|
-
proxy = f'{proxyRaw[0]} {proxyRaw[1].replace(":"," ")}'
|
158
|
-
proxies.append(proxy)
|
159
|
-
proxies = "\n".join(proxies)
|
160
|
-
configFileName = "swiftshadow-proxychains.conf"
|
161
|
-
config = f"random_chain\nchain_len=1\nproxy_dns\n[ProxyList]\n{proxies}"
|
162
|
-
with open(configFileName, "w") as file:
|
163
|
-
file.write(config)
|
164
|
-
cmd = f"proxychains -f {os.path.abspath(configFileName)}"
|
165
|
-
os.system(cmd)
|
swiftshadow/helpers.py
CHANGED
@@ -1,6 +1,5 @@
|
|
1
1
|
from swiftshadow.constants import CountryCodes
|
2
2
|
from requests import get
|
3
|
-
from datetime import datetime
|
4
3
|
|
5
4
|
|
6
5
|
def getCountryCode(countryName):
|
@@ -23,12 +22,4 @@ def checkProxy(proxy, countries):
|
|
23
22
|
return True
|
24
23
|
return False
|
25
24
|
except Exception as e:
|
26
|
-
# log('error',str(e))
|
27
25
|
return False
|
28
|
-
|
29
|
-
|
30
|
-
def log(level, message):
|
31
|
-
level = level.upper()
|
32
|
-
print(
|
33
|
-
f'{datetime.now().strftime("%d/%m/%Y %H:%M:%S")} - [swiftshadow] - {level} : {message}'
|
34
|
-
)
|
@@ -0,0 +1,11 @@
|
|
1
|
+
swiftshadow/__init__.py,sha256=cybIN6hvkK06k9aeun0YhhuUSZiEcIr6jdOne2WFWlA,604
|
2
|
+
swiftshadow/cache.py,sha256=tNj07m0Ii_r0wLu9NKTYxOyS8uYeC7BbgFdMnuLqK7Y,411
|
3
|
+
swiftshadow/classes.py,sha256=V2ry_xqCQtBKgV2tBRxtQET4kLvikxQCVyUmzp8fGGg,5505
|
4
|
+
swiftshadow/constants.py,sha256=FRhoYg8WNaLy8RLDD4BsANlXlY2tctBCdy7sCnkaVY0,6303
|
5
|
+
swiftshadow/helpers.py,sha256=HHZmaBU4qZjypn30jQ5TXHqy8xhr46tSmV9qBdZeBpw,691
|
6
|
+
swiftshadow/providers.py,sha256=GaVKg5J5hH2HSfdGDPuFivcCu6QB5HFjlVFvrrtNdhw,1490
|
7
|
+
swiftshadow-1.1.0.dist-info/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
|
8
|
+
swiftshadow-1.1.0.dist-info/METADATA,sha256=BcaplWtegmLscWt__ciZ2y3dUE5hoWRoB_jJTX-lHlk,2635
|
9
|
+
swiftshadow-1.1.0.dist-info/WHEEL,sha256=oiQVh_5PnQM0E3gPdiz09WCNmwiHDMaGer_elqB3coM,92
|
10
|
+
swiftshadow-1.1.0.dist-info/top_level.txt,sha256=GClzVDF5vWSzqHOwgG2ycQAAJXRxd-QOdP1h3YrHOuM,12
|
11
|
+
swiftshadow-1.1.0.dist-info/RECORD,,
|
@@ -1,11 +0,0 @@
|
|
1
|
-
swiftshadow/__init__.py,sha256=cybIN6hvkK06k9aeun0YhhuUSZiEcIr6jdOne2WFWlA,604
|
2
|
-
swiftshadow/cache.py,sha256=2bQo7WqeyAMJkfLj4wRX5fPatZPaiaLVcn2gm_pzBFg,434
|
3
|
-
swiftshadow/classes.py,sha256=WSSZFwfRWuF2r0X0fb-J4IigmZkxox5EOr8uQQr0SWM,5773
|
4
|
-
swiftshadow/constants.py,sha256=FRhoYg8WNaLy8RLDD4BsANlXlY2tctBCdy7sCnkaVY0,6303
|
5
|
-
swiftshadow/helpers.py,sha256=C3iekcwN3ni4pFx0rV7EPYPqDglHCHMTtbWMPNNnOX8,917
|
6
|
-
swiftshadow/providers.py,sha256=GaVKg5J5hH2HSfdGDPuFivcCu6QB5HFjlVFvrrtNdhw,1490
|
7
|
-
swiftshadow-1.0.2.dist-info/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
|
8
|
-
swiftshadow-1.0.2.dist-info/METADATA,sha256=zSImGEjSvlwxYj_h11atv5iHNaaZ25Eog50ft4ClcNo,2635
|
9
|
-
swiftshadow-1.0.2.dist-info/WHEEL,sha256=oiQVh_5PnQM0E3gPdiz09WCNmwiHDMaGer_elqB3coM,92
|
10
|
-
swiftshadow-1.0.2.dist-info/top_level.txt,sha256=GClzVDF5vWSzqHOwgG2ycQAAJXRxd-QOdP1h3YrHOuM,12
|
11
|
-
swiftshadow-1.0.2.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|