예제 #1
0
    def _send_with_session_id(self, request: requests.Request, timeout) \
            -> requests.Response:
        """Sends the given request with the session ID."""
        request.cookies = {"session_id": self._session_id}
        try:
            resp = self._perform_request(request, timeout)
        except bf_errors.InvalidSessionError:
            # The session likely expired. Try again with the username and
            # password to fetch a new session
            request.cookies = None
            return self._send_with_credentials(request, timeout)

        return resp
예제 #2
0
    def _setup_request(self, request: Request) -> None:
        """
        Устанавливаем произвольный заголовок и, при наличии, токен авторизации
        """
        super()._setup_request(request)
        request.headers['Custom-Header'] = self.custom_header
        if self.auth_token is not None:
            if request.cookies is None:
                request.cookies = {}
            request.cookies['auth-token'] = self.auth_token

        # Информация для отладки
        authenticated_status_msg = (
            ('not ' if self.auth_token is None else '') + 'authenticated')
        print(f'@ {authenticated_status_msg} request to {request.url}')
예제 #3
0
def sendHttpRequest(_args):
    s = Session()
    url = makeURL(_args)
    req = Request(_args.get("method"), url)
    if (_args.get("headers") is not None) : req.headers = _args.get("headers")
    if (_args.get("auth") is not None) : req.auth = HTTPBasicAuth(_args.get("auth")[0], _args.get("auth")[1])
    if (_args.get("params") is not None) : req.params = _args.get("params")
    if (_args.get("cookies") is not None) : req.cookies = _args.get("cookies")
    if (_args.get("data") is not None) : req.data = _args.get("data")

    prepped = req.prepare()
    if (_args.get("body") is not None) : prepped.body = _args.get("body")

    # do something with prepped.body
    # do something with prepped.headers

    resp = s.send(prepped,timeout=_args.get("timeout"), proxies=_args.get("proxies"))
    return resp
예제 #4
0
def sendHttpRequest(_args):
    s = Session()
    url = makeURL(_args)
    req = Request(_args.get("method"), url)
    if (_args.get("headers") is not None): req.headers = _args.get("headers")
    if (_args.get("auth") is not None):
        req.auth = HTTPBasicAuth(_args.get("auth")[0], _args.get("auth")[1])
    if (_args.get("params") is not None): req.params = _args.get("params")
    if (_args.get("cookies") is not None): req.cookies = _args.get("cookies")
    if (_args.get("data") is not None): req.data = _args.get("data")

    prepped = req.prepare()
    if (_args.get("body") is not None): prepped.body = _args.get("body")

    # do something with prepped.body
    # do something with prepped.headers

    resp = s.send(prepped,
                  timeout=_args.get("timeout"),
                  proxies=_args.get("proxies"))
    return resp
