vicenteneto / python-cartolafc

Uma interface em Python para a API Rest do Cartola FC
MIT License
67 stars 25 forks source link

Authentication failure #74

Open gumalobato opened 3 years ago

gumalobato commented 3 years ago

Aparentemente desde hoje começou a ocorrer erro de autenticação ao tentar logar via api:

api = cartolafc.Api(email=xxxxxxxx@xxxxx.xxx', password='xxxxxxxxxxx')

File "(...)\python-cartolafc-master\cartolafc\api.py", line 72, in __init__
    self.set_credentials(email, password)
  File "(...)\python-cartolafc-master\cartolafc\api.py", line 104, in set_credentials
    body = response.json()
  File "(...)\lib\site-packages\requests\models.py", line 900, in json
    return complexjson.loads(self.text, **kwargs)
  File "(...)\appdata\local\programs\python\python38-32\lib\json\__init__.py", line 357, in loads
    return _default_decoder.decode(s)
  File (...)\appdata\local\programs\python\python38-32\lib\json\decoder.py", line 337, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "(...)\appdata\local\programs\python\python38-32\lib\json\decoder.py", line 355, in raw_decode
    raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
aebrag commented 3 years ago

Pessoal, estou tendo o mesmo problema na autenticação, alguém conseguiu descobrir o que está acontecendo.

gumalobato commented 3 years ago

ainda não peguei novamente pra estudar o problema com o final da temporada. Porém, o que havia visto é que o problema tá relacionado ao captcha.

aebrag commented 3 years ago

Faz sentido, vou tentar dar uma olhada também por esse caminho, estou precisando resolver esse problema para fazer o fechamento da minha liga. Se descobrir algo me avise, por favor.

abs e obrigado até aqui.

gumalobato commented 3 years ago

Boa tarde @aebrag conseguiu algo relacionado a autenticação do rCaptcha? Tentei algumas formas aqui e ainda n foi possível. Se alguém tiver um caminho bom a seguir agradeço.

aebrag commented 3 years ago

Ei @gumalobato, também não consegui, todas as minhas tentativas deram errado. Achei um fórum que a turma conseguiu resolver mas usando C#, porém preciso em Python e não consegui replicar. A turma fala em pegar o "GLBID" dos cookies e enviar junto dos request pra autenticar, mas não sei fazer isso. Dá uma no fim desse link aqui: https://gitter.im/cartrolandofc/dev

gumalobato commented 3 years ago

@aebrag Acabou que coincidentemente eu vi lá também sem ter lido seu comentário, mas seguindo as dicas desse fórum consegui puxar as informações que precisava. Claro, ainda está "manual" mas já é algo que pra mim resolve, já que meu script é somente para puxar as informações de pontuação e patrimônio para controle interno de 2 ligas que administro.

Para conseguir puxar essas informações eu: 1 - loguei no browser mesmo com meu login do cartola 2 - Peguei o GLBID -> Para isso pode ser de várias formas, a mais fácil é no proprio link de informações do teu user: https://login.globo.com/api/user. Outra forma que peguei é no arquivo sqlite de cookies do navegador (uso o firefox), fica em %APPDATA%/Mozilla/Firefox/Profiles/ ... /cookies (caso utilize Windows). Pra essa última pode usar DB Browser Sqlite (mais fácil) ou até mesmo o notepad. 3 - Insiro isso no meu script, a propria biblioteca aqui já esperava na chamada da Api() em self._glbid = None, substitui ela pelo cookie que peguei

    def __init__(self, email=None, password=None, attempts=1, redis_url=None, redis_timeout=10):
        """ Instancia um novo objeto de cartolafc.Api.

        Args:
            email (str): O e-mail da sua conta no CartolaFC. Requerido se o password for informado.
            password (str): A senha da sua conta no CartolaFC. Requerido se o email for informado.
            attempts (int): Quantidade de tentativas que serão efetuadas se os servidores estiverem sobrecarregados.
            redis_url (str): URL para conectar ao servidor Redis, exemplo: redis://user:password@localhost:6379/2.
            redis_timeout (int): O timeout padrão (em segundos).

        Raises:
            cartolafc.CartolaFCError: Se as credenciais forem inválidas ou se apenas um dos
            dois argumentos (email e password) for informado.
        """

        self._api_url = 'https://api.cartolafc.globo.com'
        self._auth_url = 'https://login.globo.com/api/authentication'
        self._email = email
        self._password = password
        self._glb_id = '<insira aqui o cookie>' # <<<<<<<<<<<<<<<--------------------modificação
        #self._glb_id = None
        self._attempts = attempts if isinstance(attempts, int) and attempts > 0 else 1
        self._redis_url = redis_url
        self._redis_timeout = redis_timeout if isinstance(redis_timeout, int) and redis_timeout > 0 else 10
        self._redis = None`

PS.: Dessa forma tá hardcode e claro, só vai funcionar enquanto esse cookie tiver vivo, se quiser melhorar pode chamar a autenticação da api passando o parâmetro glbid no construtor e setando ele na variável.

Feito isso, na classe principal ao inves de chamar:

api = Api(email=xxxxxx@xxxxx.com, password=xxxxxxx)

chamo só:

api = Api()

OU, quando alterar a chamada do construtor chamar:

api = Api(glbid='<cookie>'

Aí é só puxar a info q quiser tipo:

api.liga('nome_da_liga')
print(liga)
aebrag commented 3 years ago

Valeu @gumalobato vou fazer um teste aqui e aviso se deu certo. Se tiver alguma dificuldade faço contato contigo.

aebrag commented 3 years ago

@gumalobato, pra mim continua dando CaptchaBlank, como você resolveu na função set_credentials()? Tô colando ai duas formas diferentes que tentei, mas sem sucesso.

image

gumalobato commented 3 years ago

@aebrag Alterei somente a chamada a api, adicionando o atributo glb_id:

image

segue um exemplo:

image

aebrag commented 3 years ago

@gumalobato e onde você passa o e-mail e senha? Não precisa? Entendi que o glb_id que pegamos do cookie, depois de logado, é só o captcha. Fiz a alteração no código exatamente como seu exemplo acima, porém quando faço a chamada ganho um erro de autenticação.

image

Agora se faço a chamada passando o e-mail, senha e o glb_id, ganho um erro de montagem do JSON na chamada do request.json().

image

image

gumalobato commented 3 years ago

@aebrag Esse processo com o cookie é meio q uma "gambiarra" somente para conseguir logar através de um cookie de um login prévio da mesma maquina. Não pode excluir o cookie, ou se excluir vai ter que atualizar logando manualmente no site antes, pegando o glbd_id e passando na chamada da autenticação.

Se fizer dessa forma, não precisa passar o login e senha.

Mostra como fizeste o teu def __init__ da Api

aebrag commented 3 years ago

@gumalobato, me desculpe pela falta de atualização. O código está funcionando perfeitamente. Fiz conforme sua sugestão. Valeu!

cknakayama commented 2 years ago

Estou usando da forma que o amigo citou acima, pegando manualmente o glb_id do cookie e colocando manualmente no código e venho utilizando dessa forma desde então, mas alguem conseguiu alguam outra forma "sem gambiarra" pra fazer?

Alguns aplicativos que utilizo o cartola, ao fazer o login ele abre a janela de login da globo para o usuario se logar e depois automaticamente volta para o app já logado. Alguem saberia me explicar como faço isso?