今天没事搞搞模拟登录的问题:
有人用控制台的写:static void Main(string[] args)
        {
            //
            // TODO: 在此处添加代码以启动应用程序
            //
            string url = "http://bjapp2.mail.tom.com/cgi/ldapapp?funcid=mails&sid=cAnaEFDLTEKAsbfq&checkmail=1";
            // 
            string indata = url;
            string outdata = "";
            Cookie cookie = new Cookie("Info", "name0607=用户名[email protected]+用户名密码+自动登录0; Coremail=wedQwaQJWuaqc%cAnaEFDLTEKAsbfq; tom_test=ennDYf6VT!325!9!1305699915!1306202635!83!1306148651!http://bjapp2.mail.tom.com/cgi/ldapapp!; ad_-.-AD-.-=AKD4wATOr!5!3!1305701091!84!432748!2!13!3!null!!1306133839!!!; __utma=236937426.3563621251020157400.1305699981.1306199305.1306200456.9; __utmz=236937426.1306200456.9.8.utmcsr=mail.tom.com|utmccn=(referral)|utmcmd=referral|utmcct=/logout.html; __utmb=236937426.3.10.1306200456", "", "mail.tom.com");
            
            CookieContainer myCookieContainer = new CookieContainer();
            myCookieContainer.Add(cookie);
            //新建一个CookieContainer来存放Cookie集合
            HttpWebRequest myHttpWebRequest = (HttpWebRequest)WebRequest.Create(url);
            //新建一个HttpWebRequest
            myHttpWebRequest.ContentType = "application/x-www-form-urlencoded";
            myHttpWebRequest.ContentLength = indata.Length;
            myHttpWebRequest.Method = "POST";
            myHttpWebRequest.CookieContainer = myCookieContainer;
            //设置HttpWebRequest的CookieContainer为刚才建立的那个myCookieContainer
            Stream myRequestStream = myHttpWebRequest.GetRequestStream();
            StreamWriter myStreamWriter = new StreamWriter(myRequestStream, Encoding.GetEncoding("gb2312"));
            myStreamWriter.Write(indata);
            //把数据写入HttpWebRequest的Request流
            myStreamWriter.Close();
            myRequestStream.Close();
            //关闭打开对象
            HttpWebResponse myHttpWebResponse = (HttpWebResponse)myHttpWebRequest.GetResponse();
            //新建一个HttpWebResponse
            myHttpWebResponse.Cookies = myCookieContainer.GetCookies(myHttpWebRequest.RequestUri);
            //获取一个包含url的Cookie集合的CookieCollection
            Stream myResponseStream = myHttpWebResponse.GetResponseStream();
            StreamReader myStreamReader = new StreamReader(myResponseStream, Encoding.GetEncoding("gb2312"));
            outdata = myStreamReader.ReadToEnd();
            //把数据从HttpWebResponse的Response流中读出
            myStreamReader.Close();
            myResponseStream.Close();
            Console.WriteLine(outdata);
            //显示"登录"
            //拿到了Cookie,再进行请求就能直接读取到登录后的内容了
            myHttpWebRequest = (HttpWebRequest)WebRequest.Create(url);
            myHttpWebRequest.CookieContainer = myCookieContainer;//*
            //刚才那个CookieContainer已经存有了Cookie,把它附加到HttpWebRequest中则能直接通过验证
            myHttpWebResponse = (HttpWebResponse)myHttpWebRequest.GetResponse();
            myHttpWebResponse.Cookies = myCookieContainer.GetCookies(myHttpWebRequest.RequestUri);
            myResponseStream = myHttpWebResponse.GetResponseStream();
            myStreamReader = new StreamReader(myResponseStream, Encoding.GetEncoding("gb2312"));
            outdata = myStreamReader.ReadToEnd();
            myStreamReader.Close();
            myResponseStream.Close();
            Console.WriteLine(outdata);
            Console.ReadLine();
            //再次显示"登录"
            //如果把*行注释调,就显示"没有登录"
        }
