如何傳遞 POST 參數以在瀏覽器中打開網頁?
我們可以在瀏覽器中打開一個帶有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。