Coder Social home page Coder Social logo

pynubank's Introduction

pynubank

Python package PyPI - Python Version PyPI version Coverage Status Maintainability Join the chat at https://gitter.im/pynubank/pynubank

Acesse seus extratos do Nubank pelo Python (Baseado na versão js)

Instalação

Disponível via pip

pip install pynubank

Autenticação

Primeiro de tudo, precisamos nos autenticar.

Para isso, além do seu CPF e senha usuais, precisamos de um fator extra de autenticação.

Temos 3 opções disponíveis, com seus respectivos exemplos:

Tendo seguido com sucesso uma das opções, você pode tentar um dos exemplos a seguir!

Exemplos

⚠️ Atenção: O Nubank pode bloquear a sua conta por 72 horas caso detecte algum comportamento anormal ! Por conta disso, evite enviar muitas requisições. Você também pode utilizar o MockHttpClient descrito abaixo.

Realizando testes com dados falsos

Você pode utilizar este recurso para receber dados falsos para testar a sua solução sem correr riscos de ser bloqueado pelo Nubank e com tempo de resposta instantâneo. Para isso, utilize o exemplo a seguir:

from pynubank import Nubank, MockHttpClient

nu = Nubank(MockHttpClient())
nu.authenticate_with_cert("qualquer-cpf", "qualquer-senha", "caminho/do_certificado.p12") # Essa linha funciona porque não estamos chamando o servidor do Nubank ;)

# Qualquer método chamado não passará pelo Nubank e terá o retorno instantâneo.

Cartão de Crédito

from pynubank import Nubank

nu = Nubank()

# Insira aqui o código para se autenticar!
# Veja a seção acima sobre autenticação para mais detalhes ;)

# Lista de dicionários contendo todas as transações de seu cartão de crédito
card_statements = nu.get_card_statements()

# Retorna um dicionário contendo os detalhes de uma transação retornada por get_card_statements()
# Contém as parcelas da transação
card_statement_details = nu.get_card_statement_details(card_statements[0])

# Soma de todas as compras
print(sum([t['amount'] for t in card_statements]))

# Lista de dicionários contendo todas as faturas do seu cartão de crédito
bills = nu.get_bills()

# Retorna um dicionário contendo os detalhes de uma fatura retornada por get_bills()
bill_details = nu.get_bill_details(bills[1])

NuConta

from pynubank import Nubank

nu = Nubank()

# Insira aqui o código para se autenticar!
# Veja a seção acima sobre autenticação para mais detalhes ;)

# Lista de dicionários contendo todas as transações de seu cartão de crédito
account_statements = nu.get_account_statements()

# Soma de todas as transações na NuConta
# Observacão: As transações de saída não possuem o valor negativo, então deve-se olhar a propriedade "__typename".
# TransferInEvent = Entrada
# TransferOutEvent = Saída
# TransferOutReversalEvent = Devolução
print(sum([t['amount'] for t in account_statements]))

# Saldo atual
print(nu.get_account_balance())

Mais exemplos

A pasta examples possui mais referencias de uso com autenticação e visualização dos dados.

Testes

  1. Instale os requirements
  2. Execute o comando pytest
$ pip install -r requirements.txt
$ pip install -r requirements-test.txt

$ pytest

Contribuindo

Envie sua PR para melhorar esse projeto ! 😋

pynubank's People

Contributors

3t1n avatar andreroggeri avatar azneto avatar caioicy avatar chewfred avatar dependabot-preview[bot] avatar dependabot[bot] avatar fabionvs avatar fsmiamoto avatar gitter-badger avatar guifabrin avatar j0mba avatar janjitsu avatar jeffersantoss avatar johndelara1 avatar julianolf avatar leogregianin avatar louis-kevin avatar lrezende avatar lucasrcezimbra avatar marcoaaguiar avatar mateusglucas avatar pfsmorigo avatar pyup-bot avatar roarena avatar tcortega avatar teofilosalgado avatar thiagobrito avatar ulisses1478 avatar victormartinez avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

