好友
阅读权限10
听众
最后登录1970-1-1
|
近些天闲来无事,手贱进入网易注册界面,萌发写一个自动注册工具来注册网页,省去繁琐的注册流程(鄙人有朋友业余从事似于刷信誉,刷注册量的工作,赚点小外快),由于部分工具类过于庞大,另外也关乎公司部分利益,固已对工具类做出修整,望各位童鞋见谅。也请大神绕道---
链接: http://pan.baidu.com/s/1qWsiDJm 密码: 126o
使用的是httpClient + jsoup
下面着重介绍程序原理:
domain : http://reg.163.com/reg/reg.jsp?product=urs
注册界面的form表单
经过分析,由于我们只是要注册,固对于我们来说,要首先分析主界面注册时发送的请求和所携带的参数
在图中可见此链接最为可疑,时候先为post请求,仔细观察发现重要信息username_r为用户名,password和cpassword是密码和重复输入的第二次密码。但其中还有codez这个参数经过多册尝试,发现其不是固定值,而且radomPassId根据名字可知,其很有可能是随机数。一般为了省事,这些参数就算很难捕获,但是懒人都喜欢放到form表单中跟表单一起提交,先试试这个方法吧,我们继续定位form表单
果然一击命中,发现此处有很多type属性值为hidden的input标签,比对后参数基本都在这里,而且基本全都有id属性(真是懒到家了)。如果真的是在本地随机生成的也就好说了,但是我们发现当输入验证码的时候codez是有一定的算法的,而radomPassId这个东西是不是本地生成的还不好说,现在只有翻查他们的js文件了,由于这几个参数都是有id属性的,因此先从id查起,首先查看网页源码,查找script标签中含有src属性的标签
直接点击链接进入,先从codez查起,进入js界面直接查找#codez或者codez
/js2/reg/checkForm.js?20150210100此界面出现5个可以结果
解读此js片段,得知,此codez获取过程中用可能出现异常,异常后codez的值默认为NULL。也就说明codez可以是NULL(太懒了太懒了)也从另一方面证明codez可以直接携带NULL值直接传给服务器,至此codez值已确定为NULL。
下面开始查找另一个不确定参数radomPassID,通过表单得知此标签id为syscheckcode,开始在js中查找syscheckcode字眼,终于在/js2/common.js?20150210100中找到通过id操作此标签的js片段,经过解读,发现此处不应截图,应放出源码(看过以后有些童鞋应该会很高兴)
(function(window,$,Core,undefined){ var document = window.document, easyNav = window.easyNav, setTimeout = window.setTimeout, clearTimeout = window.clearTimeout;$.extend(Core,{ config : { iptFocClassName : "u-ipt-foc", hideClassName : "f-dn", tipsWarnClassName : "u-tips-warn", tipsOkClassName : "u-tips-ok", tipsErrClassName : "u-tips-err" }, //验证码,返回一个对象,包含变换验证码的方法change checkCode : function(codeLen){ var obj = {}, v = (new Date().getTime()), getIdUrl = "/services/getid", getImgUrl = "/services/getimg?v="+v+"&id=", changeCodeCallback = function(res){ $('#syscheckcode').attr('value',res); $('#checkCode').attr('src',getImgUrl+res); }; if(codeLen){ getIdUrl = "//reg.163.com/services/getid"; getImgUrl = "//reg.163.com/services/getimg?v="+v+"&num="+codeLen+"&type=2&id="; } var changeCode = function(){ $.ajax({ type:"GET", url:getIdUrl, success:changeCodeCallback }); } changeCode(); $(".m-ipt-code .u-btn-img-code,#checkCode").click(function(){ changeCode(); }); obj.change = changeCode; return obj; }, /* 此函数用于发送邮件 */ sendEmail : function(retakeMethod, callback){ $.ajax({ url: "/resetpwd/sendMailForUser.do?retakeMethod="+retakeMethod, //url:"/ftl/testData2/reg/resendActivateMail.txt", success : function(data){ if(typeof callback !== "function"){return;} var data = data.replace("\n",""), rtObj = {code:data, msg:""}; if(data === "200"){ rtObj.msg = "邮件发送成功,马上去邮箱看看!"; }else if(data === "500"){ rtObj.msg = "邮件发送失败,系统维护,请稍后再试!"; }else if(data === "501"){ rtObj.msg = "邮件发送失败,超时!"; }else if(data === "502"){ rtObj.msg = "邮件发送失败,参数错误!"; }else if(data === "503"){ rtObj.msg = "邮件发送失败,尝试次数过多!"; }else if(data === "504"){ rtObj.msg = "邮件发送失败,用户帐号已经锁定!"; }else{ rtObj.msg = "系统错误!"; } callback(rtObj); } }); }, /* 此函数用于向手机发送验证码 * opts.mobile string 手机号码 * opts.channel string * opts.okHandler function 成功后回调 * opts.tooMuchHandler function 发送过于频繁的回调 * opts.errHandler function 系统错误的回调 */ sendMessage : function(opts){ var href = window.location.href, protocol = "http"; if(href.indexOf("https") === 0){ protocol = "https"; }; var opts = $.extend({}, opts); $.ajax({ type:"POST", async:false, url:protocol + "://reg.163.com/services/sendsms", data:{username:opts.mobile, channel:opts.channel}, success:function(msg){ if(msg === '200\n'){ if(typeof opts.okHandler === "function"){ opts.okHandler(); } } else if(msg == '501\n'){ if(typeof opts.tooMuchHandler === "function"){ opts.tooMuchHandler(); } } else{ if(typeof opts.errHandler === "function"){ opts.errHandler(); } } } }); }, //公用业务代码,在各页面的myInit里面执行 commonInit : function(){ //输入框焦点处理 $(".u-ipt input").focus(function(){ var $uIpt = $(this).parents(".u-ipt"); if(!$uIpt.hasClass(Core.config.iptFocClassName)){ $uIpt.addClass(Core.config.iptFocClassName); } }).blur(function(){ var $uIpt = $(this).parents(".u-ipt"); $uIpt.removeClass(Core.config.iptFocClassName); }); //placeholder var $ipts = $(".u-ipt input"); $ipts.length && $ipts.placeholder(); // 广告close按钮 $(".m-adv .u-advClose").click(function(){ $(this).parents(".m-adv").hide(); }); },})(window,jQuery,Core);
这其中不光包括我们需要的参数生成方式,还包括一些其他的东西(验证码来一发--邮箱/手机任意发嘿嘿),经过解读我们得知此处的radomPassID确实是从服务器取得,那么就是通过/services/getid,这个链接取得的值,计算绝对链接地址为http://reg.163.com/services/getid,然后请求验证码是需要携带此参数的,并且一并发送到后台。固至此需要的技术已基本确定,推测后得知,此处无需让爬虫爬取注册界面,可直接先获取验证码,下载到本地,然后直接向服务器发送注册的post请求,将参数携带过去即可。但是从另一方面考虑,如果直接向服务器发送请求验证码的请求,虽然可以请求到,但是当你将参数发送给服务器时,服务器怎样判断你的验证码就是服务器发送给你的主机的验证码呢?(很绕口啊,本人表达能力有限请各位童鞋细细品味)所以此处本人又对连接池进行了配置及装入了Cookie工厂,以备各各连接间可以共享Cookie。
好了,大致实现思路就是如此,程序还有很多不足之处,还请大家多多指正,多多批评,程序入口处使用了用户名随机生成,密码除去了用户名的数字及字母之外的字符,可自由整改(加入代{过}{滤}理及多线程更爽哦)
|
免费评分
-
查看全部评分
|
发帖前要善用【论坛搜索】功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。 |
|
|
|
|