那个system.net.Cookie不好设置成对的name+value进去,这样写Cookie cookie = new Cookie("Info", "name0607=用户名[email protected]...")总报错。
========================================一条华丽的分割线====================================
下面用简单的response设置HttpCookie方法,居然成功了十几次(肯定是成功的,排除各种浏览器的问题),至少可以看见收件箱中的一页,第二页翻页就提示超时了 public void getSingle(string url,string c)
        {
            HttpCookie cookie = new HttpCookie("Info", c);
            Response.AppendCookie(cookie);
            Response.Redirect(url);
}
pageload里面getSingle("http://bjapp2.mail.tom.com/cgi/ldapapp?funcid=mails&sid=dAWRSXEHFZOAEBgA&checkmail=1", "name0607=用户名[email protected]+用户名密码+自动登录0; tom_test=ennDYf6VT!348!9!1305699915!1306203408!106!1306148651!http://bjapp2.mail.tom.com/cgi/ldapapp!; ad_-.-AD-.-=AKD4wATOr!5!3!1305701091!84!432748!2!13!3!null!!1306133839!!!");==============================================再来一条猥琐的分割线==============================
有人说cookiecontainer可以实现,我的想法是从正常登录的页面提取封装cookiecontainer再模拟登录提交理论上应该可以。但是代码着手不顺畅,求各位大神给思路,贴代码。各种google没结果。。
另:cookie提取用的是HttpAnalyzer V3自己注册了个邮箱的cookie