예제 #5
0
    def __callRequest(self, jsonDecode=False):
        if self.__enableDNS:
            import socket
            self.save_getaddrinfo = socket.getaddrinfo
            socket.getaddrinfo = self.new_getaddrinfo

        if self.__aParamatersLine:
            sParameters = self.__aParamatersLine
        else:
            sParameters = self.__aParamaters

        if (self.__cType == cRequestHandler.REQUEST_TYPE_GET):
            if (len(sParameters) > 0):
                if (self.__sUrl.find('?') == -1):
                    self.__sUrl = self.__sUrl + '?' + str(sParameters)
                    sParameters = ''
                else:
                    self.__sUrl = self.__sUrl + '&' + str(sParameters)
                    sParameters = ''

        sContent = ''

        if self.BUG_SSL == True:
            self.verify = False

        if self.__cType == cRequestHandler.REQUEST_TYPE_GET:
            method = "GET"
        else:
            method = "POST"

        oResponse = None
        try:
            _request = Request(method,
                               self.__sUrl,
                               headers=self.__aHeaderEntries)
            if method in ['POST']:
                _request.data = sParameters

            if self.__Cookie:
                _request.cookies = self.__Cookie

            if self.json:
                _request.json = self.json

            prepped = _request.prepare()
            self.s.headers.update(self.__aHeaderEntries)

            oResponse = self.s.send(prepped,
                                    timeout=self.__timeout,
                                    allow_redirects=self.redirects,
                                    verify=self.verify)
            self.__sResponseHeader = oResponse.headers
            self.__sRealUrl = oResponse.url

            if jsonDecode == False:
                sContent = oResponse.content

                #Necessaire pour Python 3
                if isMatrix() and not 'youtube' in oResponse.url:
                    try:
                        sContent = sContent.decode('unicode-escape')
                    except:
                        try:
                            sContent = sContent.decode()
                        except:
                            pass
            else:
                sContent = oResponse.json()

        except ConnectionError as e:
            # Retry with DNS only if addon is present
            from Plugins.Extensions.IPTVPlayer.tsiplayer.addons.resources.lib import xbmcvfs
            if xbmcvfs.exists('special://home/addons/script.module.dnspython/'
                              ) and self.__enableDNS == False:
                self.__enableDNS = True
                return self.__callRequest()
            else:
                error_msg = addon().VSlang(30470)

        except RequestException as e:
            if 'CERTIFICATE_VERIFY_FAILED' in str(e) and self.BUG_SSL == False:
                self.BUG_SSL = True
                return self.__callRequest()
            elif 'getaddrinfo failed' in str(e) and self.__enableDNS == False:
                # Retry with DNS only if addon is present
                from Plugins.Extensions.IPTVPlayer.tsiplayer.addons.resources.lib import xbmcvfs
                if xbmcvfs.exists(
                        'special://home/addons/script.module.dnspython/'):
                    self.__enableDNS = True
                    return self.__callRequest()
                else:
                    error_msg = addon().VSlang(30470)
            else:
                error_msg = "%s (%s),%s" % (addon().VSlang(30205), e,
                                            self.__sUrl)

            dialog().VSerror(error_msg)
            sContent = ''

        if oResponse.status_code in [503, 403]:
            if not "Forbidden" in sContent:
                #Default
                CLOUDPROXY_ENDPOINT = 'http://localhost:8191/v1'
                try:
                    json_session = post(CLOUDPROXY_ENDPOINT,
                                        headers=self.__aHeaderEntries,
                                        data=dumps({'cmd': 'sessions.list'}))
                except:
                    dialog().VSerror("%s" % (
                        "Page protege par Cloudflare, veuillez executer  FlareSolverr."
                    ))

                #On regarde si une session existe deja.
                if json_session.json()['sessions']:
                    cloudproxy_session = json_session.json()['sessions'][0]
                else:
                    json_session = post(CLOUDPROXY_ENDPOINT,
                                        headers=self.__aHeaderEntries,
                                        data=dumps({'cmd': 'sessions.create'}))
                    response_session = loads(json_session.text)
                    cloudproxy_session = response_session['session']

                self.__aHeaderEntries[
                    'Content-Type'] = 'application/x-www-form-urlencoded' if (
                        method == 'post') else 'application/json'

                #Ont fait une requete.
                json_response = post(CLOUDPROXY_ENDPOINT,
                                     headers=self.__aHeaderEntries,
                                     data=dumps({
                                         'cmd':
                                         'request.%s' % method.lower(),
                                         'url':
                                         self.__sUrl,
                                         'session':
                                         cloudproxy_session,
                                         'postData':
                                         '%s' % urlEncode(sParameters) if
                                         (method.lower() == 'post') else ''
                                     }))

                http_code = json_response.status_code
                response = loads(json_response.text)
                if 'solution' in response:
                    if self.__sUrl != response['solution']['url']:
                        self.__sRealUrl = response['solution']['url']

                    sContent = response['solution']['response']

        if oResponse and not sContent:
            #Ignorer ces deux codes erreurs.
            ignoreStatus = [200, 302]
            if oResponse.status_code not in ignoreStatus:
                dialog().VSerror("%s (%d),%s" %
                                 (addon().VSlang(30205), oResponse.status_code,
                                  self.__sUrl))

        if sContent:
            if (self.__bRemoveNewLines == True):
                sContent = sContent.replace("\n", "")
                sContent = sContent.replace("\r\t", "")

            if (self.__bRemoveBreakLines == True):
                sContent = sContent.replace(" ", "")

        if self.__enableDNS:
            socket.getaddrinfo = self.save_getaddrinfo
            self.__enableDNS = False

        return sContent
