ไม่สามารถให้สคริปต์ของฉันสร้างค่าบางอย่างโดยอัตโนมัติเพื่อใช้ภายในเพย์โหลด


10

ฉันสร้างสคริปต์เพื่อรับองค์ประกอบ html จากหน้าเป้าหมายโดยส่งคำขอ https สองคำขอในภายหลัง สคริปต์ของฉันสามารถทำสิ่งที่ไร้ที่ติ อย่างไรก็ตามฉันต้องคัดลอกสี่ค่าจากเครื่องมือ dev ของ Chrome เพื่อกรอกข้อมูลสี่ปุ่มภายใน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จาก dev payloadเครื่องมือในการใช้งานภายใน

ฉันจะกรอกค่าโดยอัตโนมัติเพื่อใช้ภายในเพย์โหลดได้อย่างไร


คำตอบของคามูไม่เพียงพอหรือไม่ ฉันคิดว่าฉันจะได้ผลลัพธ์ตามคำแนะนำของพวกเขา
tmadam

สวัสดี @tmadam ขอบคุณสำหรับการแทรกแซงของคุณ ใช่คำตอบของ Kamoo ชี้แจงว่าฉันจะได้ผลลัพธ์อย่างไร แต่ฉันสงสัยอย่างมากว่าฉันสามารถใช้มันด้วยตัวเองภายในสคริปต์ด้านบนและนั่นคือเหตุผลที่ฉันตั้งค่าเงินจำนวนมากเพื่อให้ได้คำตอบที่เต็มเปี่ยม ขอบคุณ
MITHU

อ่าฉันเข้าใจแล้ว ฉันแน่ใจว่า @Kamoo จะให้รหัสหากถูกถาม
tmadam

@MITHU ฉันอัปเดตคำตอบแล้วโปรดทราบว่าBtypeอาจเป็นค่าแบบไดนามิกที่สอดคล้องกับตัวเลือกที่เลือกจากขั้นตอนแรก PaxConfigอาจอยู่ในรูปแบบที่แตกต่างกันหากผู้โดยสารมีเด็ก
Kamoo

คำตอบ:


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

ที่ไหนเป็นเวลาปัจจุบันในรูปแบบของ$dateutc_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()
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.