Impossible de laisser mon script générer automatiquement quelques valeurs à utiliser dans la charge utile

10

J'ai créé un script pour obtenir les éléments html d'une page cible en envoyant deux requêtes https par la suite. Mon script peut parfaitement faire la chose. Cependant, j'ai dû copier les quatre valeurs des outils de développement Chrome pour remplir les quatre clés à l'intérieur payloadafin d'envoyer les dernières requêtes http pour atteindre la page cible. Ceci est le lien de départ et voici la description de la façon dont je pourrais atteindre la page cible.

  1. Cliquez sur le Find Hotelbouton (pas besoin de changer les dates si la chek-outdate est par défaut au moins un jour plus longue que la check-indate).
  2. Cochez la case comme l'image ci-dessous et appuyez sur le Book Nowbouton juste au-dessus. Maintenant, cela devrait vous conduire automatiquement à la page cible.
  3. En atteignant la page cible intitulée as Enter Guest Details, analysez les éléments html à partir de là

entrez la description de l'image ici

J'ai essayé avec (en travaillant un):

import requests
from bs4 import BeautifulSoup

url = 'https://booking.discoverqatar.qa/SearchHandler.aspx?'
second_url = 'https://booking.discoverqatar.qa/PassengerDetails.aspx?'

params = {
    'Module':'H','txtCity':'','hdnCity':'2947','txtHotel':'','hdnHotel':'',
    'fromDate':'05/11/2019','toDate':'07/11/2019','selZone':'','minSelPrice':'',
    'maxSelPrice':'','roomConfiguration':'2|0|','noOfRooms':'1',
    'hotelStandardArray':'63,60,54,50,52,51','CallFrom':'','DllNationality':'-1',
    'HdnNoOfRooms':'-1','SourceXid':'MTEzNzg=','mdx':''
}

payload = {
    'CallFrom':'MToxNjozOCBQTXxCMkN8MToxNjozOCBQTQ==',
    'Btype':'MToxNjozOCBQTXxBfDE6MTY6MzggUE0=',
    'PaxConfig':'MToxNjozOCBQTXwyfDB8MnwwfHwxOjE2OjM4IFBN',
    'usid':'MToxNjozOCBQTXxoZW54dmkzcWVnc3J3cXpld2lsa2ZwMm18MToxNjozOCBQTQ=='  
}

with requests.Session() as s:
    r = s.get(url,params=params,headers={"User-agent":"Mozilla/5.0"})
    res = s.get(second_url,params=payload,headers={
        "User-agent":"Mozilla/5.0",
        "Referer":r.url
        })
    soup = BeautifulSoup(res.text,'lxml')
    print(soup)

Dans le script ci - dessus , je l' ai copié et collé la valeur CallFrom, Btype, PaxConfiget usidd'outils dev à utiliser dans payload.

Comment puis-je remplir automatiquement les valeurs à utiliser dans la charge utile?

MITHU
la source
La réponse de Kamoo n'est-elle pas suffisante? Je pense que je pourrais obtenir des résultats, en suivant leurs instructions.
tmadam
Bonjour @tmadam, merci pour votre intervention. Oui, la réponse de Kamoo clarifie la façon dont je peux obtenir les résultats, mais je doute fortement que je puisse l'implémenter moi-même dans le script ci-dessus et c'est la raison même pour laquelle j'ai défini la prime pour obtenir une réponse à part entière. Merci.
MITHU
Ah, je vois. Je suis sûr que @Kamoo fournira le code si demandé.
tmadam
@MITHU J'ai mis à jour ma réponse, veuillez noter qu'il Btypepeut s'agir d'une valeur dynamique correspondant aux options choisies lors de la première étape. PaxConfigpourrait également être dans un format différent si les passagers incluent des enfants.
Kamoo

Réponses:

5

Les paramètres envoyés à la deuxième requête sont encodés en Base64 , après décodage, ils sont:

    'CallFrom':'1:16:38 PM|B2C|1:16:38 PM',
    'Btype':'1:16:38 PM|A|1:16:38 PM',
    'PaxConfig':'1:16:38 PM|2|0|2|0||1:16:38 PM',
    'usid':'1:16:38 PM|henxvi3qegsrwqzewilkfp2m|1:16:38 PM'  

À première vue, vous remarquez déjà qu'ils sont dans des modèles de:

$date|$param|$date

$dateest l'heure actuelle au format utc_ts_now.strftime("%I:%M:%S %p").

Pour la $paramsection de ces quatre paramètres, je suppose que cela devrait être corrigé CallFromet Btype, usidc'est la clé de session , vous pouvez la trouver facilement dans la réponse précédente.

PaxConfigest le nombre d'invités, il est lié au fait que roomConfigurationvous avez envoyé la première demande.

Pour automatiser la deuxième demande, vous devez d'abord générer la valeur décodée pour chaque paramètre, puis les coder avec Base64.

Mise à jour:

#!/usr/bin/env python3.7
import base64
from datetime import datetime

import requests


def first_request(session, params):
    url = 'https://booking.discoverqatar.qa/SearchHandler.aspx'
    r = session.get(url, params=params)
    return r


def second_request(session, params):
    url = 'https://booking.discoverqatar.qa/PassengerDetails.aspx'
    r = session.get(url, params=params)
    return r


def main():
    params1 = {
        'Module':             'H',
        'txtCity':            '',
        'hdnCity':            '2947',
        'txtHotel':           '',
        'hdnHotel':           '',
        'fromDate':           '05/11/2019',
        'toDate':             '07/11/2019',
        'selZone':            '',
        'minSelPrice':        '',
        'maxSelPrice':        '',
        'roomConfiguration':  '2|0|',
        'noOfRooms':          '1',
        'hotelStandardArray': '63,60,54,50,52,51',
        'CallFrom':           '',
        'DllNationality':     '-1',
        'HdnNoOfRooms':       '-1',
        'SourceXid':          'MTEzNzg=',
        'mdx':                ''
    }
    session = requests.Session()
    _ = first_request(session, params1)
    asp_session = session.cookies.get("ASP.NET_SessionId")

    params2 = {
        # Could related to options "Available" / "On Request"
        "Btype":     "A",

        # Try out other guest counts to make sure
        "PaxConfig": params1["roomConfiguration"] * 2,

        "CallFrom": "B2C",
        "usid":     asp_session
    }
    date = datetime.utcnow().strftime("%I:%M:%S %p")
    for k, v in params2.items():
        v = "|".join([date, v, date])
        v = base64.b64encode(bytes(v, "utf-8")).decode("utf-8")
        params2[k] = v
    r = second_request(session, params2)
    print(r.text)


if __name__ == '__main__':
    main()
Kamoo
la source