Mein Skript kann nicht automatisch einige Werte generieren, die innerhalb der Nutzdaten verwendet werden

10

Ich habe ein Skript erstellt, um die HTML-Elemente von einer Zielseite abzurufen, indem anschließend zwei https-Anforderungen gesendet werden. Mein Skript kann das Ding einwandfrei machen. Ich musste jedoch die vier Werte aus den Chrome-Entwicklungstools kopieren, um die vier darin enthaltenen Schlüssel auszufüllen und payloaddie endgültigen http-Anforderungen zu senden, um die Zielseite zu erreichen. Dies ist der Startlink und im Folgenden wird beschrieben, wie ich die Zielseite erreichen kann.

  1. Klicken Sie auf die Find HotelSchaltfläche ( chek-outDatum muss nicht geändert werden, wenn das Datum standardmäßig mindestens einen Tag länger als das check-inDatum ist).
  2. Aktivieren Sie das Kontrollkästchen wie im Bild unten und drücken Sie die Book NowTaste direkt darüber. Jetzt sollte es Sie automatisch zur Zielseite führen.
  3. Wenn Sie die Zielseite mit dem Titel als erreicht haben Enter Guest Details, analysieren Sie die HTML-Elemente von dort aus

Geben Sie hier die Bildbeschreibung ein

Ich habe versucht mit (Arbeit):

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)

In dem obigen Skript habe ich kopiert und den Wert eingefügt CallFrom, Btype, PaxConfigund usidvon Entwickler - Tool zur Verwendung innerhalb payload.

Wie kann ich die Werte automatisch eingeben, die innerhalb der Nutzlast verwendet werden sollen?

MITHU
quelle
Ist Kamoos Antwort nicht ausreichend? Ich denke, ich könnte Ergebnisse erzielen, wenn ich ihren Anweisungen folge.
tmadam
Hallo @tmadam, danke für deine Intervention. Ja, Kamoos Antwort verdeutlicht, wie ich die Ergebnisse erhalten kann, aber ich bezweifle sehr, dass ich sie selbst im obigen Skript implementieren kann, und genau aus diesem Grund habe ich die Prämie festgelegt, um eine vollständige Antwort zu erhalten. Vielen Dank.
MITHU
Ah ich sehe. Ich bin sicher, dass @Kamoo auf Anfrage Code bereitstellt.
tmadam
@MITHU Ich habe meine Antwort aktualisiert. Bitte beachten Sie, dass dies Btypemöglicherweise ein dynamischer Wert ist, der den im ersten Schritt ausgewählten Optionen entspricht. PaxConfigkann auch in einem anderen Format vorliegen, wenn Passagiere Kinder enthalten.
Kamoo

Antworten:

5

Parameter, die an die zweite Anforderung gesendet werden, sind Base64- codiert. Nach dem Decodieren sind dies:

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

Auf den ersten Blick merkt man schon, dass sie folgende Muster haben:

$date|$param|$date

Wo $dateist die aktuelle Zeit im Format von utc_ts_now.strftime("%I:%M:%S %p").

Für $paramAbschnitt dieser vier Parameter, ich denke , es festgelegt werden soll CallFromund Btype, usidist der Sitzungsschlüssel, können Sie es leicht in der vorherige Antwort finden.

PaxConfigIst die Anzahl der Gäste, hängt es mit roomConfigurationIhnen zusammen, die Sie in der ersten Anfrage gesendet haben.

Um die zweite Anforderung zu automatisieren, generieren Sie zuerst den decodierten Wert für jeden Parameter und codieren ihn dann mit Base64.

Aktualisieren:

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