dmachard / python-creditagricole-particuliers

Client Python, à destination des particuliers, souhaitant récupérer ses opérations bancaires stockées par le Crédit Agricole.
https://pypi.org/project/creditagricole-particuliers/
MIT License
39 stars 13 forks source link

Operations.get_operations: requests renvoie un json sans opérations si "&count=..." dans url #10

Closed PyThane closed 1 year ago

PyThane commented 1 year ago

Dans operations.py, class Operations:

def get_operations(self, count):
    """get operations according to the date range"""
    # convert date to timestamp
    ts_date_debut = datetime.strptime(self.date_start, "%Y-%m-%d")
    ts_date_debut = int(ts_date_debut.timestamp())*1000
    ts_date_fin = datetime.strptime(self.date_stop, "%Y-%m-%d")
    ts_date_fin = int(ts_date_fin.timestamp())*1000

    # call operations ressources
    url = "%s" % self.session.url
    url += "/%s/particulier/operations/synthese/detail-comptes/" % self.session.regional_bank_url
    url += "jcr:content.n3.operations.json?grandeFamilleCode=%s&compteIdx=%s" % (self.grandeFamilleCode, self.compteIdx)
    url += "&idDevise=EUR"
    url += "&dateDebut=%s" % ts_date_debut
    url += "&dateFin=%s" % ts_date_fin
    url += "&count=%s" % count

    r = requests.get(url=url, verify=self.session.ssl_verify, cookies=self.session.cookies)
    if r.status_code != 200:
        raise Exception( "[error] get operations: %s - %s" % (r.status_code, r.text) )
    # success, save list operations
    rsp = json.loads(r.text)
    for op in rsp["listeOperations"]:
        self.list_operations.append( Operation(op) )

requests.get(url=url, verify=self.session.ssl_verify, cookies=self.session.cookies) renvoie: {"count":0,"hasNext":false,"listeOperations":[]} alors qu'il existe des opérations à renvoyer.

Sans url += "&count=%s" % count, la requête renvoie la liste des opérations comme il se doit (mais avec un nombre limité d'opérations, ne correspondant pas aux bornes données par ts_date_debutet ts_date_fin.

Ce problème est récent mais je ne sais pas depuis quand (courant janvier certainement).

dmachard commented 1 year ago

Pas de soucis de mon côté, je viens de tester:

operations = account.get_operations(date_start="2023-01-01", date_stop="2023-01-31", count=60)

ça me retourne bien 60 items sur l'interval demandé

$ python3 get_operations.py  | wc -l
60

Tu as un exemple de l'url que tu appelles avec les arguments ?

PyThane commented 1 year ago

Pour le même intervalle:

operations = account.get_operations(date_start="2023-01-01",date_stop="2023-01-31", count=60) J'obtiens l'url suivante: https://www.credit-agricole.fr/ca-aquitaine/particulier/operations/synthese/detail-comptes/jcr:content.n3.operations.json?grandeFamilleCode=1&compteIdx=0&idDevise=EUR&dateDebut=1672527600000&dateFin=1675119600000&count=60

Et j'ai 45 opérations (Je n'ai pas vérifié mais ça doit être ça, mes opérations de cartes différées sont à part).

En faisant des tests pour te répondre je viens de remarquer quelque chose:

len(account.get_operations(date_start="2023-01-01",date_stop="2023-01-31", count=90).list_operations)

me renvoie toujours 45 opérations, mais à partir de ..., count=91), ça me renvoie 0...

len(account.get_operations(date_start="2020-01-01", date_stop="2023-01-31", count=90).list_operations) Je remonte à fin 2022, et j'ai 90 opérations

len(account.get_operations(date_start="2020-01-01", date_stop="2023-01-31", count=91).list_operations) 0 opérations...

Voilà je pense t'avoir tout dit.

Merci en tous cas

EDIT: Après quelques essais, il s'avère que ce qui a changé par rapport à avant, est que qu'un count > 90 ne renvoie plus aucune opération.

dmachard commented 1 year ago

donc une limitation côté CA, il doit y avoir le même comportement sur le site ?

PyThane commented 1 year ago

J'aurais dit oui mais bizarrement non... En défilant mes opérations sur le site je remonte assez loin avec plus de 90 opérations. Quelqu'un confirme avoir le même résultat?

P3173 commented 1 year ago

salut @PyThane j'ai exactement le même problème que toi ca marchait bien avant et la avec un count à 100 je récupère 0 opérations il y a bien une limite à 90 😞

gregoryBonnardel commented 1 year ago

Bonjour,

Je reproduis également le même résultat, à savoir que quand le count > 90 alors il y a 0 opérations.

Sur le site de la banque, ils semblent récupérer les infos sur deux endpoints différents :

Les autres appels (B) semblent accepter un paramètre startIndex (dont on trouve la valeur à utiliser dans un appel précedent) Info : la réponse des appels (B) semble être un sous-ensemble des appels (A) (noeud = compte.operationsInfo)

Les réponses des appels (A) et (B) contiennent un attribut nextSetStartIndex :

gregoryBonnardel commented 1 year ago

Vous serez indulgent avec moi j'espère n'ayant jamais fais de Python. Je me suis tout de même permis de modifier la méthode Opererations.get_operations pour :