我正在尝试使用 curl 在 pinterest.com 上进行登录。我得到了以下请求响应流程:
- GET-请求登录表单并抓取隐藏字段(csrftoken)
- POST-请求登录凭据(邮件和密码)和抓取的 csrftoken
- 接收 Session Cookie 进行登录
使用 Curl,我可以看到正在发送和接收的以下标头:
GET /login/?next=%2F HTTP/1.1
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:10.0.2) Gecko/20100101 Firefox/10.0.2
Host: pinterest.com
Referer:
Accept: text/html,application/xhtml+xml,application/xml,*/*
Accept-Language: de-de,en-us
Connection: keep-alive
HTTP/1.1 200 OK
Content-Type: text/html; charset=utf-8
Date: Tue, 10 Apr 2012 15:03:24 GMT
ETag: "45d6a85f0ede46f13f4fc751842ce5b7"
Server: nginx/0.8.54
Set-Cookie: csrftoken=dec6cb66064f318790c6d51e3f3a9612; Max-Age=31449600; Path=/
Set-Cookie: _pinterest_sess="eJyryMwNcTXOdtI3zXcKNq0qznIxyXVxK/KqSsy3tY8vycxNtfUN8a3yc3E09nXxLPdztLVVK04tLs5MsfXNAopVpVf6VnlW+Qba2gIAuqgZIg=="; Domain=pinterest.com; HttpOnly; expires=Tue, 17-Apr-2012 15:03:24 GMT; Max-Age=1334675004; Path=/
Vary: Cookie, Accept-Encoding
Content-Length: 4496
Connection: keep-alive
所以在第 1 步之后,设置了两个 cookie csrftoken 和 _pinterest_sess。但是查看 cookiejar 文件(我使用 CURLOPT_COOKIEFILE 和 CURLOPT_COOKIEJAR 让 curl 处理 cookie 处理)显示以下内容:
# Netscape HTTP Cookie File
# http://curl.haxx.se/rfc/cookie_spec.html
# This file was generated by libcurl! Edit at your own risk.
pinterest.com FALSE / FALSE 1365519805 csrftoken dec6cb66064f318790c6d51e3f3a9612
#HttpOnly_.pinterest.com TRUE / FALSE -1626222087 _pinterest_sess "eJyryMwNcTXOdtI3zXcKNq0qznIxyXVxK/KqSsy3tY8vycxNtfUN8a3yc3E09nXxLPdztLVVK04tLs5MsfXNAopVpVf6VnlW+Qba2gIAuqgZIg=="
首先要注意的是 _pinterest_sess cookie 行之前的 #HttpOnly_。我只是假设 curl 处理得很好。但进一步看,可以看到将负值设置为到期日期:-1626222087
我不知道这是从哪里来的,因为 cookie 设置为“expires=Tue,2012 年 4 月 17 日 15:03:24 GMT”(大约 7 天后,从今天开始计算)。
在下一个请求中,curl 不会设置 _pinterest_sess cookie:
POST /login/?next=%2F HTTP/1.1
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:10.0.2) Gecko/20100101 Firefox/10.0.2
Host: pinterest.com
Referer: https://pinterest.com/login/?next=%2F
Cookie: csrftoken=dec6cb66064f318790c6d51e3f3a9612
Accept: text/html,application/xhtml+xml,application/xml,*/*
Accept-Language: de-de,en-us
Connection: keep-alive
Content-Length: 123
Content-Type: application/x-www-form-urlencoded
HTTP/1.1 302 FOUND
Content-Type: text/html; charset=utf-8
Date: Tue, 10 Apr 2012 15:05:26 GMT
ETag: "d41d8cd98f00b204e9800998ecf8427e"
Location: http://pinterest.com/
Server: nginx/0.8.54
Set-Cookie: _pinterest_sess="eJzLcssPCy4NTclIjvAOrjQzyywoCChISgvLDi+2tY9PrSjILEottvUN8a3yc4k09gtxrfRLt7VVK04tLs5MAYonV/qGeFb4ZkWW+4LES4tTi+KBEv4u6UZ+WYEmvlm+QOxZ6R/iWOEbEmgLAKNfJps="; Domain=pinterest.com; HttpOnly; expires=Tue, 17-Apr-2012 15:05:26 GMT; Max-Age=1334675126; Path=/
Vary: Cookie
Content-Length: 0
Connection: keep-alive
在响应中,设置了另一个 _pinterest_sess cookie,因为 curl 没有发送最后一个。
目前,我不知道我是否做错了什么,或者 curl 是否无法正确解析 cookie 中的过期值。
任何帮助将不胜感激 :)
// 编辑还有一件事:根据http://opensource.apple.com/source/curl/curl-57/curl/lib/cookie.c函数 curl_getdate() 用于提取日期。该函数的文档列出了一些示例(http://curl.haxx.se/libcurl/c/curl_getdate.html):
- 1994 年 11 月 6 日星期日 08:49:37 GMT
- 格林威治标准时间 94 年 11 月 6 日星期日 08:49:37
- 1994 年 11 月 6 日星期日 08:49:37
- 格林威治标准时间 1994 年 11 月 6 日 08:49:37
- 格林威治标准时间 94 年 11 月 6 日 08:49:37
- 1994 年 11 月 6 日 08:49:37
- 1994 年 11 月 6 日 08:49:37
- 94 年 11 月 6 日 08:49:37
- 格林威治标准时间 1994 年 11 月 6 日 08:49:37
- 08:49:37 94 年 11 月 6 日
- 94 年 11 月 6 日星期日 08:49:37
- 1994 年 11 月 6 日
- 94 年 11 月 6 日
- 94 年 11 月 6 日星期日
- 1994.11.6
- 太阳/十一月/6/94/格林威治标准时间
- 1994 年 11 月 6 日星期日 08:49:37 CET
- 美国东部时间 1994 年 11 月 6 日 08:49:37
- 2004 年 9 月 12 日星期日 15:05:58 -0700
- 2004 年 9 月 11 日星期六 21:32:11 +0200
- 20040912 15:05:58 -0700
- 20040911 +0200
它们都不符合上述到期日期“Tue, 17-Apr-2012 15:03:24 GMT”,因为所有带有连字符的示例仅使用 2 位数年份。