ペイロード内で使用するためにスクリプトが自動的にいくつかの値を生成することができません


10

続いて2つのhttpsリクエストを送信して、ターゲットページからhtml要素を取得するスクリプトを作成しました。私のスクリプトは問題なく問題なく実行できます。ただし、payloadターゲットページに到達するための最終的なHTTPリクエストを送信するために、Chrome開発ツールから4つの値をコピーして4つのキーを入力する必要がありました。これは開始リンクであり、以下はターゲットページに到達する方法に関する説明です。

  1. ボタンをクリックしFind Hotelます(chek-out日付のデフォルトがcheck-in日付よりも少なくとも1日長い場合は、日付を変更する必要はありません)。
  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)

上記のスクリプトでCallFromBtype、開発ツールから、、PaxConfigおよびの値をコピーして貼り付け、usid内で使用しましたpayload

ペイロード内で使用される値を自動的に入力するにはどうすればよいですか?


神尾の答えは十分ではありませんか?私は彼らの指示に従って結果を得ることができたと思います。
tmadam

こんにちは@tmadam、あなたの介入に感謝します。ええ、鴨尾の答えはどのように結果を得ることができるかを明確にしますが、私が上記のスクリプト内で自分でそれを実装できるかどうかは非常に疑わしく、それが私が賞金を本格的な答えを得るために設定したまさにその理由です。ありがとう。
ミトゥ

ああ、分かった。尋ねられた場合、@ Kamooがコードを提供すると確信しています。
tmadam

@MITHU回答を更新しましたBtype。最初のステップから選択したオプションに対応する動的な値である可能性があることに注意してください。PaxConfig乗客に子供が含まれている場合も、形式が異なる場合があります。
Kamoo、

回答:


5

2番目のリクエストに送信されるパラメーターは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です。最初のリクエストで送信されたあなたに関連しています。

2番目のリクエストを自動化するには、最初に各パラメータのデコードされた値を生成し、次にでそれらをエンコードします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.