# -*- 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']+class="fbc-imageselect-message-text"[^>]*>(.*?)', data) if '' == message: message = self.ExtReg(r']+class="fbc-imageselect-message-error">(.*?)', data) if '' == message: token = re.search(r'"this\.select\(\)">(.*?)', data).group(1) if '' != token: VSlog('>>>>>>>> Captcha token[%s]' % token) else: VSlog('>>>>>>>> Captcha Failed') break cval = re.search(r'name="c"\s+value="([^"]+)', data).group(1) imgUrl = 'https://www.google.com%s' % (imgUrl.replace('&', '&')) accepLabel = re.search(r'type="submit"\s+value="([^"]+)', data).group(1) filePath = 'c://c.jpeg' import random n = random.randint(1, 1000) filePath = 'c://c' + str(n) + '.jpeg' VSlog(">>>>>>>> Captcha message[%s]" % message) VSlog(">>>>>>>> Captcha accep label[%s]" % accepLabel) VSlog(">>>>>>>> Captcha imgUrl[%s] filePath[%s]" % (imgUrl, filePath)) # params = {'maintype': 'image', 'subtypes':['jpeg'], 'check_first_bytes':['\xFF\xD8', '\xFF\xD9']} # ret = self.cm.saveWebFile(filePath, imgUrl, params) # retArg = self.sessionEx.waitForFinishOpen(UnCaptchaReCaptchaWidget, imgFilePath=filePath, message=message, title="reCAPTCHA v2", additionalParams={'accep_label':accepLabel}) ret = '' ret = getUrl(imgUrl, headers=headers, cookieJar=gcookieJar) downloaded_image = file(filePath, 'wb') downloaded_image.write(ret) downloaded_image.close() oSolver = cInputWindow(captcha=filePath, msg=message, roundnum=iteration) retArg = oSolver.get() VSlog('>>>>>>>> Captcha response [%s]' % retArg) responses = base64.b64encode('{"response":[%s]}' % retArg) # VSlog(responses) responses=responses.replace('=', '.') if retArg is not None and len(retArg) and retArg[0]: post_data = urlEncode({'c': cval, 'response': responses}, doseq=True) else: break if False: timeToSolve = int(round(time.time() * 1000)) - millis_captcha_loading timeToSolveMore = timeToSolve # timeToSolve + int(float("0." + str(random.randint(1, 99999999))) * 500) postdata = urlEncode({'c': cval, 'response': responses, 'v': vers, 't': timeToSolve, 'bg': botguardstring, 'ct': timeToSolveMore}) html = getUrl('https://www.google.com/recaptcha/api2/userverify?k=' + key, post=postdata, headers=headers) # fh = open('c:\\test.txt', 'w') # fh.write(html) # fh.close() return token def getg(): return None cookieJar = cookielib.LWPCookieJar() try: cookieJar.load("./gsite.jwl") except: pass def performCaptcha(sitename, cj, returnpage=True, captcharegex='data-sitekey="(.*?)"', lang="fr", headers=None): gcookieJar = getg() sitepage = getUrl(sitename, cookieJar=cj, headers=headers) sitekey = re.findall(captcharegex, sitepage) token = "" if len(sitekey) >= 1: # getUrl('https://www.google.com/', cookieJar=gcookieJar) c = UnCaptchaReCaptcha() token = c.processCaptcha(sitekey[0], lang, gcookieJar) if returnpage: # gcookieJar.save('./gsite.jwl'); headers = [("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:37.0) Gecko/20100101 Firefox/37.0"), ("Referer", sitename)] sitepage = getUrl(sitename, cookieJar=cj, post=urlEncode({"g-recaptcha-response": token}), headers=headers) if returnpage: # fh = open('c:\\reussi.txt', 'w') # fh.write(sitepage) # fh.close() return sitepage else: return token # performCaptcha("http://www.livetv.tn/", cookieJar)