Como passar pela página de login com o Wget?


Respostas:


342

Com base na página do manual:

# Log in to the server.  This only needs to be done once.
wget --save-cookies cookies.txt \
     --keep-session-cookies \
     --post-data 'user=foo&password=bar' \
     --delete-after \
     http://server.com/auth.php

# Now grab the page or pages we care about.
wget --load-cookies cookies.txt \
     http://server.com/interesting/article.php

Verifique se o --post-dataparâmetro está corretamente codificado em porcentagem (especialmente e comercial!) Ou se a solicitação provavelmente falhará. Certifique-se também de que usere passwordsão as chaves corretas; você pode descobrir as chaves corretas pesquisando o HTML da página de login (consulte o recurso "inspecionar" do navegador e encontre o nameatributo nos campos de nome de usuário e senha).


10
adicione --keep-session-cookies ao primeiro comando ou ao segundo?
— Felipe Alvarez

4
Você não precisa -p( --page-requisites) para isso.
— ændrük

14
Também vale a pena acrescentar --delete-afterà primeira recuperação para que você não acabar salvando a página de resultados de login.
— Jim Hunziker

2
Estou recebendo erro WGET64: missing URL. Coloquei o comando wget inteiro em uma linha e removi o `\`
— Mowgli 28/03

6
--keep-session-cookies é necessário apenas para o primeiro comando. Diz ao primeiro comando para incluir cookies de sessão ao salvar cookies no arquivo. O segundo comando simplesmente lê todos os cookies do arquivo fornecido.
— Wadim

63

Se você precisar dele para uso único, poderá efetuar login via navegador e copiar os cabeçalhos necessários posteriormente:

captura de tela Use "Copiar como cURL" na guia Rede das Ferramentas do desenvolvedor (recarregue a página após a abertura) e substitua o sinalizador de cabeçalho do curl -He --datapelo wget --headere --post-data.


1
Ótima solução!
— menteith 27/03

Impressionante! Também me indicou a opção de usar curl em vez de wget, pois ele pode fazer a mesma coisa e eu nem preciso alterar os parâmetros.
— Janeiro

solução muito limpa e simples, +1!
— Kresimir Pendic 02/07/19

Isso funcionou para mim, enquanto que wgetcom o cookie correto não; Suspeito que o serviço da Web verifique vários cabeçalhos GET diferentes, mesmo os aparentemente sem importância, como "User-Agent" ou "Cache-Control".
— Arthur

@ Arthur para mim, essa solução foi a única que funcionou. Tentei remover o máximo possível de dados do cabeçalho da URL e acabei essencialmente com os dados do cookie. Então, suspeito que wgetos dados foram fornecidos de maneira errada.
— Florian Blume

62

Forneci diretamente os cookies de uma conexão existente ao wget com --no-cookies e o cabeçalho de solicitação HTTP do cookie. No meu caso, era um login da universidade Moodle, onde o login parece mais complexo (usando várias solicitações com um ticket de login). Eu adicionei --post-data porque era uma solicitação POST. Por exemplo, obtenha a lista de todos os usuários do Moodle:

wget --no-cookies --header "Cookie: <name>=<value>" --post-data 'tab=search&name=+&personsubmit=Rechercher&keywords=&keywordsoption=allmine' https://moodle.unistra.fr/message/index.php


7
Dica incrível. Isso é útil quando você pode acessar o cookie da sua própria máquina e depois usá-lo de outra máquina sem cabeça na linha de comando. :)
— Tuxdude

3
Você também pode definir vários cookies ao mesmo tempo, --header "Cookie: access_token = IKVYJ; XSRF-TOKEN = 5e10521d"
— Phil C:

29

Eu tive o mesmo problema. Minha solução foi fazer o login via Chrome e salvar os dados dos cookies em um arquivo de texto. Isso é feito facilmente com esta extensão do Chrome : extensão de exportação Chrome cookie.txt .

Quando você obtém os dados dos cookies, também há um exemplo de como usá-los com o wget. Uma linha de comando simples de copiar e colar é fornecida a você.


1
infelizmente, não aplicável em scripting automatizado
— Znik

1
A pergunta não especifica scripts automatizados. Essa solução permite que 99% do trabalho seja automatizado.
— Will Sheppard

1
Infelizmente, o Google deve ser inteligente demais para esse truque. Ainda recebo uma página de login.
— Josiah Yoder

1
Obviamente, o Google usa reCAPTCHAs secretos ... como já vi em muitos lugares, o uso de APIs programáticas padrão é a opção mais prática nesse caso.
— Josiah Yoder

10

Eu queria um one-liner que não baixasse nenhum arquivo; Aqui está um exemplo de canalizar a saída do cookie para a próxima solicitação. Eu testei apenas o seguinte no Gentoo, mas ele deve funcionar na maioria dos ambientes * nix:

wget -q -O /dev/null --save-cookies /dev/stdout --post-data 'u=user&p=pass' 'http://example.com/login' | wget -q -O - --load-cookies /dev/stdin 'http://example.com/private/page' (esta é uma linha, embora provavelmente envolva seu navegador)

Se você deseja que a saída seja salva em um arquivo, altere -O -para-O /some/file/name


9

Você não precisa de cURL para executar os dados do formulário POST. --post-data 'key1=value1&key2=value2'funciona muito bem. Nota: você também pode passar um nome de arquivo para wget com os dados POST no arquivo.


8

Se eles estiverem usando autenticação básica:

wget http://username:password@www.domain.com/page.html

Se eles estiverem usando dados de formulário POST, será necessário usar algo como cURL .


Eu não tenho acesso para alterar nada no servidor, ele é somente leitura
— Señor Reginold Francis

7
Assim? Nada disso exige que você altere alguma coisa no servidor.
— ceejayoz

5

Uma solução que usa lynx e wget.

Nota: O Lynx deve ter sido compilado com o sinalizador --enable-persistent-cookies para que isso funcione

Quando você deseja usar o wget para baixar algum arquivo de um site que requer login, basta um arquivo de cookie. Para gerar o arquivo de cookie, eu escolho o lynx. lynx é um navegador de texto. Primeiro, você precisa de um arquivo de configuração para o lynx salvar o cookie. Crie um arquivo lynx.cfg. Escreva essas configurações no arquivo.

SET_COOKIES:TRUE
ACCEPT_ALL_COOKIES:TRUE
PERSISTENT_COOKIES:TRUE
COOKIE_FILE:cookie.file

Então inicie o lynx com este comando:

lynx -cfg=lynx.cfg http://the.site.com/login

Depois de inserir o nome de usuário e a senha, selecione 'preservar-me neste computador' ou algo semelhante. Se o login for bem-sucedido, você verá uma bela página de texto do site. E você sai. No diretório atual, você encontrará um arquivo de cookie chamado cookie.file. É disso que precisamos para o wget.

Então o wget pode baixar o arquivo do site com este comando.

wget --load-cookies ./cookie.file http://the.site.com/download/we-can-make-this-world-better.tar.gz

2
e se o login exigir javascript? O lynx parece não suportar javascript.
— Tiberiu

1

Exemplo para baixar com o wget no servidor um link de arquivo grande que pode ser obtido no seu navegador.

Por exemplo, usando o Google Chrome.

Faça o login onde precisar e pressione download. Vá para baixar e copiar seu link.

insira a descrição da imagem aqui

Em seguida, abra o DevTools em uma página na qual você efetua login, acesse o Console e obtenha seus cookies digitandodocument.cookie

insira a descrição da imagem aqui

Agora, vá para o servidor e faça o download do seu arquivo: wget --header "Cookie: <YOUR_COOKIE_OUTPUT_FROM_CONSOLE>" <YOUR_DOWNLOAD_LINK>

insira a descrição da imagem aqui


Esta resposta não parece ser adequada para o Google - onde há duas páginas de cookies!
— Josiah Yoder

Obviamente, o Google usa reCAPTCHAs secretos ... como já vi em muitos lugares, o uso de APIs programáticas padrão é a opção mais prática nesse caso.
— Josiah Yoder
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.