http://www.sufeinet.com/plugin.php?id=keke_group

苏飞论坛

 找回密码
 马上注册

QQ登录

只需一步,快速开始

分布式系统框架(V2.0) 轻松承载百亿数据,千万流量!讨论专区 - 源码下载 - 官方教程

HttpHelper爬虫框架(V2.7-含.netcore) HttpHelper官方出品,爬虫框架讨论区 - 源码下载 - 在线测试和代码生成

HttpHelper爬虫类(V2.0) 开源的爬虫类,支持多种模式和属性 源码 - 代码生成器 - 讨论区 - 教程- 例子

查看: 9228|回复: 2

[例子] HttpHelper模拟注册网易通行证

[复制链接]
发表于 2014-4-21 17:42:14 | 显示全部楼层 |阅读模式
RT哈,废话不多说,直接上抓包数据分析及代码:
第一步:
  获取注册页面源代码,后续取得验证码的时候需要计算envalue的值,代码如下:
[C#] 纯文本查看 复制代码
//打开页面,获取envalue
            string url = "http://reg.email.163.com/unireg/call.do?cmd=register.entrance&from=126mail";
            string host = "reg.email.163.com";
            string referer = "http://reg.email.163.com/unireg/call.do?cmd=register.entrance&from=126mail";
            HttpHelper http = new HttpHelper();
            string timemp = time.Substring(0, time.IndexOf("."));
            HttpItem item = new HttpItem() 
            { 
                URL = url,
                Host = host,
                ContentType = ContentType
            };
            HttpResult result = http.GetHtml(item);
            cookieString = result.Cookie;
            string html = result.Html;
            string envalue = Regex.Match(html, "(?is)(?<=envalue : \")[^\"]+(?=\")").Value;

这时cookieString已经保存了本次访问获取的cookie值,我们需要提取出“JSESSIONID”和“ser_adapter”备用,见代码:
[C#] 纯文本查看 复制代码
//从cookie中提取sid
            sid = HttpCookieHelper.GetCookieValue("JSESSIONID", cookieString);
            sd = HttpCookieHelper.GetCookieValue("ser_adapter", cookieString);

第二步获取验证码:
这一步比较重要,需要通过第一步获取的envalue调用JavaScript获得计算后的值,js稍后我会提供下载,上代码:
[C#] 纯文本查看 复制代码
public static object GetEnValue(string jsFilePath, string funcName, params object[] paramers)
        {
            StreamReader reader = new StreamReader(jsFilePath);
            string sScript = reader.ReadToEnd();
            ScriptEngine se = new ScriptEngine(ScriptLanguage.JavaScript);
            object obj = se.Run(funcName, paramers, sScript);
            return obj;
        }
获取到env的之后请求验证码:
[C#] 纯文本查看 复制代码
string env = GetEnValue("env.js", "env", envalue).ToString();
            url = "http://reg.email.163.com/unireg/call.do?cmd=register.verifyCode&v=common/verifycode/vc_en&env=" + env + "&t=" + timemp;
            item = new HttpItem() 
            { 
                URL = url,
                Host = host,
                Cookie = cookieString,
                Referer = referer,
                ContentType = ContentType,
                ResultType = ResultType.Byte
            };
            result = http.GetHtml(item);
            pictureBox1.Image = byteArrayToImage(result.ResultByte);
到这里我们已经能正常获取验证码了,如果失败的同学,检查下cookie时候正常传递

第三步,网易注册是https协议的,我们现在要获取ssl提交时需要带的cookie,上代码
[C#] 纯文本查看 复制代码
//开始获取ssl的cookie
            url = string.Format("https://ssl.mail.163.com/regall/unireg/prepare.jsp?sid={0}&sd={1}",sid,sd);
            item = new HttpItem()
            {
                URL = url,
                Host = "ssl.mail.163.com",
                Referer = referer,
                ContentType = ContentType
            };
            result = http.GetHtml(item);
            sslCookieString = result.Cookie;

注意这里的参数 sid=第一步我们获取的cookie中“JSESSIONID”的值,sd为cookie中“ser_adapter”的值
到这里我们已经获取到了ssl需要的cookie了

最后一步,正式提交注册,上代码:
[C#] 纯文本查看 复制代码
string username = this.username.Text.Trim();
            string password = this.password.Text.Trim();
            string code = this.code.Text.Trim();
            string url = string.Format("https://ssl.mail.163.com/regall/unireg/call.do;jsessionid={0}?cmd=register.start",sid);
            string host = "ssl.mail.163.com";
            string data = string.Format("name={0}&flow=main&uid={1}%40126.com&password={2}&confirmPassword={3}&mobile=&vcode={4}&from=126mail", username, username,password,password,code);

            HttpHelper http = new HttpHelper();
            HttpItem item = new HttpItem()
            {
                URL = url,
                Host = host,
                Postdata = data,
                Method = "POST",
                ContentType = ContentType,
                Cookie = sslCookieString
            };
            HttpResult result = http.GetHtml(item);

注意这里的cookie,传递的是第三步的cookie哦!!!
如果这时候返回值不是{"code":401,"desc":"PARAMETER ERROR","msg":"VCODE_NOT_MATCH"} 的话,就表示注册成功了哈,如果返回值是这个,检查下cookie是否传递错误,比较重要的一点要注意下ContentType的值,必须自定义设置为“application/x-www-form-urlencoded”,不然会一直提示刚才那个错误,切记!!!
附件上传一个JavaScript的工具

ScriptEngine.rar

1.4 KB, 下载次数: 141, 下载积分: 金钱 -1

C#执行Javascript



1. 开通SVIP会员,免费下载本站所有源码,不限次数据,不限时间
2. 加官方QQ群,加官方微信群获取更多资源和帮助
3. 找站长苏飞做网站、商城、CRM、小程序、App、爬虫相关、项目外包等点这里
 楼主| 发表于 2014-4-21 17:49:07 | 显示全部楼层
忘记贴JS了,这里补充上env.js
[JavaScript] 纯文本查看 复制代码
function env(a) {
    var q = 10,
        w = a,
        n, m = w.length,
        f = new Date(),
        b = f.getTime(),
        c = b % q,
        h = (b - c) / q;
    if (c < 1) {
        c = 1
    }
    c = b % q;
    var d = b % (q * q);
    h = (b - d) / q;
    h = h / q;
    d = (d - c) / q;
    var z = b + "",
        p = z.charAt(q),
        g = c + "" + d + "" + p,
        l = Number(g),
        e = l * Number(w),
        x = e + "",
        k = "";
    for (n = (e + "").length - 1; n >= 0; n--) {
        var o = x.charAt(n);
        k = k + o
    }
    var i = p + k + d + c,
        y = i.length,
        j = 0,
        r = "",
        v = "";
    for (j = 0; j < y; q++) {
        r = r + i.charAt(j);
        j = j + 2
    }
    for (j = 1; j < y; j = j + 2) {
        v = v + i.charAt(j)
    }
    var u = r + v;
    u = i;
    var t = 0,
        s = "";
    for (t = 0; t < u.length; t++) {
        s = s + u.charAt(t)
    }
    return u
}
发表于 2014-4-21 18:03:20 | 显示全部楼层
给力,感谢楼主
您需要登录后才可以回帖 登录 | 马上注册

本版积分规则

QQ|手机版|小黑屋|手机版|联系我们|关于我们|广告合作|苏飞论坛 ( 豫ICP备18043678号-2)

GMT+8, 2024-11-26 03:41

© 2014-2021

快速回复 返回顶部 返回列表