Как передать параметры POST для открытия веб-страницы в браузере?

Они открыты параллельно. nautilus породит столько же процессов (порядок здесь не имеет значения), и каждый из этих процессов выполнит вашу программу просмотра PDF с одним из файлов в качестве аргумента.

Все эти программы просмотра PDF будут работать независимо, загружать общие библиотеки, открывать свои собственные PDF-файлы, подключаться к X-серверу и в какой-то момент попросят X-сервер отобразить окно. Кто из них сделает это первым, вы не можете контролировать.

Чтобы гарантировать порядок, вам понадобится сотрудничество с менеджером Windows. Вам нужно, чтобы nautilus попросил диспетчер окон сообщить ему, когда окно первой программы просмотра PDF появится, прежде чем запускать следующую.

Сделать это надежно для любого приложения непросто. nautilus знает только pid процесса, который он породил для выполнения программы просмотра PDF. Не все приложения сообщают менеджеру окон свой pid, а если и сообщают, то это может быть pid дочернего процесса, порожденного nautilus (как в случае сценария оболочки), или он может вообще не создавать окно...

4
07.08.2017, 10:18
4 ответа

Вы создаете временную 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 по любой строке (s ), заданной в командной строке:

#!/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 для замены каждого &на &amp;, каждого "на &#34;, каждого <на &lt;и каждого >на &gt;, чтобы строку запроса можно было безопасно записать как атрибут valueскрытого ввода с именем query. (Этих четырех достаточно. Также важно сначала поставить амперсанд, потому что последующие замены содержат амперсанд. Поскольку мы выдаем это как значение скрытого ввода, строка запроса не кодируется URL -; это обычный HTML-контент, но без двойных кавычек (, потому что само значение заключено в двойные кавычки ).)

Недостаток автоматической -отправки POST-запросов заключается в том, что вам может потребоваться время от времени обновлять HTML-страницу автоматической -отправки,просто потому, что сайт может изменить имя переменной POST и внутренние URL-адреса, когда захочет.

5
27.01.2020, 20:50

Основано на входящем в комплект Firefox Драйвере автоматизации Marionette. Установите официальные привязки 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с помощью опции --marionette.

2
27.01.2020, 20:50

lynxне поддерживает POST из командной строки

Я вижу только эти решения:

  1. используйте программное обеспечение для веб-автоматизации, например селен

  2. выберите свой язык и запрограммируйте свою простую автоматизацию:

    launch the browser passing the URL on the cmdline

wait a few second and simulate key press to fill the form fields

см. напримерhttp://www.semicomplete.com/projects/xdotool/

0
27.01.2020, 20:50

Zed Attack Proxy может вам подойти (это гибкий перехватывающий прокси, имя неудачное ). Это привлекает внимание к SO:https://stackoverflow.com/questions/tagged/zap

Это естественным образом приводит к проблеме указания прокси-сервера из командной строки. Вот фаерфокс:https://stackoverflow.com/questions/843340/firefox-proxy-settings-via-command-line#843366-Chrome займет--proxy-server=ip :порт

0
27.01.2020, 20:50

Теги

Похожие вопросы