Linux下cURL使用教程之八:curl基本使用实例之115网盘自动摇一摇脚本

上一篇使用shell+curl的方式完成了登陆百度空间并发表文章。但是奈何shell脚本对大批量文字的处理太弱,因此脚本显得鸡肋。
而本篇则完成一个实际可用的脚本程序:115网盘自动摇一摇脚本。

115网盘简介

115网盘容量和速度都算不错的。注册送15G,然后可通过每天摇一摇等方式获得容量。
免费会员每天可以摇一次,可以获得几十M到一百多M的空间,和几百“雨露”。雨露可用于升级,升级后增加空间,但是貌似现在没有了。
可以在淘宝上搜一下115账号的价格。
(注:当初写这个脚本的时候,还在网盘大战前后,如今的115早已不如当前,摇一摇这个功能早已消失。)

工具使用

登陆过程我们仍然使用Developer Tools分析。
简单的办法是使用谷歌官方的chrome浏览器或Firefox+Firebug。

登陆过程

登陆,使用Developer Tools抓包,很容易看到第一个POST包。

1、POST地址

https://passport.115.com/?ac=login

2、三部分数据

  • Request Headers,没特殊需要注意的字段。
  • Query String Parameters,没用。
  • Form Data,有两个数据:用户名、密码,字段名分别为login[account]、login[passwd],参数明文。

    3、curl脚本

    伪造User-Agent,伪装来源页面,登陆保存cookie:
    #username/passwd are the parameters of this script
    username=$1
    passwd=$2
    #save to log
    date>>yaoyao.log
    echo Log $1>>yaoyao.log
    #login post
    curl -s -A "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)" -o 1151.html -D 115cookie001.txt http://www.115.com/
    curl -s -L -A "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)" \
    -e http://www.115.com/ -o 1152.html -D 115cookie002.txt -b 115cookie001.txt \
    --data-urlencode back=http://www.115.com \
    --data-urlencode goto=http://115.com \
    --data-urlencode login[account]=$username \
    --data-urlencode login[passwd]=$passwd \
    'http://passport.115.com/?ac=login'

为了更逼真,我们先访问了下首页,完整模仿实际用户行为。
登陆成功与否不在此处检测,原因见下节。

摇一摇过程

1、摇一摇抓包分析

在“网盘”页面下,点击摇一摇,摇成功后抓包分析。
很快发现摇一摇的GET数据包。

2、字段分析

GET网址为:http://115.com/?ct=ajax_user&ac=pick_space&token=dfcce64ebe71051a732d7943068ab***&_=1345093324***
多次试验发现,URL中有两个变化的参数,token和。没有其它特殊字段。
token和
字段,按上篇文章思路,我们先考虑这两个字段没有实际意义的情况。

3、curl脚本

curl -s -L -A  "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)" \
-e http://www.115.com/ -o 1153.html -D 115cookie003.txt -b 115cookie002.txt \
http://115.com/?ct=ajax_user\&ac=pick_space\&token=dfcce64ebe71051a756f7943068ab147\&_=1331178826515

成功后会有跳转,所有我们使用了-L选项自动跟踪跳转。
token和_字段处,填入格式相同的随机值,打开1153.html发现失败。

4、寻找token字段

同上篇相同思路,从后向前寻找。或者抓包,然后搜索token值。
1)最终发现在GET网页http://115.com/?ct=file&ac=userfile&aid=1&cid=0&tpl=list_pg&limit=35的Response里有:

<script type="text/javascript"> window["INDEX_HOME_DATA"] = {take_token: '164d32f6fc1e668c0769eff1235e83ff',is_take: Number('1') };

2)我们使用curl脚本:

curl -s -A  "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)" \
-e http://115.com/ -o 1153.html -D 115cookie003.txt -b 115cookie002.txt \
'http://115.com/?ct=file&ac=userfile&aid=1&cid=0&tpl=list_pg&limit=35'

cat 1153.html|grep token即可看到token字段。

3)增加curl语句GET此页面提取token即可。
与上文POST摇一摇的代码合并后脚本如下:

#get token
curl -s -A "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)" \
-e http://115.com/ -o 1153.html -D 115cookie003.txt -b 115cookie002.txt \
'http://115.com/?ct=file&ac=userfile&aid=1&cid=0&tpl=list_pg&limit=35'
token=`cat 1153.html | grep Yao|awk -F "'" '{print $2}'|awk -F "'" '{print $1}'`
echo "token="$token
#check before post
if [ -z $token ]
then
echo "error in getting bdstoken">>yaoyao.log;
exit;
fi
#yao post
curl -s -L -A "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)" \
-e http://www.115.com/ -o 1154.html -D 115cookie004.txt -b 115cookie002.txt \
http://115.com/?ct=ajax_user\&ac=pick_space\&token=$token\&_=1331178977515

测试成功,证明_字段没有实际作用。估计是个时间戳之类的,服务器并不对其正确唯一与否做出很严格的校验。
我们只需要在获得token后检验token是否为空即可,不需要在登陆后检测登陆是否成功。因为即使登陆成功后获得token识别,脚本也会终止。

后续处理

1、结果处理

摇一摇POST页面http://115.com/?ct=ajax_user&ac=pick_space&token=164d32f6fc1e668c0769eff1235e8***&_=1345094656***得到的结果中,有三个字段有意义:

  • picked:摇一摇获得空间数
  • total_size:总空间数
  • exp:获得的雨露数

提取脚本如下:

#get the result
cat 1154.html |awk -F"picked\":\"" '{print $2}'|awk -F "\"" '{print $1}'>>yaoyao.log
cat 1154.html |awk -F"total_size\":\"" '{print $2}'|awk -F "\"" '{print $1}'>>yaoyao.log
cat 1154.html |awk -F"exp\":" '{print $2}'|awk -F "}" '{print $1}'>>yaoyao.log

结果保存在日志中。我们只需要查看日志即可判断成功与否。

2、资源清理

脚本如下:

rm -f 1151.html 1152.html 1153.html 1154.html
rm -f 115cookie001.txt 115cookie002.txt 115cookie003.txt 115cookie004.txt

除115cookie002.txt之外,其余的cookie其实不用保存。
稳妥的办法是在开头结尾都添加资源清理语句。

3、容错处理

脚本中没有做太完备的容错处理。
因为在网络好的情况下,一般只会一次成功,失败的概率很小。没必要添加逻辑复杂的容错处理。

Linux设置自动执行

可设置crotab自动执行。
vim /etc/crontab添加如下字段:

30 5    * * *   root   bash yaoyao.sh username password

表示每天5:30以root用户自动执行”bash yaoyao.sh username password“。

总结

完整的脚本请下载yaoyao.sh
使用方法:

bash yaoyao.sh username password

使用bash执行的原因是,其他shell可能有不支持的shell语法。
日志保存在yaoyao.log中。