我一直尝试通过 Web API 登录 pyload,但 wget 没有保存 cookie,我不明白为什么。
我正在使用以下命令:
wget --delete-after --keep-session-cookies --save-cookies=my_cookies.txt --post-data="username=USERNAME&password=PASSWORD" http://localhost:8000/api/login
但是my_cookies.txt的内容是:
# HTTP cookie file.
# Generated by Wget on 2012-06-23 22:31:33.
# Edit at your own risk.
当我在调试模式下运行相同的命令时,我得到以下输出,其中包括标头响应中的设置 cookie:
DEBUG output created by Wget 1.10.2 (Red Hat modified) on linux-gnueabi.
--22:31:11-- http://localhost:8000/api/login
Resolving localhost... 127.0.0.1
Caching localhost => 127.0.0.1
Connecting to localhost|127.0.0.1|:8000... connected.
Created socket 3.
Releasing 0x000504d0 (new refcount 1).
---request begin---
POST /api/login HTTP/1.0
User-Agent: Wget/1.10.2 (Red Hat modified)
Accept: */*
Host: localhost:8000
Connection: Keep-Alive
Content-Type: application/x-www-form-urlencoded
Content-Length: 32
---request end---
[POST data: username=USERNAME&password=PASSWORD]
HTTP request sent, awaiting response...
---response begin---
HTTP/1.1 200 OK
Content-Length: 34
Content-Type: application/json
Cache-Control: no-cache, must-revalidate
Set-cookie: beaker.session.id=405390ddc809efed54820638c95d7997; expires=Tue, 19-Jan-2038 04:14:07 GMT; Path=/
Connection: Keep-Alive
Date: Sat, 23 Jun 2012 21:31:11 GMT
Server: CherryPy/3.1.2 WSGI Server
---response end---
200 OK
hs->local_file is: login (not existing)
Registered socket 3 for persistent reuse.
TEXTHTML is on.
Length: 34 [application/json]
Saving to: `login'
100%[=======================================>] 34 --.-K/s in 0s
22:31:11 (1.28 MB/s) - `login' saved [34/34]
Removing file due to --delete-after in main():
Removing login.
Saving cookies to my_cookies.txt.
Done saving cookies.
谁能告诉我我做错了什么?
答案1
考虑到您仍在使用 1.10.2 版本,您可能遇到了一个已在 2009 年 8 月 1.12 版本中修复的错误。您确实应该考虑升级,尤其是因为最新版本是 2011 年 9 月左右发布的 1.13.4。
无论如何...所讨论的错误是这样的:bugGNU Wget - 错误:错误 #26775,保存来自非 200 响应的 cookie,其中涉及 wget 在收到非 200 返回错误代码时不保存 cookie。
您的非调试请求很可能正在被缓存或进行其他操作,或者涉及 302 重定向……所有这些都会导致请求返回非 200 返回代码。您的调试输出确实显示了 200-OK 代码……您是否使用了与执行“正常”请求时完全相同的命令行来执行调试请求?
答案2
--keep-session-cookies
由于会话 cookie 默认不保存,因此使用