无法让我的脚本自动生成一些要在有效负载中使用的值


10

我创建了一个脚本,可通过随后发送两个https请求从目标页面获取html元素。我的脚本可以完美地完成任务。但是,我必须复制chrome开发工具中的四个值以填充其中的四个键payload,以便发送最终的http请求到达目标页面。这是起始链接,下面是有关如何到达目标页面的说明。

  1. 单击Find Hotel按钮(如果chek-out默认情况下check-in日期比日期长至少一天,则无需更改日期)。
  2. 勾选下图所示的框,然后Book Now按其上方的按钮。现在,它将引导您自动进入目标页面。
  3. 到达标题为的目标页面后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)

在上面的脚本中,我已经复制和值粘贴CallFromBtypePaxConfigusid从开发工具中使用payload

如何自动填写要在有效负载内使用的值?


Kamoo的答案不够吗?我认为我可以按照他们的指示取得结果。
tmadam '19

嗨@tmadam,感谢您的干预。是的,Kamoo的答案阐明了如何获得结果,但是我非常怀疑我是否可以在上述脚本中自己实现它,这就是我设置赏金以获取完整答案的原因。谢谢。
MITHU,

知道了 我确定@Kamoo会在要求时提供代码。
tmadam '19

@MITHU我更新了答案,请注意,它Btype可能是一个动态值,对应于从第一步中选择的选项。PaxConfig如果乘客包括孩子,则格式也可能会有所不同。
Kamoo

Answers:


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这四个参数的部分,我想应该将其固定为CallFromBtypeusid它是会话密钥,您可以在上一个响应中轻松找到它。

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()
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.