596 lines
31 KiB
Python
596 lines
31 KiB
Python
# uncompyle6 version 3.4.0
|
|
# Python bytecode 2.7
|
|
# Decompiled from: Python 2.7.16 (default, Jul 9 2019, 16:43:02)
|
|
# [GCC 8.3.0]
|
|
# Embedded file name: <string>
|
|
"""
|
|
Realiza funciones de ocultaci\xc3\xb3n de la url de las web de destino listadas, para bordear los bloqueos judiciales o de las operadoras. Se pretende que este proceso sea lo m\xc3\xa1s autom\xc3\xa1tico y transparente para los canales en lo posible.
|
|
|
|
Existen dos tipos de proxies gratuitos:
|
|
- Proxy Web
|
|
- Proxy \xe2\x80\x9cdirecto\xe2\x80\x9d. Dentro de este grupo hay direcciones que soportar CloudFlare.
|
|
|
|
En el Proxy Web, se llama a una web Proxy donde se le pasa como Post la url de la web de destino, as\xc3\xad como los par\xc3\xa1metros que indican que NO encripte la url o los datos, y que s\xc3\xad use cookies.
|
|
|
|
En los datos de respuesta hay que suprimir de las urls una cabecera y una cola, que var\xc3\xadan seg\xc3\xban la web Proxy. El resultado es una p\xc3\xa1gina bastante parecida a la que se obtendr\xc3\xada sin usar el proxy, aunque en el canal que lo use se debe verificar que las expresiones regex funcionan sin problemas.
|
|
|
|
El Proxy Web parece m\xc3\xa1s estable y r\xc3\xa1pido, pero tiene el inconveniente que no se vale webs que usen Cloudflare.
|
|
|
|
Se ha creado un Diccionario con las entradas verificadas de Proxy Webs. En esas entradas se encuentran los par\xc3\xa1metros necesarios para enviar la url de la web de destino, as\xc3\xad como para convertir los datos de retorno a algo transparente para el canal. Habr\xc3\xa1 que ir a\xc3\xb1adiendo y borrando Webs Proxy seg\xc3\xban su rendimiento y estabilidad.
|
|
|
|
El Proxy \xe2\x80\x9cdirecto\xe2\x80\x9d, es totalmente transparente para el canal, permitiendo usar Post, y en algunos casos llamadas a webs que usan Cloudflare. El problema que tienen estos Proxies es su extremada volatilidad en la disponibilidad y tiempo de respuesta.
|
|
|
|
Se ha confeccionado una lista inicial de Proxies directos y otra de Proxies CloudFlare, principalmente de Singapur y Hong Kong, que han sido probados y que suelen funcionar con regularidad. A esta lista inicial se a\xc3\xb1aden din\xc3\xa1micamente otros de web(s) que listan estos proxy gratuitos, con algunos criterios de b\xc3\xbasqueda exigentes de disponibilidad y tiempo de respuesta.
|
|
|
|
Se ha optado por usar por defecto los Proxies \xe2\x80\x9cdirectos\xe2\x80\x9d, dejando los Proxy Webs como alternativa autom\xc3\xa1tica para el caso de indisponibilidad de Proxies \xe2\x80\x9cdirectos\xe2\x80\x9d.
|
|
|
|
Desde cualquier Canal se pueden hacer llamadas a Httptools para que sean filtradas por alg\xc3\xban tipo de Proxy. Las llamadas deben incluir los par\xc3\xa1metros "proxy=True o proxy_web=True" y "forced_proxy=Total|ProxyDirect|ProxyCF|ProxyWeb". Con la opci\xc3\xb3n "Total" asumir\xc3\xa1 "ProxyDirect" para "proxy=True"
|
|
|
|
TABLAS:
|
|
Como va a ser un m\xc3\xb3dulo de mucho uso, se ha organizado con tablas en memoria en vez de en archivos .json, para minimizar el impacto en el rendimiento. Por otra parte, es recomendable que este .py (y por tanto sus tablas) est\xc3\xa9 \xe2\x80\x9cencoded\xe2\x80\x9d o mejor encriptado para evitar que las acciones y direcciones que aqu\xc3\xad se describen sean f\xc3\xa1cilmente neutralizables.
|
|
|
|
- l111ll = lista de webs bloqueadas a ser tratadas por Proxytools. Tiene lista de bloqueos geogr\xc3\xa1fica.
|
|
- l1l1ll = lista de Proxies \xe2\x80\x9cdirectos\xe2\x80\x9d iniciales, verificados tanto para http como para https
|
|
- l111l1 = lista de Proxies \xe2\x80\x9cdirectos CloodFlare\xe2\x80\x9d iniciales, verificados
|
|
- ll11ll = lista de Proxy Webs, con sus par\xc3\xa1metros de uso
|
|
- l11111 = lista de webs bloqueadas donde se dice con qu\xc3\xa9 tipo de proxy especifico se quiere tratar. Si la web bloqueada no est\xc3\xa1 en esta lista, se trata con los proxies por defecto.
|
|
|
|
M\xc3\x89TODOS:
|
|
- get_proxy_list_monitor: es un SERVICIO que se lanza al inicio de Alfa. Si en los settings se ha especificado que el uso de "Acceso Alternativo a la Web" est\xc3\xa1 desactivado, se activa el "Modo Demanda" usando las direciones de Proxies por defecto. Si est\xc3\xa1 activo, se asume el "Modo Forzado" y se ejecutar\xc3\xa1 peri\xc3\xb3dicamente (cada 12 horas), siempre que no haya reporducciones activas. Este servicio realiza las siguiente funciones:
|
|
o Identifica el pa\xc3\xads del usuario y activa/desactiva el proxy en cada web bloquedad seg\xc3\xban la lista paises bloqueados
|
|
o Aleatoriza las listas iniciales de direcciones proxy
|
|
o Si no hay bloqueos en la zona geogr\xc3\xa1fica del usuario, abandona
|
|
- Si estamos en "Modo Forzado", llama al m\xc3\xa9todo get_proxy_list_method, que realiza estas tareas de inicilaizaci\xc3\xb3n de tablas:
|
|
o Carga la lista inicial de Proxies \xe2\x80\x9cdirectos\xe2\x80\x9d y los aleatoriza
|
|
o De la web \xe2\x80\x9cHideMy.name\xe2\x80\x9d obtiene una lista adicional de Proxies \xe2\x80\x9cdirectos\xe2\x80\x9d
|
|
o Usando la web bloqueada \xe2\x80\x9cmejortorrent.com\xe2\x80\x9d, se validan los Proxies \xe2\x80\x9cdirectos\xe2\x80\x9d hasta que se encuentra uno que responde correctamente. Este proxy encontrado pasa a ser el usado por defecto durante este periodo
|
|
o Similar a Proxies \xe2\x80\x9cdirectos\xe2\x80\x9d, de la lista inicial se aleatoriza y se verifica uno que funcione
|
|
o Se valida la lista de Proxy Webs hasta que se encuentra una que responda correctamente. Esta Proxy Web encontrada pasa a ser la usada por defecto durante este periodo. Es preferible utilizar "Hide.me" por su reputaci\xc3\xb3n y porque soporta bien las llamadas con POST desde el canal. Si no estuviera disponoble, te tomar\xc3\xada otra, pero las llamadas con POST se realizar\xc3\xadan por "ProxyDirect"
|
|
o En la \xe2\x80\x9cwhitelist\xe2\x80\x9d se analiza si hay m\xc3\xa1s de una Proxy alternativo por web bloqueada. Si es as\xc3\xad, se aleatorizan las entradas y se escoge una para este periodo
|
|
o Los datos de Proxy \xe2\x80\x9cdirecto\xe2\x80\x9d activo, lista de Proxies \xe2\x80\x9cdirectos\xe2\x80\x9d, nombre de Proxy Web activo, y Proxy \xe2\x80\x9cwhitelist\xe2\x80\x9d en uso se guardan como par\xc3\xa1metros en \xe2\x80\x9csettings.xml, encoded Base64\xe2\x80\x9d, aunque est\xc3\xa1 preparado para encriptarlo con un nivel de seguridad m\xc3\xa1s alto.
|
|
- randomize_lists: aleatoriza las listas iniciales de direcciones proxy
|
|
- set_proxy_web: prepara los par\xc3\xa1metros para llamar a un Proxy Web
|
|
- restore_after_proxy_web: retira los datos del Proxy Web de la respuesta, para hacerlo transparente al canal
|
|
- channel_proxy_list: verifica si la web de la url est\xc3\xa1 bloqueada en esa geolocalizaci\xc3\xb3n
|
|
- get_proxy_addr: pasa los datos del Proxy \xe2\x80\x9cdirecto\xe2\x80\x9d, Proxy \xe2\x80\x9cCloudFlare\xe2\x80\x9d y Proxy Web por defecto, modificados con los valores de la \xe2\x80\x9cwhitelist\xe2\x80\x9d, si los hay
|
|
- encrypt_proxy: codifica en Base64 los datos pasados, con potencial para encriptaci\xc3\xb3n
|
|
- decrypt_proxy: decodifica desde Base64 los datos pasados
|
|
"""
|
|
import urllib, base64, re, time, threading, traceback, ast, random, Queue
|
|
from platformcode import config, logger, platformtools
|
|
from platformcode.logger import WebErrorException
|
|
import scrapertools
|
|
debugging = False
|
|
l111ll = {'www.mejortorrent.com': 'ES,PO', 'www.mejortorrent.org': 'ES', 'www.mejortorrent.net': 'ES', 'gnula.nu': 'ES', 'gnula.se': 'ES', 'www.elitetorrent.biz': 'ES', 'mejortorrent1.net': 'ES'}
|
|
l1l1ll = [
|
|
'68.183.183.44:1111', '119.28.31.29:8888', '157.230.45.121:1111', '128.199.152.169:31330', '90.145.221.186:80', '157.230.33.37:1111', '178.128.103.3:31330', '104.248.154.97:1111', '157.230.34.190:1111', '128.199.156.37:31330', '128.199.138.136:31330', '111.223.75.178:8080', '128.199.132.128:31330', '128.199.136.197:31330', '128.199.155.182:31330', '128.199.147.208:31330', '128.199.144.174:31330', '128.199.148.45:31330', '128.199.168.132:31330', '178.128.63.155:31330', '52.163.207.100:3128', '103.42.213.177:8080', '103.42.213.176:8080', '13.70.24.15:80', '150.109.55.190:83', '159.138.1.185:80', '218.102.119.7:8380', '218.102.119.7:8383', '218.102.119.7:8382', '47.90.50.17:80', '218.102.119.7:8385', '218.102.119.7:8197', '59.149.60.209:8380', '113.252.222.73:8380', '210.0.128.58:8080']
|
|
l111l1 = [
|
|
'68.183.183.44:1111', '128.199.156.37:31330', '119.28.31.29:8888', '93.88.75.31:8080', '104.248.154.97:1111', '90.145.221.186:80', '157.230.34.190:1111', '128.199.132.128:31330', '128.199.138.136:31330', '128.199.136.197:31330', '128.199.144.174:31330', '128.199.148.45:31330', '128.199.155.182:31330', '128.199.204.6:31330', '13.229.66.154:80', '139.99.6.142:3128', '159.65.1.26:80', '52.163.207.100:3128', '54.254.198.71:80', '13.70.24.15:80']
|
|
ll11ll = {'hide.me': ('https://nl.hideproxy.me/includes/process.php?action=update', 'https://nl.hideproxy.me',
|
|
'', '/go.php?u=', '&b=4|&b=4', 'u=%s&proxy_formdata_server=nl&allowCookies=1&encodeURL=0'),
|
|
'webproxy.to': ('http://webproxy.to/includes/process.php?action=update', 'http://webproxy.to', '',
|
|
'/browse.php?u=', '&b=4|&b=4', 'u=%s&encodeURL=0&encodePage=0&allowCookies=on&stripJS=0&stripObjects=0')}
|
|
ll1111 = 'hide.me'
|
|
l11111 = {'gnula.nu': 'ProxyCF', 'www.mejortorrent.com': 'ProxyWeb:hide.me', 'www.mejortorrent.org': 'ProxyWeb:hide.me,webproxy.to', 'mejortorrent1.net': 'ProxyWeb'}
|
|
|
|
def get_proxy_list():
|
|
|
|
def get_proxy_list_monitor(test=False, debugging=debugging):
|
|
import httptools, os
|
|
alfa_s = True
|
|
try:
|
|
if not config.get_setting('proxy_addr'):
|
|
if debugging:
|
|
logger.error('NO proxy_addr')
|
|
randomize_lists()
|
|
except:
|
|
if debugging:
|
|
logger.error('NO proxy_addr')
|
|
randomize_lists()
|
|
|
|
if os.path.exists(os.path.join(config.get_runtime_path(), 'channels', 'custom.py')):
|
|
proxy_dev = 'dev'
|
|
alfa_s = False
|
|
else:
|
|
proxy_dev = 'user'
|
|
if debugging:
|
|
alfa_s = False
|
|
config.set_setting('proxy_dev', encrypt_proxy(proxy_dev))
|
|
proxy_geoloc = 'https://geoip-db.com/json/'
|
|
country_code = 'ES'
|
|
proxy_channel_bloqued = l111ll.copy()
|
|
try:
|
|
data = ''
|
|
data = httptools.downloadpage(proxy_geoloc, proxy=False, proxy_web=False, timeout=10, random_headers=True, alfa_s=alfa_s).data
|
|
country_code = scrapertools.find_single_match(data, '"country_code":"([^"]+)"')
|
|
except:
|
|
logger.error(traceback.format_exc())
|
|
country_code = 'ES'
|
|
else:
|
|
if proxy_dev == 'dev' or debugging:
|
|
logger.info('Geoloc: ' + country_code + ' / ' + data)
|
|
proxy_active = False
|
|
for channel, countries in proxy_channel_bloqued.items():
|
|
if country_code in countries or 'ALL' in countries:
|
|
proxy_channel_bloqued.update({channel: 'ON'})
|
|
proxy_active = True
|
|
else:
|
|
proxy_channel_bloqued.update({channel: 'OFF'})
|
|
|
|
if proxy_channel_bloqued:
|
|
config.set_setting('proxy_channel_bloqued', encrypt_proxy(str(proxy_channel_bloqued)))
|
|
else:
|
|
config.set_setting('proxy_channel_bloqued', encrypt_proxy(''))
|
|
if proxy_dev == 'dev' or debugging:
|
|
logger.info('Alternative_web_access: ' + str(config.get_setting('alternative_web_access')) + ' / Proxy Activo: ' + str(proxy_active))
|
|
if proxy_dev == 'dev' or debugging:
|
|
logger_disp(debugging=debugging)
|
|
if not proxy_active:
|
|
randomize_lists()
|
|
return
|
|
if not config.get_setting('alternative_web_access'):
|
|
randomize_lists()
|
|
return
|
|
|
|
if debugging:
|
|
logger.info('Entrando en Monitor :' + str(config.get_setting('alternative_web_access')))
|
|
if config.get_platform(True)['num_version'] >= 14:
|
|
import xbmc
|
|
monitor = xbmc.Monitor()
|
|
else:
|
|
get_proxy_list_method(test=test, debugging=debugging)
|
|
return
|
|
while not monitor.abortRequested():
|
|
if not platformtools.is_playing():
|
|
get_proxy_list_method(test=test, debugging=debugging)
|
|
timer = 43200
|
|
if monitor.waitForAbort(timer):
|
|
break
|
|
|
|
try:
|
|
threading.Thread(target=get_proxy_list_monitor).start()
|
|
time.sleep(5)
|
|
except:
|
|
logger.error(traceback.format_exc())
|
|
|
|
|
|
def randomize_lists():
|
|
proxies = l1l1ll[:]
|
|
random.shuffle(proxies)
|
|
config.set_setting('proxy_addr', encrypt_proxy(str(proxies[0])))
|
|
config.set_setting('proxy_list', encrypt_proxy(str(proxies)))
|
|
proxies = l111l1[:]
|
|
random.shuffle(proxies)
|
|
config.set_setting('proxy_CF_addr', encrypt_proxy(str(proxies[0])))
|
|
config.set_setting('proxy_CF_list', encrypt_proxy(str(proxies)))
|
|
config.set_setting('proxy_web_name', encrypt_proxy('hide.me'))
|
|
proxy_white_list = l11111.copy()
|
|
proxy_table = []
|
|
for label_a, value_a in proxy_white_list.items():
|
|
proxy_t_s = ''
|
|
proxy_t = proxy_white_list[label_a]
|
|
if 'ProxyCF:' in proxy_t:
|
|
proxy_t_s = 'ProxyCF:'
|
|
proxy_t = proxy_t.replace('ProxyCF:', '')
|
|
if 'ProxyWeb:' in proxy_t:
|
|
proxy_t_s = 'ProxyWeb:'
|
|
proxy_t = proxy_t.replace('ProxyWeb:', '')
|
|
proxy_table = proxy_t.split(',')
|
|
if len(proxy_table) > 1:
|
|
random.shuffle(proxy_table)
|
|
if proxy_t_s:
|
|
proxy_table[0] = proxy_t_s + str(proxy_table[0])
|
|
proxy_white_list.update({label_a: proxy_table[0]})
|
|
|
|
config.set_setting('proxy_white_list', encrypt_proxy(str(proxy_white_list)))
|
|
|
|
|
|
def get_proxy_list_method(test=False, proxy_init='Total', debugging=debugging, lote_len=5):
|
|
if debugging:
|
|
logger.info('Test: ' + str(test) + ', Proxy_init: ' + str(proxy_init))
|
|
import httptools
|
|
alfa_s = True
|
|
try:
|
|
proxy_dev = decrypt_proxy(config.get_setting('proxy_dev'))
|
|
except:
|
|
proxy_dev = 'user'
|
|
config.set_setting('proxy_dev', encrypt_proxy(proxy_dev))
|
|
|
|
if proxy_dev == 'dev' or debugging:
|
|
alfa_s = False
|
|
proxies_save = []
|
|
proxy_addr = ''
|
|
proxy_list = []
|
|
proxy_CF_addr = ''
|
|
proxy_CF_list = []
|
|
proxy_web_name = ''
|
|
proxy_url_test = 'http://www.mejortorrent.com/torrents-de-peliculas.html'
|
|
proxy_pattern_test = '<a href="((?:[^"]+)?/peli-descargar-torrent[^"]+)">?'
|
|
proxy_CF_url_test = 'http://gnula.nu/peliculas-online/lista-de-peliculas-online-parte-1/'
|
|
proxy_CF_pattern_test = '<a class="Ntooltip" href="([^"]+)">([^<]+)<span><br[^<]+<img src="([^"]+)"></span></a>(.*?)<br'
|
|
randomize_lists()
|
|
proxies = []
|
|
proxies_str = decrypt_proxy(config.get_setting('proxy_list'))
|
|
proxies = ast.literal_eval(proxies_str)
|
|
proxies_init = proxies[:]
|
|
if proxy_dev == 'dev' or debugging:
|
|
logger.debug('Tabla inicial ProxyDirect: ' + str(proxies))
|
|
if proxy_dev == 'dev' or debugging:
|
|
logger.debug('Tabla inicial ProxyCF: ' + str(decrypt_proxy(config.get_setting('proxy_CF_list'))))
|
|
country_list = [
|
|
'SG', 'HK']
|
|
for country in country_list:
|
|
try:
|
|
data = ''
|
|
data = httptools.downloadpage('https://www.proxy-list.download/api/v1/get?type=https&anon=elite&country=%s' % country, proxy=False, proxy_web=False, proxy_retries=0, count_retries_tot=2, timeout=10, random_headers=True).data
|
|
if data:
|
|
data = re.sub('\\r|\\t| |<br>|\\s{2,}', '', data)
|
|
data = "'" + re.sub('\\n', "', '", data)
|
|
if data.endswith(", '"):
|
|
data = data[:-3]
|
|
matches = []
|
|
matches = ast.literal_eval(data)
|
|
for var_a in matches:
|
|
proxy_a = var_a
|
|
if proxy_a not in proxies:
|
|
proxies.append(proxy_a)
|
|
|
|
except:
|
|
logger.error(traceback.format_exc())
|
|
else:
|
|
if proxy_dev == 'dev' or debugging:
|
|
logger.debug('Tabla proxy-list.download ' + country + ': ' + str(matches))
|
|
|
|
if test:
|
|
try:
|
|
data = ''
|
|
data = httptools.downloadpage('https://hidemyna.me/en/proxy-list/?country=HKNLSG&maxtime=1000&type=s&anon=4#list', proxy=True, proxy_web=False, proxy_retries=1, count_retries_tot=2, timeout=10, random_headers=True, forced_proxy='ProxyCF').data
|
|
except:
|
|
logger.error(traceback.format_exc())
|
|
|
|
if data:
|
|
data = re.sub('\\n|\\r|\\t| |<br>|\\s{2,}', '', data)
|
|
patron = '<td class=tdl>(.*?)<\\/td><td>(.*?)<\\/td>'
|
|
matches = re.compile(patron, re.DOTALL).findall(data)
|
|
for var_a, var_c in matches:
|
|
proxy_a = '%s:%s' % (var_a, var_c)
|
|
if proxy_a not in proxies:
|
|
proxies.append(proxy_a)
|
|
|
|
if proxy_dev == 'dev' or debugging:
|
|
logger.debug('Tabla HideMy.name: ' + str(matches))
|
|
if proxy_dev == 'dev' or debugging:
|
|
logger.debug('Tabla ANTES del testing: ' + str(proxies))
|
|
if proxy_init == 'Total' or proxy_init == 'ProxyDirect':
|
|
if proxy_dev == 'dev' or debugging:
|
|
logger.debug('INIT ProxyDirect: ' + proxy_init)
|
|
threads_list = []
|
|
proxy_que = Queue.Queue()
|
|
for proxy_lote in range(0, len(proxies), lote_len):
|
|
if proxy_addr and not test:
|
|
break
|
|
for proxy_a in proxies[proxy_lote:proxy_lote + lote_len]:
|
|
if proxy_a in proxy_list:
|
|
continue
|
|
try:
|
|
proxy_thread = threading.Thread(target=test_proxy_addr, args=(proxy_a, proxy_url_test, proxy_pattern_test, True, False, 'ProxyDirect', 0, 1, 7, alfa_s, proxy_que, test, debugging))
|
|
proxy_thread.daemon = True
|
|
proxy_thread.start()
|
|
threads_list.append(proxy_thread)
|
|
except:
|
|
logger.error(traceback.format_exc())
|
|
|
|
while [ thread_x for thread_x in threads_list if thread_x.isAlive() ]:
|
|
try:
|
|
proxy_addr = proxy_que.get(True, 1)
|
|
proxy_list.append(proxy_addr)
|
|
config.set_setting('proxy_addr', encrypt_proxy(str(proxy_addr)))
|
|
if not test:
|
|
proxy_list = proxies_init
|
|
break
|
|
except Queue.Empty:
|
|
proxy_addr = ''
|
|
|
|
if not proxy_addr and len(proxy_list) > 0:
|
|
proxy_addr = proxy_list[(-1)]
|
|
if not proxy_addr and proxy_init == 'Total':
|
|
proxy_addr = l1l1ll[0]
|
|
config.set_setting('proxy_addr', encrypt_proxy(str(proxy_addr)))
|
|
config.set_setting('proxy_list', encrypt_proxy(str(proxy_list)))
|
|
if proxy_dev == 'dev' or debugging:
|
|
logger.info('ProxyDirect addr: ' + str(proxy_addr))
|
|
if proxy_init == 'Total' or proxy_init == 'ProxyCF':
|
|
if proxy_dev == 'dev' or debugging:
|
|
logger.debug('INIT ProxyCF: ' + proxy_init)
|
|
proxies_str = decrypt_proxy(config.get_setting('proxy_CF_list'))
|
|
proxies_cf = ast.literal_eval(proxies_str)
|
|
proxies_init = proxies_cf[:]
|
|
if proxy_init == 'Total':
|
|
proxies_cf.extend(proxies)
|
|
else:
|
|
proxies_cf.extend(ast.literal_eval(decrypt_proxy(config.get_setting('proxy_list'))))
|
|
threads_list_CF = []
|
|
proxy_que_CF = Queue.Queue()
|
|
lote_len = 2
|
|
for proxy_lote in range(0, len(proxies_cf), lote_len):
|
|
if proxy_CF_addr and not test:
|
|
break
|
|
for proxy_a in proxies_cf[proxy_lote:proxy_lote + lote_len]:
|
|
if proxy_a in proxy_CF_list:
|
|
continue
|
|
try:
|
|
proxy_thread = threading.Thread(target=test_proxy_addr, args=(proxy_a, proxy_CF_url_test, proxy_CF_pattern_test, True, False, 'ProxyCF', 0, 1, 10, alfa_s, proxy_que_CF, test, debugging))
|
|
proxy_thread.daemon = True
|
|
proxy_thread.start()
|
|
threads_list_CF.append(proxy_thread)
|
|
except:
|
|
logger.error(traceback.format_exc())
|
|
|
|
while [ thread_x for thread_x in threads_list_CF if thread_x.isAlive() ]:
|
|
try:
|
|
proxy_CF_addr = proxy_que_CF.get(True, 1)
|
|
proxy_CF_list.append(proxy_CF_addr)
|
|
config.set_setting('proxy_CF_addr', encrypt_proxy(str(proxy_CF_addr)))
|
|
if not test:
|
|
proxy_CF_list = proxies_init
|
|
break
|
|
except Queue.Empty:
|
|
proxy_CF_addr = ''
|
|
|
|
if not proxy_CF_addr and len(proxy_CF_list) > 0:
|
|
proxy_CF_addr = proxy_CF_list[(-1)]
|
|
if not proxy_CF_addr:
|
|
proxy_CF_addr = l111l1[0]
|
|
config.set_setting('proxy_CF_addr', encrypt_proxy(str(proxy_CF_addr)))
|
|
config.set_setting('proxy_CF_list', encrypt_proxy(str(proxy_CF_list)))
|
|
if proxy_dev == 'dev' or debugging:
|
|
logger.info('ProxyCF addr: ' + str(proxy_CF_addr))
|
|
proxy_table = []
|
|
if proxy_init == 'Total' or proxy_init == 'ProxyWeb':
|
|
if proxy_dev == 'dev' or debugging:
|
|
logger.debug('INIT ProxyWeb: ' + proxy_init)
|
|
for label_a, value_a in ll11ll.items():
|
|
proxy_table.append(label_a)
|
|
|
|
proxy_table = sorted(proxy_table)
|
|
for label_a in proxy_table:
|
|
proxy_web_name = label_a
|
|
config.set_setting('proxy_web_name', encrypt_proxy(str(proxy_web_name)))
|
|
try:
|
|
data = ''
|
|
data = httptools.downloadpage(proxy_url_test, proxy=False, proxy_web=True, forced_proxy='ProxyWeb', proxy_retries=0, count_retries_tot=1, timeout=10, alfa_s=alfa_s).data
|
|
except:
|
|
logger.error(traceback.format_exc())
|
|
proxy_web_name = ''
|
|
continue
|
|
else:
|
|
if data:
|
|
data = re.sub('\\n|\\r|\\t| |<br>|\\s{2,}', '', data)
|
|
data_test = scrapertools.find_single_match(data, proxy_pattern_test)
|
|
if not data_test:
|
|
if proxy_dev == 'dev' or debugging:
|
|
logger.error('ProxyWeb error: ' + proxy_web_name)
|
|
proxy_web_name = ''
|
|
continue
|
|
elif not test:
|
|
break
|
|
else:
|
|
proxy_web_name = ''
|
|
|
|
if not proxy_web_name and proxy_init == 'Total':
|
|
config.set_setting('proxy_web_name', encrypt_proxy('hide.me'))
|
|
elif not proxy_web_name and proxy_init != 'Total':
|
|
config.set_setting('proxy_web_name', encrypt_proxy(''))
|
|
logger_disp(debugging=debugging)
|
|
|
|
|
|
def test_proxy_addr(proxy_addr, proxy_url_test, proxy_pattern_test, proxy, proxy_web, forced_proxy, proxy_retries, count_retries_tot, timeout, alfa_s, proxy_que, test, debugging):
|
|
import httptools
|
|
header = scrapertools.find_single_match(proxy_url_test, '(http.*):\\/\\/')
|
|
if not header:
|
|
header = 'http'
|
|
proxy_a = {header: proxy_addr}
|
|
try:
|
|
data = ''
|
|
data = httptools.downloadpage(proxy_url_test, proxy=proxy, proxy_web=proxy_web, forced_proxy=forced_proxy, proxy_addr_forced=proxy_a, proxy_retries=proxy_retries, count_retries_tot=count_retries_tot, timeout=timeout, alfa_s=alfa_s).data
|
|
except:
|
|
logger.error(traceback.format_exc())
|
|
return ''
|
|
|
|
if data:
|
|
if proxy_pattern_test:
|
|
data = re.sub('\\n|\\r|\\t| |<br>|\\s{2,}', '', data)
|
|
data_test = scrapertools.find_single_match(data, proxy_pattern_test)
|
|
if data_test:
|
|
if isinstance(proxy_que, Queue.Queue):
|
|
proxy_que.put(proxy_addr)
|
|
else:
|
|
proxy_addr = ''
|
|
elif isinstance(proxy_que, Queue.Queue):
|
|
proxy_que.put(proxy_addr)
|
|
else:
|
|
proxy_addr = ''
|
|
return proxy_addr
|
|
|
|
|
|
def logger_disp(debugging=debugging):
|
|
proxy_dev = decrypt_proxy(config.get_setting('proxy_dev'))
|
|
proxy_channel_bloqued_str = decrypt_proxy(config.get_setting('proxy_channel_bloqued'))
|
|
proxy_addr = decrypt_proxy(config.get_setting('proxy_addr'))
|
|
proxy_list = decrypt_proxy(config.get_setting('proxy_list'))
|
|
proxy_CF_addr = decrypt_proxy(config.get_setting('proxy_CF_addr'))
|
|
proxy_CF_list = decrypt_proxy(config.get_setting('proxy_CF_list'))
|
|
proxy_web_name = decrypt_proxy(config.get_setting('proxy_web_name'))
|
|
if proxy_dev == 'dev' or debugging:
|
|
logger.info('PROXY Lists: ProxyDirect: ' + str(proxy_addr) + ' / ProxyDirect Pool: ' + str(proxy_list) + ' / ProxyCF: ' + str(proxy_CF_addr) + ' / ProxyCF Pool: ' + str(proxy_CF_list) + ' / ProxyWeb: ' + str(proxy_web_name) + ' / Proxy Whitelist: ' + str(decrypt_proxy(config.get_setting('proxy_white_list'))) + ' / Bloqued Channels: ' + str(proxy_channel_bloqued_str))
|
|
else:
|
|
logger.debug(str(encrypt_proxy('PROXY Lists: ProxyDirect: ' + str(proxy_addr) + ' / ProxyDirect Pool: ' + str(proxy_list) + ' / ProxyCF: ' + str(proxy_CF_addr) + ' / ProxyCF Pool: ' + str(proxy_CF_list) + ' / ProxyWeb: ' + str(proxy_web_name) + ' / Proxy Whitelist: ' + str(decrypt_proxy(config.get_setting('proxy_white_list'))) + ' / Bloqued Channels: ' + str(proxy_channel_bloqued_str))))
|
|
|
|
|
|
def set_proxy_web(url, proxy_web_name, post=None):
|
|
proxy_site_url_post = ll11ll[proxy_web_name][0]
|
|
proxy_site_url_get = ll11ll[proxy_web_name][1] + ll11ll[proxy_web_name][3]
|
|
proxy_site_referer = ll11ll[proxy_web_name][2]
|
|
proxy_site_header = ll11ll[proxy_web_name][3]
|
|
proxy_site_tail = ll11ll[proxy_web_name][4]
|
|
proxy_site_post = ll11ll[proxy_web_name][5]
|
|
if debugging:
|
|
logger.info('PROXY POST: ' + proxy_site_url_post + ' / GET: ' + proxy_site_url_get)
|
|
if post and proxy_web_name != ll1111:
|
|
proxy_web_name = ''
|
|
headers = ''
|
|
if proxy_web_name:
|
|
url = urllib.quote_plus(url)
|
|
if post:
|
|
tail = proxy_site_tail.split('|')
|
|
url = proxy_site_url_get + url + tail[0]
|
|
else:
|
|
post = proxy_site_post % url
|
|
post = post.replace('[', '%5B').replace(']', '%5D')
|
|
url = proxy_site_url_post
|
|
if proxy_site_referer:
|
|
headers = {'Content-Type': 'application/x-www-form-urlencoded', 'Referer': proxy_site_referer}
|
|
if debugging:
|
|
logger.debug(url + ' / ' + post + ' / ' + headers + ' / ' + proxy_web_name)
|
|
return (
|
|
url, post, headers, proxy_web_name)
|
|
|
|
|
|
def restore_after_proxy_web(data, proxy_web_name, url):
|
|
proxy_site_header = ll11ll[proxy_web_name][3]
|
|
proxy_site_tail = ll11ll[proxy_web_name][4]
|
|
if 'Hotlinking directly to proxied pages is not permitted.' in data:
|
|
data = 'ERROR'
|
|
return data
|
|
if not scrapertools.find_single_match(data, '^d\\d+:.*?\\d+:') and not data.startswith('PK'):
|
|
data = urllib.unquote(data)
|
|
proxy_site_table = []
|
|
proxy_site_table = proxy_site_header.split('|')
|
|
for proxy_header in proxy_site_table:
|
|
data = data.replace(proxy_header, '')
|
|
|
|
proxy_site_table = []
|
|
proxy_site_table = proxy_site_tail.split('|')
|
|
for proxy_tail in proxy_site_table:
|
|
data = data.replace(proxy_tail, '')
|
|
|
|
data = data.replace('href="%smagnet:?' % url, 'href="magnet:?')
|
|
data = data.replace("href='%smagnet:?" % url, "href='magnet:?")
|
|
return data
|
|
|
|
|
|
def channel_proxy_list(url, forced_proxy=None):
|
|
proxy_channel_bloqued_str = decrypt_proxy(config.get_setting('proxy_channel_bloqued'))
|
|
proxy_channel_bloqued = dict()
|
|
if proxy_channel_bloqued_str:
|
|
proxy_channel_bloqued = ast.literal_eval(proxy_channel_bloqued_str)
|
|
if not url.endswith('/'):
|
|
url += '/'
|
|
if scrapertools.find_single_match(url, '(?:http.*:\\/\\/)?([^\\?|\\/]+)(?:\\?|\\/)') in proxy_channel_bloqued:
|
|
if forced_proxy:
|
|
return True
|
|
if 'ON' in proxy_channel_bloqued[scrapertools.find_single_match(url, '(?:http.*:\\/\\/)?([^\\?|\\/]+)(?:\\?|\\/)')]:
|
|
if debugging:
|
|
logger.debug(scrapertools.find_single_match(url, '(?:http.*:\\/\\/)?([^\\?|\\/]+)(?:\\?|\\/)'))
|
|
return True
|
|
return False
|
|
|
|
|
|
def get_proxy_addr(url, post=None, forced_proxy=None):
|
|
proxy_a = ''
|
|
proxy_CF_a = ''
|
|
proxy_white_list_str = ''
|
|
proxy_w = False
|
|
proxy_log = ''
|
|
header = 'http'
|
|
domain = ''
|
|
url_f = url
|
|
proxy_a = decrypt_proxy(config.get_setting('proxy_addr'))
|
|
proxy_CF_a = decrypt_proxy(config.get_setting('proxy_CF_addr'))
|
|
proxy_white_list_str = decrypt_proxy(config.get_setting('proxy_white_list'))
|
|
proxy_web_name = decrypt_proxy(config.get_setting('proxy_web_name'))
|
|
proxy_dev = decrypt_proxy(config.get_setting('proxy_dev'))
|
|
header = scrapertools.find_single_match(url_f, '(http.*):\\/\\/')
|
|
if not url_f.endswith('/'):
|
|
url_f += '/'
|
|
domain = scrapertools.find_single_match(url_f, '(?:http.*:\\/\\/)?([^\\?|\\/]+)(?:\\?|\\/)')
|
|
if domain and proxy_white_list_str and not forced_proxy:
|
|
if domain in proxy_white_list_str:
|
|
proxy_w = True
|
|
proxy_white_list = dict()
|
|
proxy_white_list = ast.literal_eval(proxy_white_list_str)
|
|
if 'ProxyWeb' in proxy_white_list[domain]:
|
|
proxy_a = ''
|
|
proxy_CF_a = ''
|
|
if ':' in proxy_white_list[domain]:
|
|
proxy_web_name = proxy_white_list[domain].replace('ProxyWeb:', '')
|
|
elif 'ProxyCF' in proxy_white_list[domain]:
|
|
proxy_a = ''
|
|
proxy_web_name = ''
|
|
if ':' in proxy_white_list[domain]:
|
|
proxy_CF_a = proxy_white_list[domain].replace('ProxyCF:', '')
|
|
else:
|
|
proxy_a = proxy_white_list[domain]
|
|
proxy_CF_a = ''
|
|
proxy_web_name = ''
|
|
if forced_proxy:
|
|
if forced_proxy == 'Total':
|
|
pass
|
|
elif forced_proxy == 'ProxyCF':
|
|
proxy_a = ''
|
|
proxy_web_name = ''
|
|
elif forced_proxy == 'ProxyWeb':
|
|
proxy_a = ''
|
|
proxy_CF_a = ''
|
|
else:
|
|
proxy_CF_a = ''
|
|
proxy_web_name = ''
|
|
elif not proxy_w:
|
|
proxy_CF_a = ''
|
|
proxy_web_name = ''
|
|
if proxy_web_name:
|
|
proxy_log = url
|
|
if proxy_a:
|
|
proxy_log = proxy_a
|
|
proxy_a = {header: proxy_a}
|
|
if proxy_CF_a:
|
|
proxy_log = proxy_CF_a
|
|
proxy_CF_a = {header: proxy_CF_a}
|
|
if not proxy_a and not proxy_CF_a and not proxy_web_name:
|
|
proxy_CF_a = decrypt_proxy(config.get_setting('proxy_CF_addr'))
|
|
proxy_a = ''
|
|
proxy_web_name = ''
|
|
if proxy_CF_a:
|
|
proxy_log = proxy_CF_a
|
|
proxy_CF_a = {header: proxy_CF_a}
|
|
else:
|
|
proxy_CF_a = ''
|
|
if proxy_dev != 'dev':
|
|
proxy_log = ''
|
|
if debugging:
|
|
logger.debug('Proxy: ' + str(proxy_a) + ' / Proxy CF: ' + str(proxy_CF_a) + ' / ProxyWeb: ' + str(proxy_web_name) + ' / ProxyLog: ' + str(proxy_log))
|
|
return (
|
|
proxy_a, proxy_CF_a, proxy_web_name, proxy_log)
|
|
|
|
|
|
def encrypt_proxy(data):
|
|
if debugging:
|
|
logger.debug(data)
|
|
if data:
|
|
data = base64.b64encode(data.encode('utf-8'))
|
|
if debugging:
|
|
logger.debug(data)
|
|
return data
|
|
|
|
|
|
def decrypt_proxy(data):
|
|
if debugging:
|
|
logger.debug(data)
|
|
if data:
|
|
data = base64.b64decode(data).decode('utf-8')
|
|
if debugging:
|
|
logger.debug(data)
|
|
return data
|
|
|
|
|
|
l1 = [[], [99, 71, 120, 49, 90, 50, 108, 117, 76, 110, 90, 112, 90, 71, 86, 118, 76, 109, 70, 115, 90, 109, 69, 61]] |