# -*- coding: utf-8 -*-
# *************************************************************************************************************************
# from Shani's LPro Code https://github.com/Shani-08/ShaniXBMCWork2/blob/master/other/unCaptcha.py
# and https://github.com/OpenMediaVault-Plugin-Developers/openmediavault-pyload/blob/master/usr/share/pyload/module/plugins/captcha/ReCaptcha.py
# and https://gitlab.com/iptvplayer-for-e2/iptvplayer-for-e2
# *************************************************************************************************************************
try: # Python 2
import urllib2
except ImportError: # Python 3
import urllib.request as urllib2
import base64
try:
from http.cookiejar import CookieJar
except ImportError:
from cookielib import CookieJar
import os
import random
import re
import time
import xbmcaddon
import xbmcvfs
import xbmcgui
import xbmc
from resources.lib.comaddon import dialog, VSlog
from resources.lib.handler.requestHandler import cRequestHandler
from resources.lib.util import urlEncode, Noredirection
UA = 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:53.0) Gecko/20100101 Firefox/53.0'
__addon__ = xbmcaddon.Addon('plugin.video.vstream')
__sLang__ = 'fr'
class cInputWindow(xbmcgui.WindowDialog):
def __init__(self, *args, **kwargs):
self.cptloc = kwargs.get('captcha')
# self.img = xbmcgui.ControlImage(250, 110, 780, 499, '')
# xbmc.sleep(500)
self.img = xbmcgui.ControlImage(250, 110, 780, 499, self.cptloc)
xbmc.sleep(500)
bg_image = os.path.join(__addon__.getAddonInfo('path'), 'resources/art/') + 'background.png'
check_image = os.path.join(__addon__.getAddonInfo('path'), 'resources/art/') + 'trans_checked.png'
self.ctrlBackground = xbmcgui.ControlImage(0, 0, 1280, 720, bg_image)
self.cancelled = False
self.addControl(self.ctrlBackground)
self.strActionInfo = xbmcgui.ControlLabel(250, 20, 724, 400, 'Veuillez sélectionnez les images correspondants au thème.\nIl devrait y en avoir 3 ou 4 à sélectionner.', 'font40', '0xFFFF00FF')
self.addControl(self.strActionInfo)
self.msg = kwargs.get('msg')
self.roundnum = kwargs.get('roundnum')
self.strActionInfo = xbmcgui.ControlLabel(250, 70, 700, 300, 'Le thème est: ' + self.msg, 'font13', '0xFFFF00FF')
self.addControl(self.strActionInfo)
self.addControl(self.img)
self.chk = [0]*9
self.chkbutton = [0]*9
self.chkstate = [False]*9
if 1 == 2:
self.chk[0] = xbmcgui.ControlCheckMark(250, 110, 260, 166, '1', font='font14', focusTexture=check_image, checkWidth=260, checkHeight=166)
self.chk[1] = xbmcgui.ControlCheckMark(250 + 260, 110, 260, 166, '2', font='font14', focusTexture=check_image, checkWidth=260, checkHeight=166)
self.chk[2] = xbmcgui.ControlCheckMark(250 + 520, 110, 260, 166, '3', font='font14', focusTexture=check_image, checkWidth=260, checkHeight=166)
self.chk[3] = xbmcgui.ControlCheckMark(250, 110 + 166, 260, 166, '4', font='font14', focusTexture=check_image, checkWidth=260, checkHeight=166)
self.chk[4] = xbmcgui.ControlCheckMark(250 + 260, 110 + 166, 260, 166, '5', font='font14', focusTexture=check_image, checkWidth=260, checkHeight=166)
self.chk[5] = xbmcgui.ControlCheckMark(250 + 520, 110 + 166, 260, 166, '6', font='font14', focusTexture=check_image, checkWidth=260, checkHeight=166)
self.chk[6] = xbmcgui.ControlCheckMark(250, 110 + 332, 260, 166, '7', font='font14', focusTexture=check_image, checkWidth=260, checkHeight=166)
self.chk[7] = xbmcgui.ControlCheckMark(250 + 260, 110 + 332, 260, 166, '8', font='font14', focusTexture=check_image, checkWidth=260, checkHeight=166)
self.chk[8] = xbmcgui.ControlCheckMark(250 + 520, 110 + 332, 260, 166, '9', font='font14', focusTexture=check_image, checkWidth=260, checkHeight=166)
else:
self.chk[0] = xbmcgui.ControlImage(250, 110, 260, 166, check_image)
self.chk[1] = xbmcgui.ControlImage(250 + 260, 110, 260, 166, check_image)
self.chk[2] = xbmcgui.ControlImage(250 + 520, 110, 260, 166, check_image)
self.chk[3] = xbmcgui.ControlImage(250, 110 + 166, 260, 166, check_image)
self.chk[4] = xbmcgui.ControlImage(250 + 260, 110 + 166, 260, 166, check_image)
self.chk[5] = xbmcgui.ControlImage(250 + 520, 110 + 166, 260, 166, check_image)
self.chk[6] = xbmcgui.ControlImage(250, 110 + 332, 260, 166, check_image)
self.chk[7] = xbmcgui.ControlImage(250 + 260, 110 + 332, 260, 166, check_image)
self.chk[8] = xbmcgui.ControlImage(250 + 520, 110 + 332, 260, 166, check_image)
self.chkbutton[0] = xbmcgui.ControlButton(250, 110, 260, 166, '1', font='font1')
self.chkbutton[1] = xbmcgui.ControlButton(250 + 260, 110, 260, 166, '2', font='font1')
self.chkbutton[2] = xbmcgui.ControlButton(250 + 520, 110, 260, 166, '3', font='font1')
self.chkbutton[3] = xbmcgui.ControlButton(250, 110 + 166, 260, 166, '4', font='font1')
self.chkbutton[4] = xbmcgui.ControlButton(250 + 260, 110 + 166, 260, 166, '5', font='font1')
self.chkbutton[5] = xbmcgui.ControlButton(250 + 520, 110 + 166, 260, 166, '6', font='font1')
self.chkbutton[6] = xbmcgui.ControlButton(250, 110 + 332, 260, 166, '7', font='font1')
self.chkbutton[7] = xbmcgui.ControlButton(250 + 260, 110 + 332, 260, 166, '8', font='font1')
self.chkbutton[8] = xbmcgui.ControlButton(250 + 520, 110 + 332, 260, 166, '9', font='font1')
for obj in self.chk:
self.addControl(obj)
obj.setVisible(False)
for obj in self.chkbutton:
self.addControl(obj)
self.cancelbutton = xbmcgui.ControlButton(250 + 260 - 70, 620, 140, 50, 'Cancel', alignment=2)
self.okbutton = xbmcgui.ControlButton(250 + 520 - 50, 620, 100, 50, 'OK', alignment=2)
self.addControl(self.okbutton)
self.addControl(self.cancelbutton)
self.chkbutton[6].controlDown(self.cancelbutton); self.chkbutton[6].controlUp(self.chkbutton[3])
self.chkbutton[7].controlDown(self.cancelbutton); self.chkbutton[7].controlUp(self.chkbutton[4])
self.chkbutton[8].controlDown(self.okbutton); self.chkbutton[8].controlUp(self.chkbutton[5])
self.chkbutton[6].controlLeft(self.chkbutton[8]); self.chkbutton[6].controlRight(self.chkbutton[7]);
self.chkbutton[7].controlLeft(self.chkbutton[6]); self.chkbutton[7].controlRight(self.chkbutton[8]);
self.chkbutton[8].controlLeft(self.chkbutton[7]); self.chkbutton[8].controlRight(self.chkbutton[6]);
self.chkbutton[3].controlDown(self.chkbutton[6]); self.chkbutton[3].controlUp(self.chkbutton[0])
self.chkbutton[4].controlDown(self.chkbutton[7]); self.chkbutton[4].controlUp(self.chkbutton[1])
self.chkbutton[5].controlDown(self.chkbutton[8]); self.chkbutton[5].controlUp(self.chkbutton[2])
self.chkbutton[3].controlLeft(self.chkbutton[5]); self.chkbutton[3].controlRight(self.chkbutton[4]);
self.chkbutton[4].controlLeft(self.chkbutton[3]); self.chkbutton[4].controlRight(self.chkbutton[5]);
self.chkbutton[5].controlLeft(self.chkbutton[4]); self.chkbutton[5].controlRight(self.chkbutton[3]);
self.chkbutton[0].controlDown(self.chkbutton[3]); self.chkbutton[0].controlUp(self.cancelbutton)
self.chkbutton[1].controlDown(self.chkbutton[4]); self.chkbutton[1].controlUp(self.cancelbutton)
self.chkbutton[2].controlDown(self.chkbutton[5]); self.chkbutton[2].controlUp(self.okbutton)
self.chkbutton[0].controlLeft(self.chkbutton[2]); self.chkbutton[0].controlRight(self.chkbutton[1]);
self.chkbutton[1].controlLeft(self.chkbutton[0]); self.chkbutton[1].controlRight(self.chkbutton[2]);
self.chkbutton[2].controlLeft(self.chkbutton[1]); self.chkbutton[2].controlRight(self.chkbutton[0]);
self.cancelled = False
self.setFocus(self.okbutton)
self.okbutton.controlLeft(self.cancelbutton); self.okbutton.controlRight(self.cancelbutton);
self.cancelbutton.controlLeft(self.okbutton); self.cancelbutton.controlRight(self.okbutton);
self.okbutton.controlDown(self.chkbutton[2]); self.okbutton.controlUp(self.chkbutton[8]);
self.cancelbutton.controlDown(self.chkbutton[0]); self.cancelbutton.controlUp(self.chkbutton[6]);
def get(self):
self.doModal()
self.close()
if not self.cancelled:
retval = ""
for objn in range(9):
if self.chkstate[objn]:
retval += ("" if retval == "" else ",") + str(objn)
return retval
else:
return ""
def anythingChecked(self):
for obj in self.chkstate:
if obj:
return True
return False
def onControl(self, control):
if str(control.getLabel()) == "OK":
if self.anythingChecked():
self.close()
elif str(control.getLabel()) == "Cancel":
self.cancelled = True
self.close()
try:
if 'xbmcgui.ControlButton' in repr(type(control)):
index = control.getLabel()
if index.isnumeric():
self.chkstate[int(index)-1] = not self.chkstate[int(index)-1]
self.chk[int(index)-1].setVisible(self.chkstate[int(index)-1])
except:
pass
def onAction(self, action):
if action == 10:
self.cancelled = True
self.close()
def ResolveCaptcha(key, urlOuo):
urlBase = 'https://www.google.com/recaptcha/api/fallback?k=' + key
oRequestHandler = cRequestHandler(urlBase)
oRequestHandler.addHeaderEntry('User-Agent', UA)
oRequestHandler.addHeaderEntry('Accept', 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8')
oRequestHandler.addHeaderEntry('Accept-Language', 'fr,fr-FR;q=0.8,en-US;q=0.5,en;q=0.3')
oRequestHandler.addHeaderEntry('Accept-Encoding', 'gzip, deflate')
oRequestHandler.addHeaderEntry('Referer', urlOuo)
body = oRequestHandler.request()
captchaScrap = re.findall('value="8">.+?(.+?)', str(body)).group(1)
c = re.search('method="POST">(.+?)<', sHtmlContent).group(1)
if not token:
dialogs = dialog()
dialogs.VSinfo("Captcha non valide")
return token
def getUrl(url, cookieJar=None, post=None, timeout=20, headers=None, noredir=False):
cookie_handler = urllib2.HTTPCookieProcessor(cookieJar)
if noredir:
opener = urllib2.build_opener(Noredirection, cookie_handler, urllib2.HTTPBasicAuthHandler(), urllib2.HTTPHandler())
else:
opener = urllib2.build_opener(cookie_handler, urllib2.HTTPBasicAuthHandler(), urllib2.HTTPHandler())
# opener = urllib2.install_opener(opener)
req = urllib2.Request(url)
if headers:
for h, hv in headers:
req.add_header(h, hv)
else:
req.add_header('User-Agent', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.154 Safari/537.36')
req.add_header('Accept-Language', __sLang__)
VSlog('post : ' + str(post))
response = opener.open(req, post, timeout=timeout)
link = response.read()
response.close()
return link
class UnCaptchaReCaptcha:
def _collect_api_info(self):
html = getUrl("http://www.google.com/recaptcha/api.js")
a = re.search(r'po.src = \'(.*?)\';', html).group(1)
vers = a.split("/")[5]
questionfile = a
VSlog("Fichier questions: %s" % questionfile)
VSlog("API version: %s" % vers)
language = a.split("__")[1].split(".")[0]
VSlog("API language: %s" % language)
html = getUrl("https://apis.google.com/js/api.js")
b = re.search(r'"h":"(.*?)","', html).group(1)
jsh = b.decode('unicode-escape')
VSlog("API jsh-string: %s" % jsh)
return vers, language, jsh, questionfile
def _prepare_time_and_rpc(self):
# getUrl("http://www.google.com/recaptcha/api2/demo")
millis = int(round(time.time() * 1000))
VSlog("Time: %s" % millis)
rand = random.randint(1, 99999999)
a = "0.%s" % str(rand * 2147483647)
rpc = int(100000000 * float(a))
VSlog("Rpc-token: %s" % rpc)
return millis, rpc
def ExtReg(self, r, chain):
r = re.search(r, chain)
if not r:
return ''
return r.group(1)
def processCaptcha(self, key, lang, gcookieJar):
headers = [("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:37.0) Gecko/20100101 Firefox/37.0"),
# ("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"),
("Referer", "https://www.google.com/recaptcha/api2/demo"),
("Accept-Language", lang)]
millis, rpc = self._prepare_time_and_rpc()
co = base64.b64encode('https://www.google.com:443')
botguardstring = "!A"
vers, language, jsh, questionfile = self._collect_api_info()
post_data = None
token = ''
iteration = 0
reCaptchaUrl = 'http://www.google.com/recaptcha/api/fallback?k=%s' % key
while iteration < 20:
millis_captcha_loading = int(round(time.time() * 1000))
# ,'cookiefile':self.COOKIE_FILE, 'use_cookie': True, 'load_cookie': True, 'save_cookie': True
data = getUrl(reCaptchaUrl, headers=headers, post=post_data, cookieJar=gcookieJar)
VSlog(reCaptchaUrl)
imgUrl = re.search(r'"(/recaptcha/api2/payload[^"]+?)"', data).group(1)
VSlog(imgUrl)
iteration += 1
message = self.ExtReg(r'', data)
if '' == message:
message = self.ExtReg(r'