我正在尝试使用 Wget 下载页面,但无法通过登录屏幕。
如何使用登录页面上的发布数据发送用户名/密码,然后以经过身份验证的用户身份下载实际页面?
根据手册页:
# 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
参数是正确的 percent-encoded(尤其是 & 符号!)否则请求可能会失败。还要确保 user
和 password
是正确的键;您可以通过侦查登录页面的 HTML 找到正确的密钥(查看浏览器的“检查元素”功能并在用户名和密码字段中找到 name
属性)。
您可以通过浏览器登录,然后复制所需的标题:
https://i.stack.imgur.com/DePbs.png
在 browser developer tools 的网络选项卡中使用“复制为 cURL”,并将 curl 的标志 -H
替换为 wget 的 --header
(如果需要,还可以将 --data
替换为 --post-data
)。
wget
却没有;我怀疑 Web 服务会检查多个不同的 GET 标头,甚至是看似不重要的标头,例如“User-Agent”或“Cache-Control”。
wget
以错误的方式提供了数据。
我使用 --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
我有同样的问题。我的解决方案是通过 Chrome 登录并将 cookie 数据保存到文本文件中。使用这个 Chrome 扩展程序很容易做到这一点:Chrome cookie.txt export extension。
当您获取 cookie 数据时,还有一个关于如何将它们与 wget 一起使用的示例。为您提供了一个简单的复制粘贴命令行。
我想要一个不下载任何文件的单线;这是将 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.ext
您不需要 cURL 来执行 POSTed 表单数据。 --post-data 'key1=value1&key2=value2'
工作得很好。注意:您还可以将文件名与文件中的 POST 数据一起传递给 wget。
如果他们使用基本身份验证:
wget http://username:password@www.domain.com/page.html
如果他们使用 POSTed 表单数据,您需要改用 cURL 之类的东西。
使用 lynx 和 wget 的解决方案。
注意:必须使用 --enable-persistent-cookies 标志编译 Lynx 才能使其工作
当您想使用 wget 从需要登录的站点下载一些文件时,您只需要一个 cookie 文件。为了生成cookie文件,我选择了lynx。 lynx 是一个文本网络浏览器。首先你需要一个 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
输入用户名和密码后,选择“在这台电脑上保留我”或类似内容。如果登录成功,您将看到一个漂亮的网站文本网页。然后你注销。在当前目录中,您会找到一个名为 cookie.file 的 cookie 文件。这就是我们需要的 wget。
然后 wget 可以使用此命令从站点下载文件。
wget --load-cookies ./cookie.file http://the.site.com/download/we-can-make-this-world-better.tar.gz
在服务器上使用 wget 下载一个大文件链接的示例,该链接可以在您的浏览器中获得。
例如使用谷歌浏览器。
在您需要的地方登录,然后按下载。去下载并复制您的链接。
https://i.stack.imgur.com/4sCjR.png
然后在您登录的页面上打开 DevTools,转到 Console 并通过输入 document.cookie
获取您的 cookie
https://i.stack.imgur.com/7GAB7.png
现在,转到服务器并下载您的文件:wget --header "Cookie: <YOUR_COOKIE_OUTPUT_FROM_CONSOLE>" <YOUR_DOWNLOAD_LINK>
https://i.stack.imgur.com/aGj8m.png
您可以在 Firefox 中安装此插件:https://addons.mozilla.org/en-US/firefox/addon/cliget/?src=cb-dl-toprated 开始下载您想要的内容并单击该插件。它为您提供了 wget 或 curl 的完整命令,以在 serer 上下载文件。很容易!
-p
(--page-requisites
)。--delete-after
也是值得的,这样您就不会最终保存登录后的结果页面。WGET64: missing URL
我将整个 wget 命令放在一行中并删除了 `\`