Impossibile consentire al mio script di generare automaticamente pochi valori da utilizzare nel payload


10

Ho creato uno script per ottenere gli elementi html da una pagina di destinazione inviando successivamente due richieste https. La mia sceneggiatura può fare la cosa in modo impeccabile. Tuttavia, ho dovuto copiare i quattro valori dagli strumenti di sviluppo di Chrome per compilare le quattro chiavi payloadal fine di inviare le richieste http finali per raggiungere la pagina di destinazione. Questo è il link iniziale e di seguito la descrizione di come ho potuto raggiungere la pagina di destinazione.

  1. Fare clic sul Find Hotelpulsante (non è necessario modificare le date se la chek-outdata è per impostazione predefinita almeno un giorno in più rispetto alla check-indata).
  2. Spuntare la casella come l'immagine qui sotto e premere il Book Nowpulsante appena sopra di essa. Ora, dovrebbe portarti automaticamente alla pagina di destinazione.
  3. Una volta raggiunta la pagina di destinazione intitolata come Enter Guest Details, analizzare gli elementi html da lì

inserisci qui la descrizione dell'immagine

Ho provato con (funzionante):

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)

Nello script precedente che ho copiato e incollato il valore di CallFrom, Btype, PaxConfige usidda strumenti di sviluppo per l'uso all'interno payload.

Come posso inserire automaticamente i valori da utilizzare nel payload?


La risposta di Kamoo non è sufficiente? Penso di poter ottenere risultati, seguendo le loro istruzioni.
tmadam,

Ciao @tmadam, grazie per il tuo intervento. Sì, la risposta di Kamoo chiarisce come posso ottenere i risultati, ma dubito fortemente di poterlo implementare io stesso nello script sopra e questa è la vera ragione per cui ho impostato la taglia per ottenere una risposta a tutti gli effetti. Grazie.
MITHU

Ah, capisco. Sono sicuro che @Kamoo fornirà il codice se richiesto.
tmadam,

@MITHU Ho aggiornato la mia risposta, tieni presente che Btypepotrebbe trattarsi di un valore dinamico corrispondente alle opzioni scelte dal primo passaggio. PaxConfigpotrebbe anche essere in un formato diverso se i passeggeri includono bambini.
Kamoo,

Risposte:


5

I param inviati alla seconda richiesta sono codificati Base64 , dopo la decodifica sono:

    '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 prima vista, noti già che sono in modelli di:

$date|$param|$date

Dove $dateè l'ora corrente nel formato di utc_ts_now.strftime("%I:%M:%S %p").

Per la $paramsezione di questi quattro parametri, suppongo che dovrebbe essere riparato per , CallFromed è la chiave di sessione , puoi trovarlo facilmente nella risposta precedente.Btypeusid

PaxConfigconta gli ospiti, è correlato a roomConfigurationte inviato nella prima richiesta.

Per automatizzare la seconda richiesta, devi prima generare il valore decodificato per ciascun parametro, quindi codificarlo con Base64.

Aggiornare:

#!/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()
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.