03
2011-02

过年不偷懒之C#篇:Qq农场帮手

 今年春节没能回家,一个人在一个还不是很熟悉的城市宅了几天,难说是打发时间还是了却宿愿,倒腾出了一个Qq农牧场自动收菜偷鸡的玩意。

点击下载

目前各版本相关的辅助软件很多,但是一直不太敢放心大胆的用。一方面上面绑了一堆一堆的广告;另一方面毕竟要把填写Qq密码,在这个盗号猖獗防不胜防的年代,还是小心为上,为了偷点菜把号丢了可算是因小失大得不偿失了。总的来说吧,孩子还是自己家的好,软件也一样。
 
以前用C++开了个头,完成了登录和获取信息,之后再也没时间继续了,留下了个无穷无尽的怨念。这次用的是C#,用来完成这个比C++要方便一些,再配上JSON库,把时间节省了不少,科技提高效率,此言不虚。这两天时间完成个主框架,还有很多bug,其中最主要的是验证码部分还没处理好。
 
登录方式模仿的是Web登录,分析一下空间(http://qzone.qq.com/)登录过程,当输入完Qq号码(888888)后,Ajax便调用(http://ptlogin2.qq.com/check?uin=888888&appid=15000101&r=0.1374783389515999)获取验证码,服务器判断Qq账号状态,多数情况下返回的报文如: ptui_checkVC('0','!2N2');
web登录的话证码便是!2N2,后台自动提交,无需用户填写。有时候返回的报文是:  ptui_checkVC('1',''); 
同时还会获取验证码图片(http://captcha.qq.com/getimage?aid=15000101&r=0.2009549170004492&uin=6342344234&vc_type=),此时需要输入图片显示的验证码。
 
提交登录数据用的是GET方式,网址:http://ptlogin2.qq.com/login?http://ptlogin2.qq.com/login?u=888888&p=E70DD9DDE669D50664CB1389302A92A4&verifycode=!2N2&=on&aid=15000101&u1=http%3A%2F%2Fimgcache.qq.com%2Fqzone%2Fv5%2Floginsucc.html%3Fpara%3Dizone&ptredirect=1&h=1&from_ui=1&dumy=&fp=loginerroralert&=on&aid=15000101&u1=http%3A%2F%2Fimgcache.qq.com%2Fqzone%2Fv5%2Floginsucc.html%3Fpara%3Dizone&ptredirect=1&h=1&from_ui=1&dumy=&fp=loginerroralert
提交的主要参数是u(账号)、p(密码)和verifycode(验证码)。密码是经过加密的,腾讯为了这个加密可谓是煞费苦心,搞得我也只得花费大量时间在这个上面。当初用C++的时候,调用的是网页上的JS脚步来加密,要添加类库不说,代码也极为繁琐,想想当时的调试过程就有点头晕恶心。后来经高人指点,总算搞清了加密算法,就是先把密码用MD5加密3次,加上验证码转为大写后再次用MD5加密,并把最终结果都转为大写。用C#实现MD5加密比C++方便多了,首先要引用System.Security.Cryptography,然后就调用 MD5: 
/// <summary>
/// md5加密
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
public static string getMd5Hash(string input)
{
        MD5 md = MD5.Create();
        byte[] buffer = md.ComputeHash(Encoding.Default.GetBytes(input));
        StringBuilder builder = new StringBuilder();
        for (int I = 0; I < buffer.Length; i++)
        {
               builder.Append(buffer[i].ToString("x2"));
        }
        return builder.ToString();
}
/// <summary>
/// 三次md5加密
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
public static string getMd5Hash3(string input)
{
        MD5 md = MD5.Create();
        byte[] buffer = md.ComputeHash(Encoding.Default.GetBytes(input));
        buffer = md.ComputeHash(buffer);
        buffer = md.ComputeHash(buffer);
        StringBuilder builder = new StringBuilder();
        for (int I = 0; I < buffer.Length; i++)
        {
                builder.Append(buffer[i].ToString("x2"));
        }
        return builder.ToString();
}
 
有了以上准备,得到p就轻松惬意了很多:  
 p = getMd5Hash(Utils.getMd5Hash3(Password).ToUpper() + verifyCode.ToUpper()).ToUpper();
不要以为得到了u、p和verifycode就万事大吉了,这只是万里长征刚走完了第一步,还有最重要的一步就是cookie。提交登录数据时,要附带上获得验证码时获得的cookie。Cookie的分析相当的麻烦,文本方式的验证码还好些,图片方式的验证码还没有搞定,以后有时间再说吧。
 
提交完登录数据返回的报文如果是ptuiCB('0','0','http://imgcache.qq.com/qzone/v5/loginsucc.html?para=izone','1','登录成功!');\r\n,那就意味着登录成功,可以继续下一步,用这个cookie去获取农场的数据。
« 上一篇下一篇 »

相关文章:

留言列表:

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。