Tidak dapat membiarkan skrip saya menghasilkan beberapa nilai secara otomatis untuk digunakan dalam muatan

10

Saya telah membuat skrip untuk mendapatkan elemen html dari halaman target dengan mengirimkan dua permintaan https selanjutnya. Script saya dapat melakukan hal itu dengan sempurna. Namun, saya harus menyalin empat nilai dari alat dev chrome untuk mengisi empat kunci di payloaddalam untuk mengirim permintaan http akhir untuk mencapai halaman target. Ini adalah tautan awal dan berikut adalah uraian bagaimana saya dapat mencapai halaman target.

  1. Klik Find Hoteltombol (tidak perlu mengubah tanggal jika chek-outtanggal secara default setidaknya satu hari lebih lama dari check-intanggal).
  2. Centang kotak seperti gambar di bawah ini dan tekan Book Nowtombol tepat di atasnya. Sekarang, itu akan mengarahkan Anda ke halaman target secara otomatis.
  3. Setelah mencapai halaman target berjudul Enter Guest Details, parsing elemen html dari sana

masukkan deskripsi gambar di sini

Saya sudah mencoba (bekerja):

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)

Dalam script di atas saya sudah disalin dan disisipkan nilai CallFrom, Btype, PaxConfigdan usiddari dev alat untuk digunakan di dalam payload.

Bagaimana saya bisa mengisi nilai secara otomatis untuk digunakan dalam muatan?

MITHU
sumber
Bukankah jawaban Kamoo cukup? Saya pikir saya bisa mendapatkan hasil, mengikuti instruksi mereka.
tmadam
Hai @madam, terima kasih atas intervensi Anda. Ya, jawaban Kamoo mengklarifikasi bagaimana saya bisa mendapatkan hasilnya, tetapi saya sangat ragu saya bisa mengimplementasikannya sendiri di dalam skrip di atas dan itulah alasan saya menetapkan hadiah untuk mendapatkan jawaban yang lengkap. Terima kasih.
MITHU
Ah, begitu. Saya yakin @Kamoo akan memberikan kode jika diminta.
tmadam
@MITHU Saya memperbarui jawaban saya, harap dicatat bahwa itu Btypemungkin nilai dinamis yang sesuai dengan opsi yang dipilih dari langkah pertama. PaxConfigmungkin juga dalam format yang berbeda jika penumpang menyertakan anak-anak.
Kamoo

Jawaban:

5

Params yang dikirim ke permintaan kedua adalah Base64 yang di- encode, setelah di-decode:

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

Pada pandangan pertama, Anda sudah melihat mereka berada dalam pola:

$date|$param|$date

Di mana $datewaktu saat ini dalam format utc_ts_now.strftime("%I:%M:%S %p").

Untuk $parambagian dari empat parameter ini, saya kira itu harus diperbaiki CallFromdan Btype, usidadalah kunci sesi , Anda dapat menemukannya dengan mudah di respons sebelumnya.

PaxConfigadalah jumlah tamu, ini terkait dengan roomConfigurationAnda mengirim permintaan pertama.

Untuk mengotomatiskan permintaan kedua, Anda akan menghasilkan nilai yang didekodekan untuk setiap parameter terlebih dahulu, kemudian menyandikannya Base64.

Memperbarui:

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