如何使用Wget跳过登录页面?


Answers:


341

根据手册页:

# 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

确保--post-data参数正确地进行了百分比编码(尤其是“&”号),否则请求可能会失败。还要确保userpassword是正确的密钥;您可以通过侦查登录页面的HTML来找到正确的键(查看浏览器的“检查元素”功能并name在用户名和密码字段中找到属性)。


10
将--keep-session-cookies添加到第一个命令,或者第二个命令?
菲利佩·阿尔瓦雷斯

4
您不需要-p--page-requisites)。
ændrük

14
这也是值得加入--delete-after到第一检索,所以你最终不会从记录并保存结果页面。
吉姆Hunziker

2
我收到错误消息WGET64: missing URL,将整个wget命令放在一行中,并删除了“ \”
Mowgli

6
--keep-session-cookies仅对于第一个命令是必需的。将cookie保存到文件时,它告诉第一个命令包括会话cookie。第二个命令只是从提供的文件中读取所有cookie。
wadim

63

如果您需要使用一次,可以通过浏览器登录,然后复制所需的标题:

屏幕截图 使用开发人员工具的“网络”标签中的“复制为cURL”(打开后重新加载页面),并将curl的标头标志-H和替换--data为wget的--header--post-data


1
很好的解决方案!
Menteith

太棒了!还向我指出了使用curl而不是wget的选项,因为它可以完成相同的操作,而且我甚至不需要更改参数。
1

非常干净简单的解决方案,+ 1!
克雷西米尔·彭迪克

这对我有用,而wget使用正确的cookie则无效;我怀疑Web服务会检查多个不同的GET标头,甚至看似不重要的标头,例如“ User-Agent”或“ Cache-Control”。
亚瑟

@Arthur对我来说,这种解决方案是唯一有效的解决方案。我试图从URL中删除尽可能多的标头数据,并最终获得了cookie数据。因此,我怀疑wget提供了错误的数据。
Florian Blume

62

我直接使用--no-cookies和Cookie HTTP请求标头为wget提供了现有连接的cookie。在我的情况下,这是Moodle大学的登录,登录看起来更加复杂(使用带有登录票证的多个请求)。我添加了--post-data,因为它是POST请求。例如,获取所有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
很棒的提示。当您可以从自己的计算机访问cookie,然后从命令行从另一台无头计算机使用cookie时,此功能很有用。:)
Tuxdude

3
您也可以同时设置多个Cookie,--header“ Cookie:access_token = IKVYJ; XSRF-TOKEN = 5e10521d”
Phil C,

29

我有同样的问题。我的解决方案是通过Chrome进行登录并将cookie数据保存到文本文件中。可以通过以下Chrome扩展程序轻松完成此操作:Chrome cookie.txt导出扩展程序

当您获取Cookie数据时,还有一个示例说明如何与wget一起使用它们。提供了一个简单的复制粘贴命令行。


1
不幸的是,不适用于自动脚本编写
-Znik

1
这个问题没有指定自动脚本。该解决方案可使99%的工作自动化。
Will Sheppard

1
不幸的是,对于这个技巧,谷歌一定太聪明了。我仍然得到一个登录页面。
约西亚·约德

1
当然,Google使用秘密的reCAPTCHA ...正如我在很多地方看到的那样,在这种情况下,使用标准的编程API是最实用的选择。
约西亚·约德

10

我想要一种不下载任何文件的文件。这是将Cookie输出传递到下一个请求的示例。我仅在Gentoo上测试了以下内容,但它应可在大多数* 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' (这是一行,尽管它可能会包裹在您的浏览器中)

如果要将输出保存到文件,请更改-O --O /some/file/name


9

您不需要cURL即可执行POST表单数据。--post-data 'key1=value1&key2=value2'效果很好。注意:您还可以将文件名和文件中的POST数据一起传递给wget。


8

如果他们使用基本身份验证:

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

如果他们使用的是POSTed表单数据,则需要使用诸如cURL之类的东西。


我无权更改服务器上的任何内容,它是只读的
阅兵式Reginold弗朗西斯

7
所以?这些都不要求您更改服务器上的任何内容。
ceejayoz

5

使用lynx和wget的解决方案。

注意:Lynx必须使用--enable-persistent-cookies标志进行编译才能正常工作

当您想使用wget从需要登录的站点下载某些文件时,您只需要一个cookie文件。为了生成cookie文件,我选择lynx。lynx是一个文本Web浏览器。首先,您需要一个用于lynx的配置文件来保存cookie。创建一个文件lynx.cfg。将这些配置写入文件。

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

然后使用以下命令启动lynx:

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

输入用户名和密码后,选择“在此PC上保留我”或类似名称。如果成功登录,您将看到该站点的漂亮文本网页。然后您注销。在当前目录中,您将找到一个名为cookie.file的cookie文件。这就是我们需要的wget。

然后wget可以使用此命令从站点下载文件。

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

2
如果登录名需要JavaScript怎么办?lynx似乎不支持javascript。

1

使用wget下载的示例在服务器一个大文件链接的该文件可以在浏览器中获得。

以使用谷歌浏览器为例。

在需要的地方登录,然后按下载。转到下载并复制您的链接。

在此处输入图片说明

然后在您登录的页面上打开DevTools,进入控制台并通过输入以下内容获取Cookie:document.cookie

在此处输入图片说明

现在,转到服务器并下载文件: wget --header "Cookie: <YOUR_COOKIE_OUTPUT_FROM_CONSOLE>" <YOUR_DOWNLOAD_LINK>

在此处输入图片说明


这个答案似乎无法很好地适用于Google-那里有两页Cookie!
乔希亚·约德

当然,Google使用秘密的reCAPTCHA ...正如我在很多地方看到的那样,在这种情况下,使用标准的编程API是最实用的选择。
约西亚·约德
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.