Невозможно позволить моему сценарию автоматически генерировать несколько значений для использования в полезной нагрузке.

10

Я создал скрипт для получения html-элементов с целевой страницы путем последующей отправки двух запросов https. Мой сценарий может сделать вещь без нареканий. Однако мне пришлось скопировать четыре значения из инструментов chrome dev, чтобы заполнить четыре ключа внутри payload, чтобы отправить окончательные http-запросы для достижения целевой страницы. Это начальная ссылка, а ниже приведено описание того, как я могу добраться до целевой страницы.

  1. Нажмите на Find Hotelкнопку (нет необходимости менять даты, если chek-outпо умолчанию дата по крайней мере на один день длиннее check-inдаты).
  2. Установите флажок, как на изображении ниже, и нажмите Book Nowкнопку над ним. Теперь он должен автоматически привести вас к целевой странице.
  3. Достигнув целевой страницы с названием as Enter Guest Details, проанализируйте html-элементы оттуда

введите описание изображения здесь

Я пытался с (работает):

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)

В приведенном выше сценарии я скопировать и вставить значение CallFrom, Btype, PaxConfigи usidот разработчика инструментов для использования в payload.

Как я могу заполнить значения автоматически для использования в полезной нагрузке?

MITHU
источник
Разве ответа Каму не достаточно? Я думаю, что мог бы получить результаты, следуя их инструкциям.
tmadam
Привет @ tmadam, спасибо за ваше вмешательство. Да, ответ Каму проясняет, как я могу получить результаты, но я очень сомневаюсь, что смогу реализовать его самостоятельно в приведенном выше сценарии, и именно по этой причине я назначил награду за получение полноценного ответа. Спасибо.
MITHU
Ах я вижу. Я уверен, что @Kamoo предоставит код, если его попросят.
tmadam
@ MITHU Я обновил свой ответ, обратите внимание, что это Btypeможет быть динамическое значение, соответствующее параметрам, выбранным на первом шаге. PaxConfigтакже может быть в другом формате, если пассажиры включают детей.
Каму

Ответы:

5

Параметры, отправляемые во второй запрос, кодируются Base64 , после декодирования они:

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

На первый взгляд, вы уже заметили, что они имеют вид:

$date|$param|$date

Где $dateтекущее время в формате utc_ts_now.strftime("%I:%M:%S %p").

Для $paramчасти этих четырех параметров, я предполагаю , что это должно быть исправлено на CallFromи Btype, usidявляется сессия ключ, вы можете легко найти ее в предыдущем ответе.

PaxConfigэто количество гостей, это связано с тем, что roomConfigurationвы отправили первый запрос.

Чтобы автоматизировать второй запрос, вы должны сначала сгенерировать декодированное значение для каждого параметра, а затем кодировать их с помощью Base64.

Обновить:

#!/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
источник