edfward

与虾米签到奋斗的日子 - 终章

总算明白了之前折腾 curl 不成功的原因…

首先有两个值得关注的点:

用这两个指令后对二者的请求进行分析可以发现,它们对签到的连接发起 GET 的请求分别是这样的:

curl

GET /web?1365790254 HTTP/1.1                  
User-Agent: Opera/9.60                        
Host: www.xiami.com                           
Accept: */*                                   
Referer: http://www.xiami.com/web             
Cookie: member_auth=xxxxxx    

urllib2 in python

GET /web?1365790623 HTTP/1.1
Accept-Encoding: identity
Cookie: member_auth=xxxxxx; t_sign_auth=0
Hosts: www.xiami.com
Referer: http://www.xiami.com/web
Connection: close
User-Agent: Opera/9.99                                                 

之后的 response 都会有一个 redirect (即有 Location 这个东西)。我以为症结在这儿,折腾了一会儿,但是结果并不是这样的(不过 curl 确实需要 -L 参数来允许 follow redirect,所以之前的代码的确有问题)。

两个请求的最大区别在 Cookie 上。但是我想了半天觉得没可能啊,cookie 都是通过登陆拿到的啊怎么会有区别?再检查了一下之前的请求的 response,终于发现原来在用 cookie 下载页面检查签到连接时接收的那个 response 有这么一栏

Set-Cookie: t_sign_auth=0; path=/; domain=.xiami.com    

也就是说这次的请求又一次改变了 cookie 的值,而 curl 在之后的命令中都用的是原来的 cookie,难怪始终签不了到…

知道问题原因后就好解决了,只要在下载页面时再把 cookie 下载下来就行。

#!/bin/bash

email=xxx@xxx.xxx;password='xxxxxx'

curl -c ./cookie -A 'Opera/9.60' -d "email=$email&password=$password&LoginButton=\xe7\x99\xbb\xe9\x99\x86" http://www.xiami.com/web/login

curl -b ./cookie -c ./new_cookie http://www.xiami.com/web > PAGE

check_in=`sed -n 's/^.*<a class=\"check_in\" href=\"\([^"]*\)\">.*$/\1/p' PAGE`

if [[ $check_in == "" ]]
then
    cowsay "cannot finish it"
    rm cookie new_cookie PAGE
    exit
fi

curl -b ./new_cookie -e http://www.xiami.com/web -A 'Opera/9.99' -L http://www.xiami.com$check_in

rm cookie new_cookie PAGE