如何传递POST参数在浏览器中打开网页?

如何传递POST参数在浏览器中打开网页?

我们可以打开一个网站得到浏览器中的参数如下

#!/bin/bash

echo 'enter username'
read username

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

这很方便,因为我现在只需一个命令,然后输入他们的用户名即可访问任何用户的 github 页面。同样,我们可以创建一个 shell 脚本,使用参数中传递的查询来搜索 Google。

如何打开需要的网站邮政要传递参数以便我可以从终端直接访问网站吗?

举个例子,https://www.startpage.com。如果可以传递 POST 请求,那么我们可以直接从终端搜索我们的查询。

注意:不是寻找基于curl的答案来检索数据,而是基于firefox或任何其他浏览器访问网站的答案


任何其他方式都比更好,Selenium因为用户无法控制 POST 请求中传递的低级数据,例如User-Agentlang和其他一些标头参数。如果使用 Selenium,用户将只能绑定到 UI 选项,并且这些低级标头无法根据需要进行修改。


xdotool这将是昂贵的,因为用户必须计算要执行多少次Tab才能到达特定的表单字段,然后Tab在其中输入内容之前循环多次。它也不能让我更改低级 POST 参数,例如User-Agentlang

答案1

您创建一个临时的自动提交 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>&hellip;</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="&#34;Nominal Animal&#34;">
  </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='&amp;'
rawLt='<'    ; escLt='&lt;'
rawGt='>'    ; escGt='&gt;'
rawQuote='"' ; escQuote='&#34;'
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>&hellip;</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 &amp;、each "with &#34;、each <with&lt;和each >with的块&gt;,以便可以将查询字符串安全地写入value名为 的隐藏输入的属性query。 (这四个就足够了。首先执行&符号也很重要,因为后续替换包含&符号。因为我们将其作为价值对于隐藏输入,查询字符串不是 url 编码的;它只是普通的 HTML 内容,但没有双引号(因为值本身在双引号中)。)

自动提交 POST 请求的缺点是,您可能需要时不时地更新自动提交 HTML 页面,因为网站可以随时更改 POST 变量命名和内部 URL。

答案2

基于附带的 Firefox木偶自动化驱动程序。安装官方 python 绑定:

pip2 install --user marionette_driver
#!/usr/bin/python2

from marionette_driver.marionette import Marionette
from marionette_driver import By

client = Marionette('localhost', port=2828)
client.start_session()
client.navigate("https://www.startpage.com/")

query = client.find_element(By.ID, 'query')
query.send_keys("Search Me")
submit = client.find_element(By.ID, 'submit1')

submit.click()

该脚本要求 Firefox 已经运行。也许你必须启用木偶使用选项--marionette.

答案3

lynx不支持命令行 POST

我只看到这些解决方案:

  1. 使用一些网络自动化软件,例如 selenium

  2. 选择您的语言并编写简单的自动化代码:

    启动浏览器,在 cmdline 上传递 URL

等待几秒钟并模拟按键来填写表单字段

参见例如http://www.semicomplete.com/projects/xdotool/

答案4

Zed 攻击代理可能适合你(它是一个灵活的拦截代理,名字很不幸)。它引起了人们的关注:https://stackoverflow.com/questions/tagged/zap

这自然会导致从命令行指定代理服务器的问题。这是火狐浏览器:https://stackoverflow.com/questions/843340/firefox-proxy-settings-via-command-line#843366 - Chrome将采取--proxy-server=IP:端口

相关内容