249 lines
8.7 KiB
Python
249 lines
8.7 KiB
Python
# -*- coding: utf-8 -*-
|
|
# vStream https://github.com/Kodi-vStream/venom-xbmc-addons
|
|
|
|
try: # Python 2
|
|
import urllib2
|
|
from urllib2 import URLError as UrlError
|
|
|
|
except ImportError: # Python 3
|
|
import urllib.request as urllib2
|
|
from urllib.error import URLError as UrlError
|
|
|
|
from resources.lib.comaddon import addon, dialog, VSlog
|
|
from resources.lib.config import GestionCookie
|
|
from resources.lib.parser import cParser
|
|
from resources.lib.util import urlEncode
|
|
|
|
UA = 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:56.0) Gecko/20100101 Firefox/56.0'
|
|
headers = {'User-Agent': UA}
|
|
|
|
|
|
class NoRedirection(urllib2.HTTPErrorProcessor):
|
|
def http_response(self, request, response):
|
|
code, msg, hdrs = response.code, response.msg, response.info()
|
|
|
|
return response
|
|
|
|
https_response = http_response
|
|
|
|
|
|
class cPremiumHandler:
|
|
ADDON = addon()
|
|
DIALOG = dialog()
|
|
|
|
def __init__(self, sHosterIdentifier):
|
|
self.__sHosterIdentifier = sHosterIdentifier.lower()
|
|
self.__sDisplayName = 'Premium mode'
|
|
self.isLogin = False
|
|
self.__LoginTry = False
|
|
self.__ssl = False
|
|
|
|
self.__Ispremium = False
|
|
bIsPremium = self.ADDON.getSetting('hoster_' + str(self.__sHosterIdentifier) + '_premium')
|
|
if (bIsPremium == 'true'):
|
|
VSlog("Utilise compte premium pour hoster " + str(self.__sHosterIdentifier))
|
|
self.__Ispremium = True
|
|
else:
|
|
VSlog("Utilise compte gratuit pour hoster: " + str(self.__sHosterIdentifier))
|
|
|
|
def isPremiumModeAvailable(self):
|
|
return self.__Ispremium
|
|
|
|
def getUsername(self):
|
|
sUsername = self.ADDON.getSetting('hoster_' + str(self.__sHosterIdentifier) + '_username')
|
|
return sUsername
|
|
|
|
def getPassword(self):
|
|
sPassword = self.ADDON.getSetting('hoster_' + str(self.__sHosterIdentifier) + '_password')
|
|
return sPassword
|
|
|
|
def AddCookies(self):
|
|
cookies = GestionCookie().Readcookie(self.__sHosterIdentifier)
|
|
return 'Cookie=' + cookies
|
|
|
|
def Checklogged(self, code):
|
|
if 'uptobox' in self.__sHosterIdentifier:
|
|
if '//uptobox.com/?op=logout&' in code or 'Success' in code:
|
|
return True
|
|
|
|
if 'onefichier' in self.__sHosterIdentifier:
|
|
if 'premium' in code or 'jqueryFileTree' in code or '1fichier.com/logout' in code: # test ok mais pas convaincu....
|
|
return True
|
|
|
|
return False
|
|
|
|
def CheckCookie(self):
|
|
cookies = GestionCookie().Readcookie(self.__sHosterIdentifier)
|
|
if cookies != '':
|
|
return True
|
|
return False
|
|
|
|
def Authentificate(self):
|
|
|
|
# un seul essais par session, pas besoin de bombarder le serveur
|
|
if self.__LoginTry:
|
|
return False
|
|
self.__LoginTry = True
|
|
|
|
if not self.__Ispremium:
|
|
return False
|
|
|
|
post_data = {}
|
|
|
|
if 'uptobox' in self.__sHosterIdentifier:
|
|
url = 'https://uptobox.com/?op=login&referer=homepage'
|
|
post_data['login'] = self.getUsername()
|
|
post_data['password'] = self.getPassword()
|
|
|
|
elif 'onefichier' in self.__sHosterIdentifier:
|
|
url = 'https://1fichier.com/login.pl'
|
|
post_data['mail'] = self.getUsername()
|
|
post_data['pass'] = self.getPassword()
|
|
post_data['lt'] = 'on'
|
|
post_data['purge'] = 'on'
|
|
post_data['valider'] = 'Send'
|
|
self.__ssl = True
|
|
|
|
elif 'uploaded' in self.__sHosterIdentifier:
|
|
url = 'http://uploaded.net/io/login'
|
|
post_data['id'] = self.getUsername()
|
|
post_data['pw'] = self.getPassword()
|
|
|
|
# si aucun de trouve on retourne
|
|
else:
|
|
return False
|
|
|
|
if (self.__ssl):
|
|
try:
|
|
import ssl
|
|
context = ssl._create_unverified_context()
|
|
except:
|
|
self.__ssl = False
|
|
|
|
if 'uptobox' in self.__sHosterIdentifier:
|
|
data = urlEncode(post_data)
|
|
|
|
opener = urllib2.build_opener(NoRedirection)
|
|
|
|
opener.addheaders = [('User-Agent', UA)]
|
|
opener.addheaders.append(('Content-Type', 'application/x-www-form-urlencoded'))
|
|
opener.addheaders.append(('Referer', str(url)))
|
|
opener.addheaders.append(('Content-Length', str(len(data))))
|
|
|
|
try:
|
|
response = opener.open(url, data)
|
|
head = response.info()
|
|
except UrlError:
|
|
return ''
|
|
else:
|
|
req = urllib2.Request(url, urlEncode(post_data), headers)
|
|
|
|
try:
|
|
if (self.__ssl):
|
|
response = urllib2.urlopen(req, context=context)
|
|
else:
|
|
response = urllib2.urlopen(req)
|
|
except UrlError as e:
|
|
if getattr(e, "code", None) == 403:
|
|
# login denied
|
|
self.DIALOG.VSinfo('Authentification rate', self.__sDisplayName)
|
|
elif getattr(e, "code", None) == 502:
|
|
# login denied
|
|
self.DIALOG.VSinfo('Authentification rate', self.__sDisplayName)
|
|
elif getattr(e, "code", None) == 234:
|
|
# login denied
|
|
self.DIALOG.VSinfo('Authentification rate', self.__sDisplayName)
|
|
else:
|
|
VSlog("debug" + str(getattr(e, "code", None)))
|
|
VSlog("debug" + str(getattr(e, "reason", None)))
|
|
|
|
self.isLogin = False
|
|
return False
|
|
|
|
sHtmlContent = response.read()
|
|
head = response.headers
|
|
response.close()
|
|
|
|
if 'uptobox' in self.__sHosterIdentifier:
|
|
if 'xfss' in head['Set-Cookie']:
|
|
self.isLogin = True
|
|
else:
|
|
self.DIALOG.VSinfo('Authentification rate', self.__sDisplayName)
|
|
return False
|
|
elif 'onefichier' in self.__sHosterIdentifier:
|
|
if 'You are logged in. This page will redirect you.' in sHtmlContent:
|
|
self.isLogin = True
|
|
else:
|
|
self.DIALOG.VSinfo('Authentification rate', self.__sDisplayName)
|
|
return False
|
|
elif 'uploaded' in self.__sHosterIdentifier:
|
|
if sHtmlContent == '':
|
|
self.isLogin = True
|
|
else:
|
|
self.DIALOG.VSinfo('Authentification rate', self.__sDisplayName)
|
|
return False
|
|
else:
|
|
return False
|
|
|
|
# get cookie
|
|
cookies = ''
|
|
if 'Set-Cookie' in head:
|
|
oParser = cParser()
|
|
sPattern = '(?:^|,) *([^;,]+?)=([^;,\/]+?);'
|
|
aResult = oParser.parse(str(head['Set-Cookie']), sPattern)
|
|
# print(aResult)
|
|
if (aResult[0] == True):
|
|
for cook in aResult[1]:
|
|
if 'deleted' in cook[1]:
|
|
continue
|
|
cookies = cookies + cook[0] + '=' + cook[1] + ';'
|
|
|
|
# save cookie
|
|
GestionCookie().SaveCookie(self.__sHosterIdentifier, cookies)
|
|
|
|
self.DIALOG.VSinfo('Authentification reussie', self.__sDisplayName)
|
|
VSlog('Auhentification reussie')
|
|
|
|
return True
|
|
|
|
def GetHtmlwithcookies(self, url, data, cookies):
|
|
|
|
req = urllib2.Request(url, data, headers)
|
|
if not (data == None):
|
|
req.add_header('Referer', url)
|
|
|
|
req.add_header('Cookie', cookies)
|
|
|
|
try:
|
|
response = urllib2.urlopen(req)
|
|
except UrlError:
|
|
return ''
|
|
|
|
sHtmlContent = response.read()
|
|
response.close()
|
|
return sHtmlContent
|
|
|
|
def GetHtml(self, url, data=None):
|
|
cookies = GestionCookie().Readcookie(self.__sHosterIdentifier)
|
|
|
|
# aucun ne marche sans cookies
|
|
if (cookies == '') and not self.__LoginTry and self.__Ispremium:
|
|
self.Authentificate()
|
|
if not self.isLogin:
|
|
return ''
|
|
cookies = GestionCookie().Readcookie(self.__sHosterIdentifier)
|
|
|
|
sHtmlContent = self.GetHtmlwithcookies(url, data, cookies)
|
|
|
|
# Les cookies ne sont plus valables, mais on teste QUE si la personne n'a pas essaye de s'authentifier
|
|
if not self.Checklogged(sHtmlContent) and not self.__LoginTry and self.__Ispremium:
|
|
VSlog('Cookies non valables')
|
|
self.Authentificate()
|
|
if self.isLogin:
|
|
cookies = GestionCookie().Readcookie(self.__sHosterIdentifier)
|
|
sHtmlContent = self.GetHtmlwithcookies(url, data, cookies)
|
|
else:
|
|
return ''
|
|
|
|
return sHtmlContent
|