Não foi possível permitir que meu script gere poucos valores automaticamente para serem usados ​​na carga útil

10

Criei um script para obter os elementos html de uma página de destino enviando duas solicitações https posteriormente. Meu script pode fazer a coisa na perfeição. No entanto, eu tive que copiar os quatro valores das ferramentas de desenvolvimento do chrome para preencher as quatro chaves dentro payloadpara enviar as solicitações http finais para alcançar a página de destino. Este é o link inicial e a seguir, a descrição de como eu poderia alcançar a página de destino.

  1. Clique no Find Hotelbotão (não é necessário alterar as datas se a chek-outdata for padrão, pelo menos, um dia a mais que a check-indata).
  2. Marque a caixa como na imagem abaixo e pressione o Book Nowbotão logo acima dela. Agora, ele deve levar você para a página de destino automaticamente.
  3. Ao alcançar a página de destino intitulada como Enter Guest Details, analise os elementos html a partir daí

insira a descrição da imagem aqui

Eu tentei com (trabalhando um):

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)

No script acima Copiei e colei o valor de CallFrom, Btype, PaxConfige usidde dev ferramentas para uso dentro payload.

Como posso preencher os valores automaticamente para serem usados ​​na carga útil?

MITHU
fonte
A resposta de Kamoo não é suficiente? Acho que consegui resultados, seguindo as instruções.
tmadam 1/11/19
Olá @tmadam, obrigado pela sua intervenção. Sim, a resposta de Kamoo esclarece como posso obter os resultados, mas duvido muito que possa implementá-la no script acima e essa é a razão pela qual defini a recompensa para obter uma resposta completa. Obrigado.
MITHU 1/11/19
Ah entendo. Tenho certeza de que o @Kamoo fornecerá código, se solicitado.
Tmadam
@MITHU Atualizei minha resposta, observe que Btypepode ser um valor dinâmico correspondente às opções escolhidas na primeira etapa. PaxConfigtambém pode estar em um formato diferente se os passageiros incluírem crianças.
Kamoo

Respostas:

5

Os parâmetros enviados para a segunda solicitação são codificados em Base64 , depois da decodificação são:

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

À primeira vista, você já percebe que eles estão em padrões de:

$date|$param|$date

Onde $dateé a hora atual no formato de utc_ts_now.strftime("%I:%M:%S %p").

Para a $paramseção desses quatro parâmetros, acho que deve ser corrigido CallFrome Btype, usidé a chave da sessão , você pode encontrá-lo facilmente na resposta anterior.

PaxConfigé a contagem de convidados, está relacionado a roomConfigurationvocê enviado na primeira solicitação.

Para automatizar a segunda solicitação, você deve gerar o valor decodificado para cada parâmetro primeiro e depois codificá-los com Base64.

Atualizar:

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