Forum Programmation.python Question de newbie sur la soumission de formulaire avec python-request

Posté par  (site web personnel) . Licence CC By‑SA.
Étiquettes : aucune
2
2
oct.
2024

Bonjour,

Je viens ici après 2h sur internet à chercher la solution. Pour information je ne suis pas développeur web ou réseaux, beaucoup de chose m’échappe. C’est aussi l’occasion pour moi de mieux comprendre.

J’essaye de parser un site (qui semble codé alarache) pour connaître le budget restant sur mon badge pour la cantine. Voici comment cela se passe avec Firefox.

La page d’accueil est ici “1”

https://www.e-chargement.com/default.asp

j’y mentionne mon numéro de badge et mon nom, je clique et j’arrive ici en “2”

https://www.e-chargement.com/recharg_badge.asp

où il est mentionné le reste et la possibilité de recharger.

Je peux recharger autant de fois que je veux cette page “2” je vois la même chose. Si je n’ai pas renseigné les infos de la page “1” je vois ce que vous voyez vous, la page “1” j’imagine.

Bon si je retourne encore en page “1”, bah c’est comme si je m’étais pas identifié (ouaip…).

Bref, j’ai essayé avec la bibliothèque python request et j’arrive jamais en page 2. J’ai essayé avec les sessions (histoire de cookie je sais pas…)

response_post = session.post(url, data=payload)
avec payload qui ressemble a

payload = {
"badge_number": "un_nombre",
"badge_nom": "mon_nom",
}
parce que c’est ce que j’ai compris pour la soumission de formulaire (method="post") quand j’inspecte. J’ai essayé plein de truc, mais je sais pas où chercher l’info pour que ça marche.

Merci de votre aide

FO

  • # hello

    Posté par  . Évalué à 2 (+1/-0).

    Le service e-chargement de votre restaurant est actuellement indisponible pour maintenance. Le rétablissement est prévu ce jour à 17h. Avec nos excuses pour le désagrément occasionné

    Alors, je sais pas depuis quel jour a 17H il est sense etre retabli, mais ceci explique peut-etre tes deboires

    ++
    Gi)

    • [^] # Re: hello

      Posté par  (site web personnel) . Évalué à 2 (+1/-0).

      J'ai jamais vu un site pareil, si tu vas sur

      https://www.e-chargement.com/orsayuniversite/restau/

      je tombe sur la bonne page, avec l'url transformé en celle que je mentionne. Le message que tu raportes est toujours là. Le site rend le service attendu en tout cas. Ça me rend toctoc :)…

      • [^] # Re: hello

        Posté par  . Évalué à 2 (+1/-0).

        Alors du coup, la premiere etape va consister a faire un GET https://www.e-chargement.com/orsayuniversite/restau/ pour suivre le redirect (302) puis t'assurer que tu es bien tombe sur default.asp et que le formulaire est dispo, ensuite seulement tu pourras passer au POST vers identif_badge.Asp

        En ponçant un peu l'onglet reseau de la console dev dans le navigateur, tu devrais pouvoir t'en sortir.

        Et si tu t'en sors pas avec request ou qu'il y a du cloudfare ou equivalent planque (mais j'ai pas l'impression), tu peux aussi essayer avec playwright par exemple.

        Bon courage.

        ++
        Gi)

  • # MechanicalSoup

    Posté par  . Évalué à 3 (+2/-0).

    Voici une solution avec MechanicalSoup, une surcouche à requests et BeautifulSoup (un analyseur de HTML) :

    import re
    from mechanicalsoup import StatefulBrowser
    
    browser = StatefulBrowser()
    browser.open('https://www.e-chargement.com/orsayuniversite/restau/')
    browser.select_form()
    browser['badge_number'] = '12345'
    browser['badge_nom'] = 'Nom Prénom'
    browser.submit_selected()
    for td in browser.page.find_all('td'):
        if td.find(string=re.compile('Solde')):
            break
    print(td.find_next_sibling().string)

    Les variables browser.page et td sont des objets BeautifulSoup. Il faut lire un peu la doc pour comprendre comment ils marchent.

    MechanicalSoup automatise quelques opérations qu'on pourrait réaliser manuellement avec requests. L'idée est d'aller sur la page https://www.e-chargement.com/orsayuniversite/restau/, puis de poster le formulaire, et exploiter la page obtenue.

    Avec requests, ça donnerait un truc du genre :

    session = requests.Session()
    session.get('https://www.e-chargement.com/orsayuniversite/restau/')

    pour initialiser la session. Puis il faut poster le formulaire :

    reponse = session.post('https://www.e-chargement.com/identif_badge.Asp', data={
        'badge_number': '12345', 'badge_nom': 'Nom Prénom', 'badge_div': '1234'
    })

    La valeur de badge_div est celle d'un <input type="hidden"> du formulaire, à récupérer avec BeautifulSoup. Après il reste à exploiter reponse.text.

    Les sessions requests se chargent de gérer les redirections et les cookies.

  • # FF + curl

    Posté par  . Évalué à 2 (+0/-0).

    dans firefox,

    • charger la page du formulaire
    • faire F12, aller sur l'onglet réseau
    • remplir le formulaier et faire submit

    La première ligne qui s'affiche dans l'onglet réseau est la requête de soumission du formulaire.
    Faire click-droit, "copy as curl", chez moi ça donne:

    curl 'https://www.e-chargement.com/identif_badge.Asp' \
      -X POST
      -H 'User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:131.0) Gecko/20100101 Firefox/131.0'  \
      -H 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/png,image/svg+xml,*/*;q=0.8'  \
      -H 'Accept-Language: en-US,en;q=0.8,fr-FR;q=0.5,fr;q=0.3'  \
      -H 'Accept-Encoding: gzip, deflate, br, zstd'  \
      -H 'Content-Type: application/x-www-form-urlencoded'  \
      -H 'Origin: https://www.e-chargement.com'  \
      -H 'Connection: keep-alive'  \
      -H 'Referer: https://www.e-chargement.com/identif_badge.Asp'  \
      -H 'Cookie: badge%5Fdiv=6891; ASPSESSIONIDQUBACAAT=FDKMPLPCMIPOBAABEOONALHE; home_url=; parent_entrance=; origurl=; retour_url=; mobiledevice=0; mobiledevice=0'  \
      -H 'Upgrade-Insecure-Requests: 1'  \
      -H 'Sec-Fetch-Dest: document'  \
      -H 'Sec-Fetch-Mode: navigate'  \
      -H 'Sec-Fetch-Site: same-origin'  \
      -H 'Sec-Fetch-User: ?1'  \
      -H 'Priority: u=0, i' \
      --data-raw 'badge_div=6891&badge_number=compte&badge_nom=nom'

    Le plus important étant la deuxième ligne - on fait un POST - et la dernière qui donne le format des informations attendue.

    En jouant cette commande telle quelle dans un terminal, on retrouve le même résultat que dans le navigateur.

    Après, on peut s'amuser à enlever les lignes d'entête (-H) qui paraissent inutiles jusqu'à ce que cela ne marche plus. On peut aussi combiner deux requêtes pour récupérer des cookies si nécessaire. Mais la base est là.

    Happy scraping.

  • # Résolu

    Posté par  (site web personnel) . Évalué à 1 (+0/-0).

    Bonjour et merci beaucoup pour votre aide. J'ai appris des trucs mais je suis pas encore super affûté sur les requêtes, redirection, curl etc.

    La solution avec MechanicalSoup à très bien marché, et même direct, donc merci !

Envoyer un commentaire

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.