Como passar parâmetros de POST para abrir uma página da Web no navegador?

2

Podemos abrir um site com os parâmetros GET no navegador da seguinte forma

#!/bin/bash

echo 'enter username'
read username

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

Isso é útil porque agora posso visitar a página do github de qualquer usuário com apenas um comando e, em seguida, digitar seu nome de usuário. Da mesma forma, podemos criar um script de shell para pesquisar no Google nossa consulta passada nos parâmetros.

Como abro um site que exige a aprovação de parâmetros POST para que eu possa visitar diretamente o site a partir do terminal?

Veja, por exemplo, o link . Se a passagem de solicitação POST for possível, poderemos pesquisar diretamente nossa consulta no terminal.

Observação: não está procurando respostas com base no curl para recuperar dados, mas respostas baseadas no firefox ou em qualquer outro navegador para visitar o site

Qualquer outra maneira melhor do que Selenium , porque o usuário não teria controle sobre os dados de baixo nível que estão sendo transmitidos na solicitação POST, como User-Agent , lang e alguns outros parâmetros de cabeçalho. O usuário seria obrigado a apenas opções de interface do usuário se usando Selenium e esses baixo nível de cabeçalho não podem ser modificados de acordo com a necessidade.

xdotool seria custoso porque o usuário teria que contar quantas vezes para fazer o Tab a fim de alcançar o campo de formulário particular e, em seguida, teclar Tab vezes antes de digitar algo lá. Ele também não me dá a capacidade de alterar parâmetros POST de baixo nível como User-Agent , lang , etc

    
por GypsyCosmonaut 06.07.2017 / 23:25

4 respostas

5

Você cria uma página HTML de envio automático temporário, aponta o navegador para essa página e, após alguns segundos, remove o arquivo HTML temporário, pois ele não é mais necessário. Em forma de script:

#!/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

Vamos mudar o exemplo acima, para que possamos fazer uma pesquisa no StartPage em qualquer string fornecida na linha de comando:

#!/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

Tudo o que muda é o trecho em que usamos as operações de string Bash para substituir cada & por &amp; , cada " por &#34; , cada < por &lt; e cada > por &gt; , para que a cadeia de consulta possa ser gravada com segurança como o atributo value da entrada oculta denominada query . (Esses quatro são suficientes. Também é importante fazer o e comercial primeiro, porque as substituições subsequentes contêm "e" comercial. Como emitimos isso como o valor de uma entrada oculta, a string de consulta não é codificada em url; é apenas um conteúdo HTML normal, mas sem cota dupla (porque o valor em si é duplo).

A desvantagem de enviar solicitações POST automaticamente é que talvez seja necessário atualizar sua página HTML de envio automático de vez em quando, simplesmente porque o site pode alterar a nomenclatura da variável POST e as URLs internas sempre que quiserem.

    
por 07.08.2017 / 15:31
2

Baseado no driver de automação do Marionette incluído no Firefox . Instale as ligações oficiais do 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()

Este scipt requer que o firefox já esteja em execução. Talvez você tenha que ativar o Marionette usando a opção --marionette .

    
por 12.08.2017 / 14:45
0

lynx não suporta POST na linha de comando

Eu vejo apenas estas soluções:

  1. use algum software de automação da web, como selênio

  2. escolha seu idioma e codifique sua automação simples:

    launch the browser passing the URL on the cmdline

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

veja, por exemplo, o link

    
por 07.07.2017 / 00:06
0

O Zed Attack Proxy pode funcionar para você (é um proxy de interceptação flexível, o nome é lamentável). Ele recebe atenção no SO: link

Isso, naturalmente, leva ao problema de especificar um servidor proxy a partir da linha de comando. Aqui está o firefox: link - O Chrome levará --proxy-server= ip: port

    
por 13.08.2017 / 22:50