pynubank's Issues

NuException does not show which status code I actually got

exception looks like this:

Traceback (most recent call last):
  File "main.py", line 11, in <module>
    nu.authenticate_with_qr_code(os.environ['NU_CPF'], os.environ['NU_PWD'], uuid)
  File "/usr/local/lib/python3.8/site-packages/pynubank/nubank.py", line 96, in authenticate_with_qr_code
    auth_data = self._password_auth(cpf, password)
  File "/usr/local/lib/python3.8/site-packages/pynubank/nubank.py", line 79, in _password_auth
    data = self._handle_response(response)
  File "/usr/local/lib/python3.8/site-packages/pynubank/nubank.py", line 84, in _handle_response
    raise NuException(f'The request made failed with HTTP status code {response.status_code}',
pynubank.nubank.NuException
make: *** [run] Error 1

its probably a 422, but I think it should show it here...

Problemas com função _save_auth_data no arquivo nubank.py

Traceback (most recent call last):
File "", line 1, in
File "/home/sergio/Documentos/pynubank/pynubank/nubank.py", line 99, in authenticate_with_cert
self._save_auth_data(response)
File "/home/sergio/Documentos/pynubank/pynubank/nubank.py", line 63, in _save_auth_data
self.feed_url = auth_data['_links']['events']['href']
KeyError: 'events'

Este erro ocorre ao tentar autenticar. Precisei corrigir a função _save_auth_data do arquivo nubank.py substituindo os nomes de chaves que mudaram no request. A função corrigida fica assim:
def _save_auth_data(self, auth_data: dict) -> None:
self.client.set_header('Authorization', f'Bearer {auth_data["access_token"]}')
self.feed_url = auth_data['_links']['magnitude']['href']
self.query_url = auth_data['_links']['ghostflame']['href']
self.bills_url = auth_data['_links']['savings_account']['href']

Adicionar teste entre as versões do Python

  • Rodar os testes com o Tox entre as versões 3.6~3.9 (Acabei dropando a 3.5 em algum momento ao utilizar f-strings)
  • Adicionar label no README de qual versão é suportada

pynubank.nubank.NuException: The request made failed with HTTP status code 403

from pynubank import Nubank

uuid, qr_code = nu.get_qr_code()

qr_code.print_ascii(invert=True)

# O QRCode foi devidamente exibido e lido pelo app

nu.authenticate_with_qr_code('CPF', 'SENHA', uuid)

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Users/ricardochaves/.pyenv/versions/3.7.3/lib/python3.7/site-packages/pynubank/nubank.py", line 94, in authenticate_with_qr_code
    auth_data = self._password_auth(cpf, password)
  File "/Users/ricardochaves/.pyenv/versions/3.7.3/lib/python3.7/site-packages/pynubank/nubank.py", line 78, in _password_auth
    data = self._handle_response(response)
  File "/Users/ricardochaves/.pyenv/versions/3.7.3/lib/python3.7/site-packages/pynubank/nubank.py", line 83, in _handle_response
    raise NuException(response.status_code, response.json(), response.url)
pynubank.nubank.NuException: The request made failed with HTTP status code 403

Fiz o mesmo teste sem a linha qr_code.print_ascii(invert=True) e recebi o 401, logo entendo que o QRCode fez passar o 401 e agora foi para um 403.

O CPF e Senha estão corretos, por isso quando eu olho para o erro nessa função _password_auth eu fique sem conseguir avançar na investigação.

Estou agora fazendo uma investigação no site deles para tentar entender quais URLs devem ser usadas.

Criar contributing.MD

Adicionar documento para ajudar os contribuidores e organizar os branches para ficar mais organizado.

develop -> Branch para desenvolvimento de novas features
master -> Branch de "produção" onde contém o código que está publicado no PyPi (Podemos mudar a pipeline para sempre publicar no PyPi, só teria que tomar cuidado de fazer o bump antes de cada merge para a master)

Desativar QRCode

Ola,
O readme do projeto diz:

Caso a autenticação por QRCode esteja ativada na sua conta

Isso da a entender que é possivel desativar esse tipo de autenticacao.
Meu entendimento esta correto? Se sim, tem como mencionar no readme como desativar?

Obrigado

Erro ao retornar informações de token acesso

Ao acessar uma conta que o NuBank está direcionando para uma página para fazer uma autenticação utilizando QRCode. Neste caso, a API do Nubank retorna dados diferentes e não disponibiliza o feed_url dando um erro ao coletar esta informação do dicionário.

Na função authenticate, ao fazer a solicitação o retorno basicamente é este:

{'access_token': 'ACCESS_TOKEN', 'token_type': 'bearer', '_links': {'account_emergency': {'href': 'https://prod-s0-webapp-proxy.nubank.com.br/api/proxy/XXX'}, 'bill_emergency': {'href': 'https://prod-s0-webapp-proxy.nubank.com.br/api/proxy/XXX'}, 'revoke_token': {'href': 'https://prod-s0-webapp-proxy.nubank.com.br/api/proxy/XXX'}, 'revoke_all': {'href': 'https://prod-s0-webapp-proxy.nubank.com.br/api/proxy/XXX'}}, 'refresh_token': 'token', 'refresh_before': '2018-12-24T09:50:02Z'}

Exemplo do README quebrando

Olá, não consigo usar o exemplo com MockHttpClient descrito no README.md:

Traceback (most recent call last):
  File "extract_payments.py", line 10, in <module>
    card_statements = nu.get_card_statements()
  File "/home/wener/.local/lib/python3.8/site-packages/pynubank/nubank.py", line 107, in get_card_statements
    feed = self.get_card_feed()
  File "/home/wener/.local/lib/python3.8/site-packages/pynubank/nubank.py", line 104, in get_card_feed
    return self.client.get(self.feed_url)
  File "/home/wener/.local/lib/python3.8/site-packages/pynubank/utils/mock_http.py", line 37, in get
    result = self._find(url)
  File "/home/wener/.local/lib/python3.8/site-packages/pynubank/utils/mock_http.py", line 59, in _find
    if fnmatch.fnmatch(url, k[0]):
  File "/usr/local/lib/python3.8/fnmatch.py", line 34, in fnmatch
    name = os.path.normcase(name)
  File "/usr/local/lib/python3.8/posixpath.py", line 54, in normcase
    return os.fspath(s)
TypeError: expected str, bytes or os.PathLike object, not NoneType

A doc também está desatualizada, o import de MockHttpClient é em from pynubank.utils.mock_http e não no root. EM breve posso submeter o PR.

Quanto tempo é possível ficar autenticado?

Caso me autentique utilizando o QR Code, qual o limite até o Nubank desconectar a aplicação?

Queria deixar meus script atualizando minhas contas diariamente sem necessitar me autenticar todas as vezes.

Alguém já faz isso?

Exportar registros como OFX

Vários aplicativos importam contas via OFX. Ter uma maneira de coletar OFX de sua Nuconta ou cartão facilitaria muito o controle de gastos via aplicativos.

App não está lendo o QR code

Pessoal, o meu app não consegue ler o QR code gerado pela lib (no site está normal).
Screenshot_11
O app simplesmente não reconhece nenhum QR na tela :(
App no release do dia 25/03/19

Acesso com QR Code retornando erro

Olá, hj fui atualizar minhas contas e o tive o erro 403 retornado após o pynubank pedir o QR Code.

Fui acessar pelo site e notei que o QR Code não é mais pedido.

Antes havia um método na biblioteca para acesso sem QR Code, ainda não testei se esse método voltou a funciona.

^^

Problema com authenticate_with_qr_code

Acabei de conhecer a lib.
Tentei rodar o programa pelo console, mas encontro o seguinte erro:

>>> from nubank import *
>>> nu = Nubank()
>>> uuid, qr_code = nu.get_qr_code()
>>> qr_code.print_ascii(invert=True)
█████████████████████████████████████
█████████████████████████████████████
████ ▄▄▄▄▄ ██▄▀ █ ▀ ▀▀▄▄▄█ ▄▄▄▄▄ ████
████ █   █ █ ▀▀ ▄▄▀ ▀▀ ▄ █ █   █ ████
████ █▄▄▄█ █ ▀▄ ███▀█▄▄▄▀█ █▄▄▄█ ████
████▄▄▄▄▄▄▄█ █ █ █ █ █▄█ █▄▄▄▄▄▄▄████
████ █   ▄▄██████▀▀▄▄▄▀▀▄█ ▄  ▄█▀████
████▄▄ █▄▀▄▄█▄ ██ ▄▄█▄ ██▀█  █▄ █████
████▀▀▄▀ ▀▄▀▄█▀█▀█▄▄▀▄▄ ▄ ▀▄▀▄▄▀▀████
████▄█▀  ▀▄█▄█▀█ █▀ ██ █ █▄▄▀▀▄▀▀████
████▀▀▄▄  ▄█ █▄█▄▀▀█▄▄▀ █▄▀▀▀█▄▀▀████
████ ██ ▀█▄▄▀ ▀▀▄ ▄▄▄█▀▀▀▀█  █▄██████
████▄██▄▄█▄▄ ▄█  █▄▄▄▄▀█ ▄▄▄  ▄▄▀████
████ ▄▄▄▄▄ █▀█▄█▄█▀ █▄   █▄█ ▄█ █████
████ █   █ █  █▀▄█▀█▄ ▄█ ▄▄ ▄▄▄▀▀████
████ █▄▄▄█ █▄▄▀   ▀  █▄ ▀ ▄▀ ▄▄ █████
████▄▄▄▄▄▄▄█▄█▄███▄▄▄▄▄███▄▄██▄██████
█████████████████████████████████████
▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
>>> nu.authenticate_with_qr_code('CPF', 'SENHA', uuid)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Users/henriquecarvalho/github-repos/pynubank/pynubank/nubank.py", line 113, in authenticate_with_qr_code
    self.refresh_token = auth_data['refresh_token']
KeyError: 'refresh_token'

É algum problema com a informação enviada pelo Nubank?

(Enquanto estamos em uma issue, acho que a versão do pip está desatualizada)

O que é o client_secret e por que é fixo?

Estou usando a API e funciona perfeitamente, pretendo alterá-la para ter um controle explícito da frequência de requests, repasso as alterações se eu achar que deu certo.

De volta ao não-problema o que é esse "client_secret"? Parece um hash, mas é fixo. Imaginei que isso fosse causar erro ao tentar logar, mas fiz o login normalmente, tudo funciona.

A mesma pergunta é válida para "client_id" = "other.conta"

NuRequestException: The request made failed with HTTP status code 403

Ao rodar o código de exemplo abaixo recebo erro 403 (forbidden).

from pynubank import Nubank
nu = Nubank()
uuid, qr_code = nu.get_qr_code()
qr_code.print_ascii(invert=True)
input('Após escanear o QRCode pressione enter para continuar')
nu.authenticate_with_qr_code('XXXXXXXXXX', 'YYYYYYYYYY', uuid)

Executo via Jupyter, escaneio o QR Code e teclo ENTER. Em seguida recebo o erro.

Não está claro pra mim se estou fazendo algo errado.

Problemas na autenticação por QR Code

Ao rodar um dos exemplos, modificado, não estou conseguindo o resultado esperado com a
autenticação por QR Code.

Exemplo testado

# nu.py
from pynubank import Nubank

nu = Nubank()
uuid, qr_code = nu.get_qr_code()

nu.authenticate_with_qr_code('cpf', 'senha', uuid)

print(nu.get_account_balance())

Resultado

$ python nu.py
Traceback (most recent call last):
  File "nu.py", line 6, in <module>
    nu.authenticate_with_qr_code('cpf', 'senha', uuid)
  File "/home/shigueo/.local/lib/python3.8/site-packages/pynubank/nubank.py", line 82, in authenticate_with_qr_code
    response = self.client.post(self.discovery.get_app_url('lift'), json=payload)
  File "/home/shigueo/.local/lib/python3.8/site-packages/pynubank/utils/http.py", line 40, in post
    return self._handle_response(post(url, json=json, headers=self._headers, **self._cert_args))
  File "/home/shigueo/.local/lib/python3.8/site-packages/pynubank/utils/http.py", line 32, in _handle_response
    raise NuRequestException(response)
pynubank.exception.NuRequestException: The request made failed with HTTP status code 404
  • Python 3.8.5
  • pynubank 2.4.0

Esperado

Saldo na NuConta

Pelo visto houve alguma mudança no serviço lift.
Tentando fazer o request manualmente (com um token válido):

{
	"qr_code_id": "algum uuidv4",
	"type": "login-webapp"
}

retorna:

# 404 Not Found
{
  "error": "Not Found"
}

Não sei se cometi algum erro ou talvez seja algo que não possamos fazer nada sobre, mas achei importante comentar por aqui.

Valeu!

[Conta PJ] Opção de gerar boleto

Falei com o suporte Nubank, porém, há muito tempo sempre a mesma resposta de "sem previsão". Vi que a atual API é para Pessoa Física. Há alguma possibilidade de API para conta CNPJ? Se houver algum endpoint ou liberação, gostaria de ajudar a desenvolver, por enquanto estou no aguardo deles.

Problema com autenticação utilizando refresh_token

Ao me autenticar com CPF / Senha obtenho o access_token normalmente, mas o retorno do refresh_token é "string token". Dessa forma, só consigo me autenticar com o QRCode.

Além disso tive que comentar a linha: "self.refresh_token = auth_data['refresh_token']", pois estava dando 'Key Error' no "refresh_token".

Realmente as requisições não estão mais retornando o 'refresh_token'? Todas as vezes que eu precisar fazer uma requisição precisarei utilizar o QRCode?

Adicionar endpoint para detalhes da fatura

Olá! Gostaria de obter os detalhes da fatura. Até já implementei isso, porém tenho dúvidas sobre a melhor forma de implementação, uma forma simples seria:

def get_bill_details(self, bill):
    request = requests.get(bill['_links']['self']['href'], headers=self.headers)
    return json.loads(request.content.decode('utf-8'))

bill seria um elemento do array retornado por get_card_bills() mas talvez fica estranho passar para a função elementos de um resultado de uma response externa, talvez o resultado poderia se tornar um array de elementos definidos na aplicação, algo como:

class Bill
    (...)

Gostaria de umas dicas pois não tenho muita experiência com python profissionalmente, quais as melhores práticas, etc talvez links de projetos interessantes para seguir. #ajudaluciano

QRCode Para Efetivar Transferência

Olá!

Venho através deste, solicitar/opinar sobre um sistema interessante.
Seria basicamente um QRCode para ser escaneado e efetivado uma transferência de Nubank para Nubank.

Seria algo como:
Gerar um QRCode com os dados da pessoa que irá receber o valor da transferência.
Para fazer a transferência, seria direto pelo App > Transferir > QRCode, e definir o valor a ser transferido.

Grato!

Login por token ?

Rolou uma thread #109 sobre reaproveitar o token.

Acredito que seja possível inclusive fazer um "refresh" dele para que ele dure para sempre.

Por que não Pipenv?

Resolvi abrir essa issue com uma pergunta pois sei que nem todo desenvolvedor Python simpatiza com a ferramenta. Eu pessoalmente não consigo me imaginar iniciando um projeto novo hoje sem utilizar o Pipenv.

Os principais pontos que somam em sua utilização na minha opinião são:

  • Simplicidade e consistência na gestão de dependências;
  • Simplicidade na criação e manutenção de ambientes virtuais Python;
  • Possibilidade de criar "alias" e automatizar a execução de comandos verbosos e tediosos;
  • Permitir rodar comandos dentro do ambiente virtual Python sem precisar carregá-lo antes.

Esses são alguns dos pontos. Na página inicial do projeto tem mais detalhes de como funciona, quais as razões de se substituir os famosos requirements.txt, etc.

Se vocês acharem interessante eu posso enviar um PR substituindo os arquivos requirements pelo Pipfile. 🙂

404 ao executar nu.authenticate_with_qr_code()

Encontro erro durante autenticação.

NuRequestException                        Traceback (most recent call last)
 in 
      1 # Utilize o CPF sem pontos ou traços
----> 2 nu.authenticate_with_qr_code('XXXXXXXXXXXX', 'YYYYYYYYYYY', uuid)
      3 
      4 # Lista de dicionários contendo todas as transações de seu cartão de crédito
      5 card_statements = nu.get_card_statements()

C:\ProgramData\Anaconda3\lib\site-packages\pynubank\nubank.py in authenticate_with_qr_code(self, cpf, password, uuid)
     73         }
     74 
---> 75         response = self.client.post(self.discovery.get_app_url('lift'), json=payload)
     76 
     77         self._save_auth_data(response)

C:\ProgramData\Anaconda3\lib\site-packages\pynubank\utils\http.py in post(self, url, json)
     36 
     37     def post(self, url: str, json: dict) -> dict:
---> 38         return self._handle_response(post(url, json=json, headers=self._headers, **self._cert_args))

C:\ProgramData\Anaconda3\lib\site-packages\pynubank\utils\http.py in _handle_response(self, response)
     28     def _handle_response(self, response: Response) -> dict:
     29         if response.status_code != 200:
---> 30             raise NuRequestException(response)
     31 
     32         return response.json()

NuRequestException: The request made failed with HTTP status code 404

Exemplos ?

Hoje todos os exemplos estão no README.

Criar uma pasta demos com alguns exemplos:

  • Login por token (#109)
  • Exemplo simples de autenticação
  • Utilizando a biblioteca pandas
  • Plotar um gráfico com matplot (Distribuição por categoria, evolução de saldo da nuconta)

Autenticação com QRCode voltou a ser obrigatória

Boa tarde pessoal, tudo bem?

Passando aqui só para avisar que a autenticação com QRCode voltou a ser necessária para fazer autenticação. Parece que é algo bem recente, pois na terça-feira estava funcionando sem a necessidade do QRCode.

Acredito que seria melhor deixar as duas formas de autenticação no Pynubank, para poder alternar entre elas sem precisar alterar o código.

Abraço!

Erro 429

Estou recebendo 'too many requests' com o erro 429, mesmo pra uma primeira requisição.

Vocês estão conseguindo usar normal?

AttributeError: 'str' object has no attribute 'uuid4'


AttributeError Traceback (most recent call last)
in
1 # Utilize o CPF sem pontos ou traços
2 nu = Nubank()
----> 3 uuid, qr_code = nu.get_qr_code()
4 #nu.authenticate_with_qr_code('REDACTED', 'REDACTED', uuid)
5 qr_code.print_ascii(invert=True)

in get_qr_code(self)
86
87 def get_qr_code(self) -> Tuple[str, QRCode]:
---> 88 content = str(uuid.uuid4())
89 qr = QRCode()
90 qr.add_data(content)

AttributeError: 'str' object has no attribute 'uuid4'

Obter detalhes de faturas futuras

Boa noite, pessoal!

Estou montando algumas análises sobre faturas e esbarrei Em um problema discutido anteriormente sobre as faturas com o estado 'state': 'future', visto que o get_bill_details retorna KeyError para as faturas que não estão com status 'state': 'open'.

Alguém já conseguiu uma solução para este cenário? Tentei dar algumas vasculhadas nos links mas tive certa dificuldade com essa situação específica...

Cuidado ao bumpar minor versions

Estava usando a versão anterior que a autenticação com QR Code era assim:

nubank = Nubank(NUBANK_CPF, NUBANK_PASSWORD, allow_qr_code_auth=True)

daí atualizei a versão pensando que não tinha nenhuma breaking change, dado que foi um minor version, mas a vi que a autenticação via QR Code está completamente diferente, quebrando meu serviço:

nubank = Nubank()
uuid, qr_code = nubank.get_qr_code()
qr_code.print_ascii(invert=True)
input('Após escanear o QRCode pressione enter para continuar')
nubank.authenticate_with_qr_code(NUBANK_CPF, NUBANK_PASSWORD, uuid)

Então deixo minha sugestão/pedido de usarmos Semantic Versioning e atualizar a major version quando a modificação quebrar a retrocompatibilidade.

Inclusão de mais propriedades dos headers da requisição

Para melhorar o acesso e diminuir o bloqueio da API do Nubank com o retorno Too many requests (429)
poderia incluir mais propriedades dos headers. Os headers abaixo são do acesso pelo navegador permanecendo somente o user-agent.

    headers = {
        'Content-Type': 'application/json;charset=UTF-8',
        'X-Correlation-Id': 'WEB-APP.pewW9',
        'User-Agent': 'pynubank Client - https://github.com/andreroggeri/pynubank',
        'Accept': 'application/json, text/plain, */*',
        'Accept-Encoding': 'gzip, deflate, br',
        'Accept-Language': 'pt-BR,pt;q=0.9,en-US;q=0.8,en;q=0.7',
        'Connection': 'keep-alive',
        'DNT': '1',
        'Host': 'prod-s0-webapp-proxy.nubank.com.br',
        'Origin': 'https://app.nubank.com.br',
        'Referer': 'https://app.nubank.com.br/'
    }

Erro no fluxo de "Autenticando com QR Code"

Fui tentar usar a lib e deu o erro abaixo

A única diferença do código do README foram o meu cpf , senha de acesso e o argumento "allow_qr_code_auth=True"

O problema parece estar no print no terminal dos caracteres que compõe o QRCode de autenticação

Peguei pra mexer na lib pela primeira vez agora, então não é impossível que eu esteja deixando algo passar desapercebido...

Segue stacktrace:

You must authenticate with your phone to be able to access your data.
Scan the QRCode below with you Nubank application on the following menu:
Nu(Seu Nome) > Perfil > Acesso pelo site
Traceback (most recent call last):
File "C:\Program Files (x86)\Python37-32\lib\site-packages\pynubank\utils.py", line 8, in print_qr_code
get_ipython
NameError: name 'get_ipython' is not defined

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "min.py", line 6, in
allow_qr_code_auth=True
File "C:\Program Files (x86)\Python37-32\lib\site-packages\pynubank\nubank.py", line 33, in init
self.authenticate(cpf, password)
File "C:\Program Files (x86)\Python37-32\lib\site-packages\pynubank\nubank.py", line 102, in authenticate
self._qr_code_auth()
File "C:\Program Files (x86)\Python37-32\lib\site-packages\pynubank\nubank.py", line 64, in _qr_code_auth
utils.print_qr_code(str(content))
File "C:\Program Files (x86)\Python37-32\lib\site-packages\pynubank\utils.py", line 12, in print_qr_code
qr.print_ascii(invert=True)
File "C:\Program Files (x86)\Python37-32\lib\site-packages\qrcode\main.py", line 267, in print_ascii
out.write(codes[pos])
File "C:\Program Files (x86)\Python37-32\lib\encodings\cp1252.py", line 19, in encode
return codecs.charmap_encode(input,self.errors,encoding_table)[0]
UnicodeEncodeError: 'charmap' codec can't encode character '\u2588' in position 0: character maps to

Melhorar exemplos do readme

Algumas pessoas acabam tomando erro pq os exemplos do readme inicial não são completos.

Podemos melhorar a documentação para ter uma seção dedicada para autenticação (levando para os exemplos) e remover a autenticação dos outros exemplos pq está incompleta.

Substituição da biblioteca python-coveralls

A biblioteca python-coveralls está fadada a morrer, não é atualizada desde 2017 além de possuir um problema que gera conflito com outras bibliotecas como pytest-cov forçando pin-version de todas as bibliotecas que utilizem coverage != 4.0.3.

O recomendável é substituí-la pela biblioteca coveralls-python. Não é preciso nem alterar a chamada do cliente no CI pois ambas compartilham o mesmo nome para o commando: coveralls.

Fazer o cache das requisições

Por @janjitsu :

Você tocou num ponto interessante @andreroggeri ...
Na minha aplicação eu criei um cash das responses por que acabei ficando bloqueando também...
E se fizessemos esse cache no pynubank?

Claro que precisariamos ver uma forma mais inteligente de invalidá-lo. Mas pra mim faz sentido. Muita coisa não vai mudar e eu ainda não entendi muito bem qual a regra que bloqueia a máquina... Se soubessemos poderíamos antecipar o bloqueio na aplicação de alguma forma e evitá-lo.

Opção de mock por configuração

Bom dia a todos.

Estou querendo usar esta lib para um projeto, mas para evitar essas tretas de bloqueio eu estava pensando se não seria interessante a lib ter suporte a mock dentro dela mesmo como no exemplo abaixo:

nu = NubankMock()
uuid, qr_code = nu.get_qr_code()
nu.authenticate_with_qr_code('123456789', 'senha', uuid)
card_statements = nu.get_card_statements()

Acredito eu que dessa forma fica mais fácil para as pessoas implementarem seus apps ou mvp e após tudo estar funcionando, aí o mock seria substituido pela requisição real, o que acham?

Atualização com necessidade de QRCode

Olá!

Tenho um fork do código do Astrocoders e percebi que o Nubank começou a pedir um QRCode no site online para dar acesso à API, isso fez com que nossa estratégia de acessar a API quebrasse.

Pode testar se está funcionando para vocês?

Tem alguma ideia de como fazer funcionar após essa alteração?

Usar o GitHub Actions no lugar do Travis CI

Quando estava fazendo meu PR eu percebi uma certa demora na execução dos builds do Travis CI. Não é nada assustador nem nada.

Mas buscando melhorar um pouco mais o projeto e deixar tudo integrado ao máximo em uma ferramenta só e aumentar a agilidade, já pensou em usar o GitHub Actions para fazer a integração contínua? O que acha?

Erro 400 ao chamar o método get_account_statements

Olá, está retornando o erro abaixo, ao chamar o método nu.get_account_statements()

/opt/notebooks/nubank.py in _handle_response(self, response)
     85         if response.status_code != 200:
     86             raise NuException(response.status_code,
---> 87                               response.json(), response.url)
     88 
     89         return response.json()

NuException: The request made failed with HTTP status code 400

Bloqueado após uma requisição.

Estou sendo bloqueado após uma requisição.
Alguém está tendo o mesmo comportamento?

Recebo "Authentication failed. Too Many Requests (429)".

Keyerror: 'events' ao tentar nu.authenticate(user, passwd)

Ao seguir o próprio código do README, pra autenticar e pegar as contas anteriores. O código utilizado foi o seguinte:

import os
from pynubank import Nubank

user = os.getenv('NU_USER')
passwd = os.getenv('NU_PASSWD')

nu = Nubank()
nu.authenticate(user, passwd)

bills = nu.get_bills()
print(len(bills))

O que resultou no seguinte erro:

Traceback (most recent call last):
  File "accounting.py", line 11, in <module>
    nu.authenticate(user, passwd)
  File "/Users/lucas/miniconda3/envs/accounting/lib/python3.6/site-packages/pynubank/nubank.py", line 79, in authenticate
    self.feed_url = data['_links']['events']['href']
KeyError: 'events'

Usei o pacote instalando via pip.

Dúvida - geração de boletos

Existe algum dos endpoints que permite geração de cobrança? Igual vemos pelo App. Retornando qrcode + link

Procurei no fórum do nubank e aqui nos issues mas não achei nada

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.