Wpp1State.py
11.1 KB
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
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
import requests, json, config, datetime, smtplib
class StatePhoneWs():
"""Esta clase consulta el estado de los telefonos y los cachea
la consulta tiene 30 segundos de valides, para mejorar la perfrmance"""
def __init__(self):
self.Consultas = {}#{telefono:{"hora": datetime.datetime.now, "estado": self.chequear_stado_WB(telefono)},}
def chequear_stado_WB(self, telefono):
if not len(telefono) == 13:
return({'error': 'Mal cargado el numero de telefono'})
consulta = """{}{}?token={}""".format(config.WS_Status,
telefono, config.WS_token)
r = requests.get(consulta)
j = r.json()
return(j)
def Suspensor(self, data, telefono):
"""Envia a señal al server de chrome para levantar el navegador"""
url = data['chrome_service']
if url in [False,None,""," ","none","None"]:
if not telefono in config.WsClientesBrowser.keys():
return()#Si no tengo el telefono en la lista salgo
url = config.WsClientesBrowser[telefono]
try:
print("#")
r = requests.get(url)
print(r.text)
print("#")
except Exception as E:
print(E)
print(url)
def ChequearTelefono(self, telefono,data=False):
"""Chequea estado es el server remoto si esta conectado se almasena la
respuesta en cache durante 60 segundos para mejorar performance y si no esta
disponible no se almasena y la proxima respuesta debera hacerse contra el server
remoto para asegurarme de q se solucione el problema"""
if data:
self.Suspensor(data,telefono)
test = self.revisarCache(telefono)
if telefono in config.WsClientesBrowser.keys() and data == False:
print("salto prueba de telefono defecto queda en cola pero lanzador de inicio de browser")
self.Suspensor({"chrome_service":None},telefono)#Para iniciar el telefono defecto
return config.resp_defect_int
if not test == False:
return(test)
W = self.chequear_stado_WB(telefono)
if "error" in W.keys():#si hay algun error no actualiso el estado en cache
return(W)
hora = datetime.datetime.now() + datetime.timedelta(seconds=60)
self.Consultas[telefono] = {"hora": hora,
"estado": W}
print("Chequeando telefono saliente 33", W)
return(W)
def revisarCache(self, telefono):
if not telefono in self.Consultas.keys():
return(False)
cel = self.Consultas[telefono]
if datetime.datetime.now() < cel["hora"]:
return(cel["estado"])
return(False)
class StateMail():
"""Esta clase consulta el estado de los mail server y los cachea
la consulta tiene 60 segundos de valides, para mejorar la perfrmance
y la cantidad de mails enviado por dia para no superar el limite de emision"""
def __init__(self):
self.Consultas = {}#{MailUSer-pass-host-str(port):{"hora": datetime.datetime.now, "estado": self.chequear_stado_WB(telefono)},}
self.MailRompedor = []
self.MailsEnviado = {}#"MAIL@HOST": n
self.MailsBloqueados = {}#"MAIL@HOST": datetimeDeDesbloqueo
fecha_actual = datetime.datetime.now()
fecha_formateada = fecha_actual.strftime('%Y-%m-%d')
self.FechaLimpieza = fecha_formateada
print(f"Fecha de inicio {self.FechaLimpieza}")
def LimpiezaDiaria(self):
fecha_actual = datetime.datetime.now()
fecha_formateada = fecha_actual.strftime('%Y-%m-%d')
if not self.FechaLimpieza != fecha_formateada:
return
print(f"Fecha de limpieza de limites {self.FechaLimpieza}")
######Reinicio los contadores
self.FechaLimpieza = fecha_formateada
self.Consultas = {}#{MailUSer-pass-host-str(port):{"hora": datetime.datetime.now, "estado": self.chequear_stado_WB(telefono)},}
self.MailRompedor = []
self.MailsEnviado = {}#"MAIL@HOST": n
self.MailsBloqueados = {}#"MAIL@HOST": datetimeDeDesbloqueo
def ChequearCuentaBlockeadaYEnviar(self, mail, smtphost):
"""Chequeo la cuenta para ver si esta llegando al limite de bloqueo
o si ya paso suficiente tiempo para volver a usarla"""
if False == self.CuentaBloqueada(mail):
return(False)
limite = self.MailEnviado(mail, smtphost)
if limite == False:
self.BloquearCuenta(mail)
return(limite)
def BloquearCuenta(self, mail):
"""Bloquea cuenta por un dia"""
tiempo = datetime.datetime.now() + datetime.timedelta(days=1)
self.MailsBloqueados[mail] = tiempo
self.MailsEnviado[mail] = []
return(True)
def CuentaBloqueada(self, mail):
"""si la cuenta esta bloqueada devuelve False
sino True.
Si esta bloqueada y paso el dia la desbloquea y devuelve True"""
try:
Fecha = self.MailsBloqueados[mail]
except:
return(True)#Si no esta en la lissta de bloqueados devuelvo True
if Fecha < datetime.datetime.now():#si paso el dia
self.MailsBloqueados.pop(mail, None)#Remuevo el mail de los bloqueados
return(True)
return(False)
def MailEnviado(self, mail, smtphost):
habilitado = True
if self._sumarMail(mail) > self.ArmarListadoLimitesHost(smtphost):
habilitado = False
return(habilitado)
def _sumarMail(self, mail):
"""Se agrega al dicionario si no existe si existe se le agrega
devuelve el resultado"""
try:
self.MailsEnviado[mail].append(datetime.datetime.now())
except:
self.MailsEnviado[mail] = []
self.MailsEnviado[mail].append(datetime.datetime.now())
#print("linea 94", self.MailsEnviado[mail])
LOG = []
for MAIL in self.MailsEnviado[mail]:
#print("linea 97", MAIL)
#print("linea 98", MAIL, datetime.datetime.now() + datetime.timedelta(days=1))
if MAIL < datetime.datetime.now() + datetime.timedelta(days=1):
LOG.append(MAIL)
self.MailsEnviado[mail] = LOG
#try:
# self.MailsEnviado[mail] = self.MailsEnviado[mail] + 1
#except:
# self.MailsEnviado[mail] = 0
resultado = len(self.MailsEnviado[mail])
print(resultado)
return(resultado)
def LimpiarListaMailEnviados(self):
self.MailsEnviado = {}
return("True")
def ArmarListadoLimitesHost(self, host):
"""Devuelve la cantidad de mails que se puede enviar diariamente
La lista de donde se toma esta informacion esta en un json
Mira la configuracion"""
try:
n = 200
with open(config.ArchivoLimitesHosts) as json_file:
data = json.load(json_file)
n = data[host]
except:
n = config.LimiteDiario
return(n)
def chequear_stado_Server(self, User, Pass, Port, Host):
try:
self.SMTPcliente(User, Pass, Port, Host)
consulta = True
except:
consulta = False
return(consulta)
def ChequearMailServer(self, User, Pass, Port, Host):
"""Chequea estado es el server remoto si esta conectado se almasena la
respuesta en cache durante 60 segundos para mejorar performance y si no esta
disponible no se almasena y la proxima respuesta debera hacerse contra el server
remoto para asegurarme de q se solucione el problema"""
if Host == "MAILMASIVO":
return(True)
test = self.revisarCache(User, Pass, Port, Host)
if not test == "Vencido":
return(test)
W = self.chequear_stado_Server(User, Pass, Port, Host)
#if False == W:#si hay algun error no actualiso el estado en cache
# return(W)
hora = datetime.datetime.now() + datetime.timedelta(seconds=120)
self.Consultas[self._GenerarKey(User, Pass, Port, Host)] = {"hora": hora,
"estado": W}
print("chequeando servidor de salida", W)
return(W)
def revisarCache(self, User, Pass, Port, Host):
if not self._GenerarKey(User, Pass, Port, Host) in self.Consultas.keys():
return("Vencido")
cache = self.Consultas[self._GenerarKey(User, Pass, Port, Host)]
if datetime.datetime.now() < cache["hora"]:
return(cache["estado"])
return("Vencido")
def _GenerarKey(self, User, Pass, Port, Host):
base = """{}-{}-{}-{}"""
completo = base.format(User, Pass, str(Port), Host)
return(completo)
def SMTPcliente(self, User, Pass, Port, Host):
dg = smtplib.SMTP(host=Host, port=Port, timeout=10)
dg.starttls()
dg.login(User,Pass)
dg.quit()
class AndroidStatus():
"""Esta clase manejara estados de la mensajeria de sms via android
con cache"""
def __init__(self):
self.ESTADOS = {}
self.TOKENs = {}
def obtenerToken(self, email, clave):
try:
ModeloURL = """https://smsgateway24.com/getdata/gettoken?email={}&pass={}"""
url = ModeloURL.format(email, clave)
resp = requests.get(url, timeout=10)
respuesta = resp.json()
except:
respuesta = {"error": 1}
return(respuesta)
def ObtenerToken(self, email, clave):
np = """{}-{}""".format(email, clave)
token = False
if np in self.TOKENs.keys():
if self.TOKENs[np]["hora"] > datetime.datetime.now():
return(self.TOKENs[np]["token"])
else:
self.TOKENs.pop(np, None)
Token = self.obtenerToken(email, clave)
print(Token)
if not Token["error"] == 1:
hora = datetime.datetime.now() + datetime.timedelta(seconds=3600)
self.TOKENs[np] = {"hora": hora, "token": Token["token"]}
token = Token["token"]
return(token)
def EstadoDispositivo(self, email, clave, dispositivo):
"""{'online': True, 'error': 0, 'message': 'OK', 'device_id': 2183,
'lastseen': {'date': '2020-08-04 23:15:29.000000', 'timezone_type': 3,
'timezone': 'UTC'}, 'diffseconds': 34, 'title': 'Redmi_Note_7'}"""
token = self.ObtenerToken(email, clave)
Id = token + dispositivo
try:
if self.ESTADOS[Id]["hora"] > datetime.datetime.now():
return(self.ESTADOS[Id]["estado"])
except:
pass
estado = self.estadoDispositivo(token, dispositivo)
if estado["online"] == True:
hora = datetime.datetime.now() + datetime.timedelta(seconds=60)
self.ESTADOS[Id] = {"estado": estado, "hora": hora}
return(estado)
def estadoDispositivo(self, token, dispositivo):
respuesta = {'online': False, "error": True}
if token == False:
return(respuesta)
URL = """https://smsgateway24.com/getdata/getdevicestatus?token={}&device_id={}"""
url = URL.format(token, dispositivo)
try:
resp = requests.get(url, timeout=10)
respuesta = resp.json()
except:
pass
return(respuesta)