python-cartolafc icon indicating copy to clipboard operation
python-cartolafc copied to clipboard

Authentication failure

Open gumalobato opened this issue 4 years ago • 13 comments

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

api = cartolafc.Api([email protected]', 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)

gumalobato avatar Feb 23 '21 20:02 gumalobato

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

aebrag avatar Mar 01 '21 17:03 aebrag

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.

gumalobato avatar Mar 01 '21 21:03 gumalobato

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.

aebrag avatar Mar 02 '21 11:03 aebrag

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.

gumalobato avatar May 01 '21 17:05 gumalobato

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

aebrag avatar May 05 '21 12:05 aebrag

@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 protected], 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)

gumalobato avatar May 05 '21 23:05 gumalobato

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

aebrag avatar May 10 '21 12:05 aebrag

@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

aebrag avatar May 13 '21 19:05 aebrag

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

image

segue um exemplo:

image

gumalobato avatar May 13 '21 20:05 gumalobato

@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

aebrag avatar May 13 '21 23:05 aebrag

@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

gumalobato avatar Jun 01 '21 05:06 gumalobato

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

aebrag avatar Jun 01 '21 16:06 aebrag

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?

cknakayama avatar Nov 22 '21 15:11 cknakayama