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

263

Estou tentando usar o Wget para baixar uma página, mas não consigo passar da tela de login.

Como envio o nome de usuário / senha usando os dados de postagem na página de login e depois faço o download da página real como um usuário autenticado?

Senhor Reginold Francis
fonte
3
Para curl: stackoverflow.com/questions/12399087/…
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

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).

jarnoan
fonte
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.

do utilizador
fonte
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

baptx
fonte
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ê.

Thor-Erik Rødland
fonte
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

Caleb Grey
fonte
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.

J. Piel
fonte
8

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

wget http://username:[email protected]/page.html

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

ceejayoz
fonte
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
Expressão impassível
fonte
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

Alex Ivasyuv
fonte
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