No puedo permitir que mi script genere pocos valores automáticamente para ser utilizados dentro de la carga útil

10

He creado un script para obtener los elementos html de una página de destino enviando dos solicitudes https posteriormente. Mi script puede hacer la cosa sin problemas. Sin embargo, tuve que copiar los cuatro valores de las herramientas de desarrollo de Chrome para completar las cuatro claves payloadpara enviar las solicitudes HTTP finales para llegar a la página de destino. Este es el enlace de inicio y a continuación se encuentra la descripción de cómo podría llegar a la página de destino.

  1. Haga clic en el Find Hotelbotón (no es necesario cambiar las fechas si la chek-outfecha es por lo menos un día más larga que la check-infecha).
  2. Marque la casilla como la imagen de abajo y presione el Book Nowbotón justo encima de ella. Ahora, debería llevarte a la página de destino automáticamente.
  3. Al llegar a la página de destino titulada como Enter Guest Details, analiza los elementos html desde allí

ingrese la descripción de la imagen aquí

He intentado con (trabajando uno):

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)

En la secuencia de comandos que he copiado y pegado el valor de CallFrom, Btype, PaxConfigy usiddesde dev herramientas para su uso dentro payload.

¿Cómo puedo completar los valores automáticamente para usarlos dentro de la carga útil?

MITHU
fuente
¿No es suficiente la respuesta de Kamoo? Creo que podría obtener resultados, siguiendo sus instrucciones.
tmadam el
Hola @tmadam, gracias por tu intervención. Sí, la respuesta de Kamoo aclara cómo puedo obtener los resultados, pero dudo mucho que pueda implementarlo yo mismo dentro del script anterior y esa es la razón por la que establezco la recompensa para obtener una respuesta completa. Gracias.
MITHU
Ah, ya veo. Estoy seguro de que @Kamoo proporcionará el código si se le solicita.
tmadam el
@MITHU Actualicé mi respuesta, tenga en cuenta que Btypepodría ser un valor dinámico correspondiente a las opciones elegidas en el primer paso. PaxConfigtambién podría estar en un formato diferente si los pasajeros incluyen niños.
Kamoo

Respuestas:

5

Los parámetros enviados a la segunda solicitud están codificados en Base64 , después de la decodificación son:

    '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'  

A primera vista, ya notas que están en patrones de:

$date|$param|$date

¿Dónde $dateestá la hora actual en el formato de utc_ts_now.strftime("%I:%M:%S %p").

Para la $paramsección de estos cuatro parámetros, supongo que debería ser arreglado CallFromy Btype, como usides la clave de sesión , puede encontrarlo fácilmente en la respuesta anterior.

PaxConfiges el recuento de invitados, está relacionado con roomConfigurationusted enviado en la primera solicitud.

Para automatizar la segunda solicitud, primero generará el valor descodificado para cada parámetro y luego los codificará con Base64.

Actualizar:

#!/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
fuente