解决方案 »

  1.   


    //新建一个html页,把这些粘进去,这是仿HAO123的,,,如果只要tom邮箱。。自己扒出来
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <title>仿HAO123邮箱切换-www.codefans.net</title>
    <meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
    </head> 
    <body><FORM name=gomail onSubmit="return clickMail()" action="" method=post id=FrLgn><INPUT type=hidden name=url><INPUT type=hidden name=username><INPUT type=hidden name=type><INPUT type=hidden name=password><INPUT type=hidden name=domain><input name=.intl value=cn type=hidden><input value=ym name=.src type=hidden><INPUT type=hidden name=user><INPUT type=hidden name=pass><INPUT type=hidden value=true name=enterVip><INPUT type=hidden name=UserName><INPUT type=hidden name=Password><INPUT type=hidden name=u><INPUT type=hidden name=psw><INPUT type=hidden name=login><!--/--><INPUT type=hidden name=LoginName><INPUT type=hidden name=usr><INPUT type=hidden name=func><INPUT type=hidden name=login_name><INPUT type=hidden name=login_password><INPUT type=hidden name=BackURL><INPUT type=hidden value=http://mail.google.com/mail?ui=html&amp;zy=l name=continue><INPUT type=hidden name=Email><INPUT type=hidden name=domainname><INPUT type=hidden value=false name=firstlogin><INPUT type=hidden name=starttime><INPUT type=hidden name=p2><INPUT type=hidden name=passwd><INPUT type=hidden name=id><INPUT type=hidden name=m><INPUT type=hidden name=mpass><INPUT type=hidden name=loginid><INPUT type=hidden name=appid><INPUT type=hidden name=ru><INPUT type=hidden name=eru><INPUT type=hidden name=fl><INPUT type=hidden name=ct><INPUT type=hidden name=vr><INPUT type=hidden name=sg><INPUT type=hidden name=vwriter><INPUT type=hidden name=email><INPUT type=hidden name=passport_51_user><!--/--><INPUT type=hidden name=passport_51_password><INPUT type=hidden name=gourl><INPUT type=hidden name=Passwd><INPUT type=hidden name=vpassword>用户名:<input tabIndex=1 size=15 name=uName> 邮箱:<select tabIndex=2 size=1 name=domainss><option selected >请选择邮箱</option><option value=163>@163.com 网易</option><option value=126>@126.com 网易</option><option value=sina>@sina.com 新浪</option><option value=yahoo>@yahoo.com.cn</option><option value=yahoocn>@yahoo.cn</option><!--/--><option value=gmail>@gmail.com</option><option value=sohu>@sohu.com 搜狐</option><option value=tom>@tom.com</option><option value=188>@188.com</option><option value=21cn>@21cn.com</option><option value=yeah>@yeah.net</option><option>-请选择其他服务-</option><option value=baidu>百度账号</option><option value=chinaren>ChinaRen校友录</option><option value=xiaonei>校内网</option><option value=51com>51.com</option></select> 密码:<input tabIndex=3 type=password size=12 name=uPw> <input   tabIndex=4 type=submit value=" 登录 " name=sub style="height:1.67em;width:5.0em;font-size:13px"><INPUT type=hidden value=submit name=cmd>
    <script>
    function clickMail()
    {var gm=document.gomail
    var vDomain=gm.domainss
    var vName=gm.uName
    var vPw=gm.uPw
    if(vDomain.value==""){alert("您没有选择邮箱!")
    vDomain.focus()
    return false}
    if(vName.value==""){alert("用户名不能为空!")
    vName.focus()
    return false
    }
    if(vPw.value==""){alert("密码不能为空!")
    vPw.focus()
    return false}
    switch(vDomain.value){
    case "163":
    gm.action="http://reg.163.com/CheckUser.jsp"
    gm.url.value="http://fm163.163.com/coremail/fcg/ntesdoor2?lightweight=1&verifycookie=1&language=-1&style=15"
    gm.username.value=vName.value
    gm.password.value=vPw.value
    gm.enterVip.value=''
    break
    case "126":
    gm.action="https://reg.163.com/logins.jsp"
    gm.domain.value="126.com"
    gm.username.value=vName.value +"@126.com"
    gm.password.value=vPw.value
    gm.url.value="http://entry.mail.126.com/cgi/ntesdoor?lightweight%3D1%26verifycookie%3D1%26language%3D0%26style%3D-1";
    break
    case "yeah":
    gm.action="https://reg.163.com/logins.jsp"
    gm.domain.value="yeah.net";
    gm.username.value=vName.value +"@yeah.net"
    gm.password.value=vPw.value
    gm.url.value="http://entry.mail.yeah.net/cgi/ntesdoor?lightweight%3D1%26verifycookie%3D1%26style%3D-1";
    break
    case "188":
    gm.action="http://reg.mail.188.com/servlet/coremail/login?language=0&style=1"
    gm.user.value=vName.value
    gm.pass.value=vPw.value
    break
    case "sohu":
    gm.action="http://passport.sohu.com/login.jsp"
    gm.url.value=""
    gm.UserName.value=vName.value
    gm.Password.value=vPw.value
    gm.id.value=vName.value
    gm.username.value=vName.value
    gm.password.value=vPw.value
    gm.m.value=vName.value
    gm.passwd.value=vPw.value
    gm.mpass.value=vPw.value
    gm.loginid.value=vName.value+"@sohu.com"
    gm.fl.value="1"
    gm.vr.value="1|1"
    gm.appid.value="1000"
    gm.ru.value="http://login.mail.sohu.com/servlet/LoginServlet"
    gm.eru.value="http://login.mail.sohu.com/login.jsp"
    gm.ct.value="1173080990"
    gm.sg.value="5082635c77272088ae7241ccdf7cf062"
    break
    case "yahoo":
    gm.action="https://edit.bjs.yahoo.com/config/login"
    gm.login.value=vName.value
    gm.passwd.value=vPw.value
    break
    case "yahoocn":
    gm.action="https://edit.bjs.yahoo.com/config/login"
    gm.login.value=vName.value+"@yahoo.cn"
    gm.passwd.value=vPw.value
    break
    case "tom":
    gm.action="http://bjweb.163.net/cgi/163/login_pro.cgi"
    gm.user.value=vName.value
    gm.pass.value=vPw.value
    break
    case "21cn":
    gm.action="http://passport.21cn.com/maillogin.jsp"
    gm.LoginName.value=vName.value
    gm.passwd.value=vPw.value
    gm.domainname.value="21cn.com"
    gm.UserName.value=vName.value+'@21cn.com'
    break
    case "sina":
    gm.action="http://mail.sina.com.cn/cgi-bin/login.cgi"
    gm.u.value=vName.value
    gm.psw.value=vPw.value
    break
    case "gmail":
    gm.action="https://www.google.com/accounts/ServiceLoginAuth"
    gm.Email.value=vName.value
    gm.Passwd.value=vPw.value
    break
    case "chinaren":
    gm.action="http://passport.sohu.com/login.jsp"
    gm.loginid.value=vName.value+"@chinaren.com"
    gm.passwd.value=vPw.value
    gm.fl.value="1"
    gm.vr.value="1|1"
    gm.appid.value="1005"
    gm.ru.value="http://profile.chinaren.com/urs/setcookie.jsp?burl=http://alumni.chinaren.com/"
    gm.ct.value="1174378209"
    gm.sg.value="84ff7b2e1d8f3dc46c6d17bb83fe72bd"
    break
    case "tianya":
    gm.action="http://www.tianya.cn/user/loginsubmit.asp"
    gm.vwriter.value=vName.value
    gm.vpassword.value=vPw.value
    break
    case "baidu":
    gm.action="http://passport.baidu.com/?login"
    gm.u.value="http://passport.baidu.com/center"
    gm.username.value=vName.value
    gm.password.value=vPw.value
    break
    case "xiaonei":
    gm.action="http://login.xiaonei.com/Login.do"
    gm.email.value=vName.value
    gm.password.value=vPw.value
    break
    case "51com":
    gm.action="http://passport.51.com/login.5p"
    gm.passport_51_user.value=vName.value
    gm.passport_51_password.value=vPw.value
    gm.gourl.value="http%3A%2F%2Fmy.51.com%2Fwebim%2Findex.php"
    break
    }
    vPw.value=""
    return true
    }
    </script>
    </body>
    </html>
      

  2.   

    谢2楼,但是我想使用cookie通过验证不输入用户密码
      

  3.   


    程序是死的。。人是活的JS也能用cookies那就用你的方式吧。。你的这一堆:。name0607=用户名[email protected]...存入时进行一下编码
    顺便可以看看这些cookies操作。嘿嘿
      

  4.   

    http://blog.csdn.net/wyw308/archive/2011/05/24/6441405.aspx
    腾讯的拍拍网今日特价秒杀器--拍拍抢拍精灵实现过程--核心代码
    使用cookie通过验证直接抢拍,不输入用户密码
    和你的模拟登陆应该一样
      

  5.   


    public static CookieContainer GetCookieFromStr(string ck_str, string domain)
            {
    by/ http://blog.csdn.net/wyw308            CookieContainer myCookieContainer = new CookieContainer();
                string cookieStr = ck_str;
                string[] cookstr = cookieStr.Split(';');
                foreach (string str in cookstr)
                {
                    string[] cookieNameValue = str.Split('=');
                    if (cookieNameValue.Length > 1 )
                    {
                        Cookie ck = new Cookie(cookieNameValue[0].Trim().ToString(), str.Substring(cookieNameValue[0].Trim().ToString().Length + 2));
                       
                        ck.Domain = domain;
                        ck.Path = "/";
                   
                        myCookieContainer.Add(ck);
                    }            }
                return myCookieContainer;
            }这个方法貌似对我这个cookie不能用啊(name0607=用户名[email protected]+用户名密码+自动登录0; Coremail=wedQwaQJWuaqc%cAnaEFDLTEKAsbfq; tom_test=ennDYf6VT!325!9!1305699915!1306202635!83!1306148651!http://bjapp2.mail.tom.com/cgi/ldapapp!; ad_-.-AD-.-=AKD4wATOr!5!3!1305701091!84!432748!2!13!3!null!!1306133839!!!; __utma=236937426.3563621251020157400.1305699981.1306199305.1306200456.9; __utmz=236937426.1306200456.9.8.utmcsr=mail.tom.com|utmccn=(referral)|utmcmd=referral|utmcct=/logout.html; __utmb=236937426.3.10.1306200456)
      

  6.   

    LZ 你试过京东商城 怎么用cooike 的方法  用用户名 和密码 登录吗?
      

  7.   

    不同的站点登陆方式不一样,你先抓包,然后手工构造需要的数据或cookie啊
    哪能照搬呢
    HttpAnalyzerStdV5 http抓包分析软件
      

  8.   

    HttpAnalyzerStdV5  和fiddler 那个好? 我用的是fiddler
      

  9.   

    暂时没有,考虑到京东的cookie也不好抓!
      

  10.   

    我也在用这款抓包工具,现在tom的是可以获取整个界面局部iframe的登录权限
      

  11.   

    每个iframe都可以单独打开,但是就是拼不出一个完整的界面,tom邮箱使用哪个语言写的?
      

  12.   

    继续纠结,一定可以搞出来,期待CSDN大神指导