Firefox

如何傳遞 POST 參數以在瀏覽器中打開網頁?

  • August 13, 2017

我們可以在瀏覽器中打開一個帶有GET參數的網站如下

#!/bin/bash

echo 'enter username'
read username

firefox "https://github.com/${username}"

這很方便,因為我現在可以通過一個命令訪問任何使用者的 github 頁面,然後輸入他們的使用者名。同樣,我們可以製作一個 shell 腳本來使用我們在參數中傳遞的查詢來搜尋 Google。

如何打開一個需要傳遞POST參數的網站,以便我可以從終端直接訪問該網站?

以https://www.startpage.com為例。如果可以通過 POST 請求,那麼我們可以直接從終端搜尋我們的查詢。

注意:不是基於curl尋找答案來檢索數據,而是基於firefox或任何其他瀏覽器訪問網站的答案


任何其他方式都比Selenium因為使用者無法控制在 POST 請求中傳遞的低級數據,例如User-Agent,lang和其他一些標頭參數。如果使用 Selenium,使用者將只能綁定到 UI 選項,並且無法根據需要修改這些低級標頭。


xdotool代價高昂,因為使用者必須計算要執行多少次Tab才能到達特定的表單欄位,然後Tab在輸入內容之前循環多次。它也不能讓我更改低級 POST 參數,如User-Agent,lang

您創建一個臨時的自動送出 HTML 頁面,將瀏覽器指向該頁面,幾秒鐘後,您刪除了不再需要的臨時 HTML 文件。以腳本形式:

#!/bin/bash

# Create an autodeleted temporary directory.
Work="$(mktemp -d)" || exit 1
trap "cd / ; rm -rf '$Work'" EXIT

# Create a HTML page with the POST data fields,
# and have it auto-submit when the page loads.
cat > "$Work/load.html" <<END
<!DOCTYPE html>
<html>
<head>
 <title>…</title>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
 <script type="text/javascript">
  function dosubmit() { document.forms[0].submit(); }
 </script>
</head>
<body onload="dosubmit();">
 <form action="https://www.startpage.com/do/asearch" method="POST" accept-charset="utf-8">
  <input type="hidden" name="cat" value="web">
  <input type="hidden" name="cmd" value="process_search">
  <input type="hidden" name="language" value="english">
  <input type="hidden" name="engine0" value="v1all">
  <input type="hidden" name="query" value=""Nominal Animal"">
 </form>
</body>
</html>
END

# Load the generated file in the browser.
firefox "file://$Work/load.html"

# Firefox returns immediately, so we want to give it a couple
# of seconds to actually read the page we generated,
# before we exit (and our page vanishes).
sleep 2

讓我們更改上面的內容,以便我們對命令行上提供的任何字元串進行 StartPage 搜尋:

#!/bin/bash

# Create an autodeleted temporary directory.
Work="$(mktemp -d)" || exit 1
trap "cd / ; rm -rf '$Work'" EXIT

# Convert all command-line attributes to a single query,
# escaping the important characters.
rawAmp='&'   ; escAmp='&'
rawLt='<'    ; escLt='<'
rawGt='>'    ; escGt='>'
rawQuote='"' ; escQuote='"'
QUERY="$*"
QUERY="${QUERY//$rawAmp/$escAmp}"
QUERY="${QUERY//$rawQuote/$escQuote}"
QUERY="${QUERY//$rawLt/$escLt}"
QUERY="${QUERY//$rawGt/$escGt}"

# Create a HTML page with the POST data fields,
# and have it auto-submit when the page loads.
cat > "$Work/load.html" <<END
<!DOCTYPE html>
<html>
<head>
 <title>…</title>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
 <script type="text/javascript">
  function dosubmit() { document.forms[0].submit(); }
 </script>
</head>
<body onload="dosubmit();">
 <form action="https://www.startpage.com/do/asearch" method="POST" accept-charset="utf-8">
  <input type="hidden" name="cat" value="web">
  <input type="hidden" name="cmd" value="process_search">
  <input type="hidden" name="language" value="english">
  <input type="hidden" name="engine0" value="v1all">
  <input type="hidden" name="query" value="$QUERY">
 </form>
</body>
</html>
END

# Load the generated file in the browser.
firefox "file://$Work/load.html"

# Firefox returns immediately, so we want to give it a couple
# of seconds to actually read the page we generated,
# before we exit (and our page vanishes).
sleep 2

所有改變的是我們使用 Bash 字元串操作來替換 each &with &, each "with ", each <with<和 each >with 的塊>,以便查詢字元串可以安全地寫為value名為 的隱藏輸入的屬性query。(這四個就足夠了。首先執行 & 也很重要,因為後續替換包含&沒有雙引號(因為值本身在雙引號中)。)

自動送出 POST 請求的缺點是您可能需要不時更新自動送出的 HTML 頁面,因為站點可以隨時更改 POST 變數命名和內部 URL。

引用自:https://unix.stackexchange.com/questions/375857