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

苏飞论坛

 找回密码
 马上注册

QQ登录

只需一步,快速开始

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

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

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

查看: 23797|回复: 15

[例子] C#实现QQ邮箱自动登陆---HttpHelper实现

[复制链接]
发表于 2012-10-1 10:16:00 | 显示全部楼层 |阅读模式
Q邮箱登陆采用https 安全通道,测试的时候使用http会导致验证码不正确或者输入多个验证码才能返回成功(IP没有异常的情况下)
@qq.com 域的用户基本全部需要输入验证码,@vip.qq.com可根据情况去判断是否需要验证码

验证码获取地址:https://mail.qq.com/cgi-bin/getverifyimage?aid=23000101&f=html&ck=1&"+Utils.getRadomNum()
Utils.getRadomNum() 方法生成16位随机小数

登陆提交地址:https://mail.qq.com/cgi-bin/login?sid=,2,zh_CN
提交内容:sid=%2C2%2Czh_CN&firstlogin=false&starttime={0}&redirecturl=&f=html&p={1}&ept=0&delegate_url=&s=&ts={2}&from=&ppp=&chg=0&target=&checkisWebLogin=6&uin={3}&aliastype=%40qq.com&pp=00000000000&verifycode={4}

其中{0}是一个时间戳,填写当前距1970-1-1 的毫秒数,js里边的 new date().getTime() 或者 (new date()).valueOf()
{1}为密码
{2}也是一个时间戳,是服务器给返回的,可以在登陆页面的隐藏域中找到,经测试是 当然时间的unix时间(unix时间戳)
{3}是QQ号码
{4}为验证码

提交方式:post

如果没有登陆成功 js会控制转向,其中源码包含errtype=1 为密码或者帐号错误 errtype=2为验证码错误

登陆成功服务器会给分配类似(m123.mail.qq.com)的邮件服务器,会给写入大量cookie ,在这个返回页面中可以获取到sid

编码过程中出现的问题:以http方式去登陆会出现验证码错误,但是以https的方式 服务器却不给返回分配的邮件服务器,但是会给写登陆成功的cookie,好在在cookie里也可以取到邮件服务器,这个问题也就不是问题了

