第一次技术贴~~
这两天一直纠结这个问题,今天来个了结,在网上参考的也挺乱,顺便理理思路~
目标网站http://mstore.wo.com.cn/index.action?terindex=&page=320fantastic&loginSign=0&seeAllApp=1这个网站怎么看都不是像一个身处垄断行业的公司做出来的,竟然都不可以自由的选择页码,估计就是联通的实习生做了几个星期做出来的,真的穷到这份上了么~
cookie主要应用有1.判定注册用户是否已经登录网站。2.“购物车”之类处理。
这个网站下载要先注册,用自己邮箱注册了一个~假设用户是zhenya-user.com,密码是password
最关键的就是获得登陆的cookie,先分析下登陆时的form,代码从http://mstore.wo.com.cn/320fantastic/loginOnEmail.jsp上截取下来,代码如下
<form id="logOnEmail_action" name="logOnEmail_action" action="/online/logOnEmail.action" method="post">
<ul>
<li>
<table cellpadding="0" cellspacing="0" class="jologin" width="95%">
<tr>
<td>
<span class="red">*</span>Email
</td>
<td class="t_r">
<a class="blue" href="/320fantastic/registe.jsp">注册用户</a>
</td>
</tr>
</table>
<input type="text" name="muserBasicinfoExtends.useremail" value="" id="logOnEmail_action_muserBasicinfoExtends_useremail" class="input_bg"/>
</li>
<li>
<table cellpadding="0" cellspacing="0" class="jologin" width="95%"">
<tr>
<td><span class="red">*</span>密码</td>
<td class="t_r"><a class="blue" href="/320fantastic/getpasswd.jsp">忘记密码</a></td>
</tr>
</table>
<input type="password" name="muserBasicinfoExtends.userpwd" id="logOnEmail_action_muserBasicinfoExtends_userpwd" class="input_bg"/>
</li>
<li><input type="checkbox" name="isSaveUserLoginStatue" class="mcheck"/>记住登录状态,需支持并打开手机的cookie功能。</li>
<li><input type="submit" id="logOnEmail_action_" name="" value="立即登录" class="gray_button2"/>
</li>
</ul>
</form>
然后用申请的账号给post到目地地址一段数据,目地地址即form中的action,当然要加上host的地址。数据主要就是登陆邮箱的和密码,上面可以看到为muserBasicinfoExtends.useremail和muserBasicinfoExtends.userpwd两个参数,然后把服务器返回来的得到的cookie保存到本地
用wget的命令为
wget -O 1 --post-data="muserBasicinfoExtends.useremail=zhenya-user@126.com&muserBasicinfoExtends.userpwd=password" --save-cookies=cookie --keep-session-cookies
"http://mstore.wo.com.cn/online/logOnEmail.action"
用curl的命令为
curl -o 1 -A "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)" -c cookie -d "muserBasicinfoExtends.useremail=zhenya-user@126.com&muserBasicinfoExtends.userpwd=password" http://mstore.wo.com.cn/online/logOnEmail.action
纠结原因竟是因为一个参数,curl保存cookie是-c,而自己一直用的是-D,dump header,是保存http头,而不是cookie。下次用参数前一定看下man的帮助。得到的页面保存在文件1中,没有什么用这个文件
登陆后回得到cookie文件
# HTTP cookie file.
# Generated by Wget on 2012-02-16 23:22:57.
# Edit at your own risk.
mstore.wo.com.cn FALSE /online/ FALSE 0 wostoreUserCookie 5989075
mstore.wo.com.cn FALSE / FALSE 0 store_name %E8%B7%AF%E4%BA%BA%E7%94%B2
mstore.wo.com.cn FALSE / FALSE 0 store_code 90005989075
mstore.wo.com.cn FALSE / FALSE 0 store_id 378dd952180844ecbb5162d8d890a70b
mstore.wo.com.cn FALSE / FALSE 0 store_index 5989075
mstore.wo.com.cn FALSE / FALSE 0 JSESSIONID FA6450DC14E811A4C3BDD0EE8BC360C5
假如想下载这个地址中的app,http://mstore.wo.com.cn/appDetail.action?productIndex=23134&terindex=&page=320fantastic&loginSign=0,用刚才的cookie,get方法就可以得到用用户名和密码登陆之后的页面。
wget -O 2 --load-cookies=cookie --keep-session-cookies "http://mstore.wo.com.cn/index.action?terindex=9000000000&page=320fantastic&loginSign=1"
得到的网页文件保存在2中,然后就是分析html的代码,找到页面中“免费中”三个字下面的那个图片的链接,具体的提取方法要用到正则表达式。得到这个链接后方法同上,用wget得到点击下载图片后的网页
wget -O 3 --load-cookies=cookie --keep-session-cookies "http://mstore.wo.com.cn/download/initDownloadPage.action?buyType=1&spname=%E4%B8%AD%E5%9B%BD
%E8%81%94%E5%90%88%E7%BD%91%E7%BB%9C%E9%80%9A%E4%BF%A1%E6%9C%89%E9%99%90%E5%85%AC%E5%8F%B8&cnname=%E6%B2%83%E5%95%86%E5%BA%97%E6%89%8B%E6%9C%BA%E5%AE
%A2%E6%88%B7%E7%AB%AF&productId=9039939520110506361800&imgUrl=file/90399395/9039939520110506361800/large.png&productIndex=23134"
保存在文件3中,跟文件2类似,找到下载链接的地址,用wget下载下来链接对应的东西,
wget -O 4 --load-cookies=cookie --keep-session-cookies "http://mstore.wo.com.cn/320fantastic/appDownload_final.jsp?
imgUrl=file/90399395/9039939520110506361800/large.png&spname=%E4%B8%AD%E5%9B%BD%E8%81%94%E5%90%88%E7%BD%91%E7%BB%9C%E9%80%9A%E4%BF%A1%E6%9C
%89%E9%99%90%E5%85%AC%E5%8F%B8&cnname=%E6%B2%83%E5%95%86%E5%BA%97%E6%89%8B%E6%9C%BA%E5%AE%A2%E6%88%B7%E7%AB
%AF&productId=9039939520110506361800&productIndex=23134&fileSize=1611.58"
下载下来的不是想要的apk应用,而又是一个页面,不过下载地址就在这个页面里面,这个为页面的头部
<head>
<meta http-equiv="refresh" content="1;URL=http://58.246.196.84:8951/switch/240542468MP/1/DE9001412FD907BBE2ABEAD5BFC200AB3B3AB82E/1329290748033.apk"/>
<title>中国联通沃商店</title>
<link href="/320fantastic/css/wap.css" rel="stylesheet" type="text/css" />
</head>
有一个重定向的过程,再用正则表达式提取出那个apk的地址就可以直接下载了
wget -O 1.apk http://58.246.196.84:8951/switch/240542468MP/1/DE9001412FD907BBE2ABEAD5BFC200AB3B3AB82E/1329290748033.apk
完成。
最后写个wget的比较完整的请求,一开始没察觉是cookie的错误,就一直把发送头给补充了点,加了ua和参考链接,为以后也做个参考
wget -O 1 --load-cookies=cookie --keep-session-cookies --referer="http://mstore.wo.com.cn/download/downCharge.action?
buyMore=false&buyType=1&isharman=0&productId=9039939520110506361800&productIndex=23134&cnname=%E6%B2%83%E5%95%86%E5%BA%97%E6%89%8B%E6%9C%BA%E5%AE
%A2%E6%88%B7%E7%AB%AF&imgUrl=file/90399395/9039939520110506361800/large.png&spname=%E4%B8%AD%E5%9B%BD%E8%81%94%E5%90%88%E7%BD%91%E7%BB%9C%E9%80%9A%E4%BF
%A1%E6%9C%89%E9%99%90%E5%85%AC%E5%8F%B8&fileSize=1611.58" --header="User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)"
%E8%81%94%E5%90%88%E7%BD%91%E7%BB%9C%E9%80%9A%E4%BF%A1%E6%9C%89%E9%99%90%E5%85%AC%E5%8F%B8&cnname=%E6%B2%83%E5%95%86%E5%BA%97%E6%89%8B%E6%9C%BA%E5%AE
%A2%E6%88%B7%E7%AB%AF&productId=9039939520110506361800&productIndex=23134&fileSize=1611.58"