예제 #6
0
    def __callRequest(self, jsonDecode=False):
        if self.__enableDNS:
            import socket
            self.save_getaddrinfo = socket.getaddrinfo
            socket.getaddrinfo = self.new_getaddrinfo

        if self.__aParamatersLine:
            sParameters = self.__aParamatersLine            
        else:
            sParameters = self.__aParamaters

        if (self.__cType == cRequestHandler.REQUEST_TYPE_GET):
            if (len(sParameters) > 0):
                if (self.__sUrl.find('?') == -1):
                    self.__sUrl = self.__sUrl + '?' + str(sParameters)
                    sParameters = ''
                else:
                    self.__sUrl = self.__sUrl + '&' + str(sParameters)
                    sParameters = ''

        sContent = ''

        if self.__cType == cRequestHandler.REQUEST_TYPE_GET:
            method = "GET"
        else:
            method = "POST"

        try:
            _request = Request(method, self.__sUrl, headers=self.__aHeaderEntries)
            if method in ['POST', 'PATCH', 'PUT']:
                _request.data = sParameters

            if self.__Cookie:
                _request.cookies = self.__Cookie

            if self.json:
                _request.json = self.json

            prepped = _request.prepare()
            self.s.headers.update(self.__aHeaderEntries)
            oResponse = self.s.send(prepped, timeout=self.__timeout, allow_redirects=self.redirects, verify=self.verify)
            self.__sResponseHeader = oResponse.headers
            self.__sRealUrl = oResponse.url

            if jsonDecode==False:
                sContent = oResponse.content

                #Necessaire pour Python 3
                if isMatrix():
                    try:
                       sContent = sContent.decode('unicode-escape')
                    except:
                        try:
                            sContent = sContent.decode()
                        except:
                            pass
            else:
                sContent = oResponse.json()

        except HTTPError as e:
            if 'CERTIFICATE_VERIFY_FAILED' in str(e.reason) and self.BUG_SSL == False:
                self.BUG_SSL = True
                return self.__callRequest()
            elif 'getaddrinfo failed' in str(e.reason) and self.__enableDNS == False:
                # Retry with DNS only if addon is present
                import xbmcvfs
                if xbmcvfs.exists('special://home/addons/script.module.dnspython/'):
                    self.__enableDNS = True
                    return self.__callRequest()
                else:
                    error_msg = addon().VSlang(30470)
            else:
                error_msg = "%s (%s),%s" % (addon().VSlang(30205), e.reason, self.__sUrl)

            dialog().VSerror(error_msg)
            sContent = ''

        if oResponse.status_code == 503:

            # Protected by cloudFlare ?
            from resources.lib import cloudflare
            if cloudflare.CheckIfActive(sContent):
                cookies = self.GetCookies()
                VSlog('Page protegee par cloudflare')
                CF = cloudflare.CloudflareBypass()
                sContent = CF.GetHtml(self.__sUrl, sContent, cookies, sParameters, oResponse.headers)
                self.__sRealUrl, self.__sResponseHeader = CF.GetReponseInfo()

        if not sContent:
            #Ignorer ces deux codes erreurs.
            ignoreStatus = [200,302]
            if oResponse.status_code not in ignoreStatus:
                dialog().VSerror("%s (%d),%s" % (addon().VSlang(30205), oResponse.status_code, self.__sUrl))

        if sContent:
            if (self.__bRemoveNewLines == True):
                sContent = sContent.replace("\n", "")
                sContent = sContent.replace("\r\t", "")

            if (self.__bRemoveBreakLines == True):
                sContent = sContent.replace(" ", "")

        if self.__enableDNS:
            socket.getaddrinfo = self.save_getaddrinfo
            self.__enableDNS = False

        return sContent