还有一个步骤,在发邮件的时候 需要一个key,这个key的值为cookie里的qm_sid ,这个key随便写好像也能成功,如果获取的话需要在登陆成功页面提取一个连接去访问,然后去取隐藏域,这个请参见下边的代码
[C#] 纯文本查看 复制代码
public System.IO.Stream GetVerifyCodePic()
        {
            //HttpHelper.GetHtml("https://mail.qq.com/cgi-bin/loginpage", User.Cookie);
            return HttpHelper.GetStream("https://mail.qq.com/cgi-bin/getverifyimage?aid=23000101&f=html&ck=1&"+Utils.getRadomNum(), User.Cookie);
        }

登陆代码
[C#] 纯文本查看 复制代码
public void Login()
        {
            //string content = HttpHelper.GetHtml("https://mail.qq.com/cgi-bin/loginpage", User.Cookie);
            //string ts = Utils.getStringByRegex(content, "(input type=\"hidden\" name=\"ts\" value=\")(?<ts>.+?)(\" )", "ts", 0);
            
            string url = "https://mail.qq.com/cgi-bin/login?sid=,2,zh_CN";
            string postData = string.Format("sid=%2C2%2Czh_CN&firstlogin=false&starttime={0}&redirecturl=&f=html&p={1}&ept=0&delegate_url=&s=&ts={2}&from=&ppp=&chg=0&target=&checkisWebLogin=6&uin={3}&aliastype=%40qq.com&pp=00000000000&verifycode={4}", Utils.GetTime(), User.Password, Utils.UNIX_TIMESTAMP(), User.UserName, User.VerifyCode);
            string result = HttpHelper.GetHtml(url, postData, true, User.Cookie);

            if(result.Contains("errtype=2"))
            {
                User.Status = UserStatus.VerifyCodeError;
            }else if(result.Contains("errtype=1"))
            {
                User.Status = UserStatus.PasswordError;
            }else
            {
                result = result.Replace("+", "@");
                //User.Host = Utils.getStringByRegex(result, "(var urlHead=\")(?<url>.+?)(\";)", "url", 0);
                User.Host = "http://" + Utils.GetGtkByCookieSkey("edition", User.Cookie) + "/cgi-bin/";
                string targetUrl = "";
                string target = "";
                string mailto = "";
                string frame = Utils.getStringByRegex(result, "(targetUrl = urlHead @ \")(?<sid>.+?)(\";)", "sid", 0);
                targetUrl = User.Host + frame;
                if (frame != "")
                {
                    User.Sid = frame.Substring(15);
                }
                if (targetUrl == "")
                {
                    targetUrl = "" != "" ? "" : "/cgi-bin/loginpage";
                }
                if (targetUrl.IndexOf("?") != -1)
                {
                    targetUrl += "&r=" + Utils.getStringByRegex(result, "(targetUrl@=\"&r=)(?<r>.+?)(\";)", "r", 0);
                }
                string res = HttpHelper.GetHtml(targetUrl, User.Cookie);

                if (User.Host != "" && User.Sid != "")
                {
                    User.Status = UserStatus.Logined;
                    string s2 = HttpHelper.GetHtml(User.Host + "grouplist?sid=" + User.Sid + "&t=compose_group&gid=&s=from_mail_list", User.Cookie);
                    User.Key = Utils.getStringByRegex(s2, "(<input type=\"hidden\" name=\"sid\" value=\"?.+?\" /><input id=\")(?<key>.+?)(\" type=\"hidden\")", "key", 1);
                }
                else
                {
                    User.Status = UserStatus.LoginError;
                }
            }
        }

StarTime代码
[C#] 纯文本查看 复制代码
public static long GetTime()
        {
            //DateTime dateTime = DateTime.Now;
            //DateTime startDate = new DateTime(1970, 1, 1);
            //DateTime endDate = DateTime.Now;
            //TimeSpan span = endDate - startDate;
            //return (long)(span.TotalMilliseconds);

            DateTime dt = DateTime.Now;
            long dtTicks = dt.ToUniversalTime().Ticks;
            long jsBeginTick = DateTime.Parse("1970-1-1").Ticks;
            long dtJsTicks = (dtTicks - jsBeginTick) / (1000 * 10);
            return dtJsTicks;
        }


[C#] 纯文本查看 复制代码
public static long UNIX_TIMESTAMP()
        {
            return (DateTime.Now.ToUniversalTime().Ticks - 621355968000000000) / 10000000;
        }

本帖被以下淘专辑推荐:



1. 开通SVIP会员,免费下载本站所有源码,不限次数据,不限时间
2. 加官方QQ群,加官方微信群获取更多资源和帮助
3. 找站长苏飞做网站、商城、CRM、小程序、App、爬虫相关、项目外包等点这里
发表于 2012-10-15 18:34:28 | 显示全部楼层
值得研究呀。
发表于 2012-10-30 18:59:54 | 显示全部楼层
非常感谢,建议多出一点使用HttpHelper的例子给大家参考 学习。
发表于 2012-10-30 19:09:04 | 显示全部楼层
老大 可以放出全部源代码吗
 楼主| 发表于 2012-10-30 19:57:44 | 显示全部楼层
枫子 发表于 2012-10-30 19:09
老大 可以放出全部源代码吗

这就是全部了,没什么了,你自己建个项目,把类放进去完事
发表于 2012-11-14 16:58:22 | 显示全部楼层
楼主好真好,学到新东西了,谢谢
发表于 2012-11-15 13:14:54 | 显示全部楼层
支持楼主,学习来了
发表于 2012-11-30 16:32:30 | 显示全部楼层
LZ搞过验证码识别么?这种邮箱登陆少数的可以手工打码,大量的还是搞个验证码识别更好点
 楼主| 发表于 2012-11-30 16:38:15 | 显示全部楼层
liuhaolin8828 发表于 2012-11-30 16:32
LZ搞过验证码识别么?这种邮箱登陆少数的可以手工打码,大量的还是搞个验证码识别更好点

这个写是写过,只是每个网站的验证码都有不同,程序无法通用,需要单击开发才行
发表于 2013-1-22 08:53:29 | 显示全部楼层
本帖最后由 幻雪丶逆时光 于 2013-1-22 09:19 编辑

感谢 飞哥. 最近使用HttpHelper 登入 腾讯  老是提示连接超时.
这个 真心 有用.
顺便 问下 Utils 类 源码在那里?
您需要登录后才可以回帖 登录 | 马上注册

本版积分规则

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

GMT+8, 2024-4-20 12:02

© 2014-2021

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