搜索
aardio官方社区 门户 查看主题

QQ WEB 登陆初探,让你了解QQWEB协议(一)

发布者: ninja911 | 发布时间: 2011-10-28 17:25| 查看数: 24755| 评论数: 30|帖子模式

本帖最后由 ninja911 于 2011-10-30 21:53 编辑

【进度】
2011-10-30 21:51   过程中发现无需验证码登陆的情况,此代码有问题。我会在后面的第2部分分享后面已经修正的源码。请耐心等待!目前大体协议逻辑已经清晰了,正在完成基本过程,比如获取分组,获取好友信息,获取群号,保持连接……不出意外过几天就有成果


  import win;
import inet.http;
import string.regex;//导入正则表达式支持库
import fsys;
import fsys.file;
import process;
import web.script

io.open();
//打开控制台

var qq_number = "";
var qq_password = "";
var webqq_type = "1";

var login_number = 0;

/*
*   获取是否需要验证码
*   @param      string      请求返回字符串
*   @return     string      验证码状态
*   @return     string      验证码随机数
*/

rx_validate_status =
function(str){
   
var need_validate = null;
   
var validate_sn = null;
   
if (str) {
        
var rx = "ptui_checkVC\('(\d{1})','(\w{48})'\)";
        
var v1, v2 = string.match(str, rx);
        
if (v1 == "1" || v1 == "0") {
            need_validate = v1;
        }
        
if (v2 && v2 != "") {
            validate_sn = v2;
        }
    }
   
return need_validate, validate_sn;
}

/*
*   获取登陆状态消息
*   @param      string      状态
*   @return     string      消息文字
*/

get_login_msg =
function(status){
   
var msg = "登陆失败";
   
select(status) {
        
case "0" {
            msg =
"登陆成功";
        }
        
case "1" {
            msg =
"系统忙,请稍后再试";
        }
        
case "2" {
            msg =
"已经过期的QQ号码";
        }
        
case "3" {
            msg =
"您输入的密码有误,请重试";
        }
        
case "4" {
            msg =
"您输入的验证码有误,请重试";
        }
        
case "5" {
            msg =
"校验码失败";
        }
        
case "6" {
            msg =
"密码错误,如果您刚修改过密码,请稍后在登陆";
        }
        
case "7" {
            msg =
"您输入有误,请重试";
        }
        
case "8" {
            msg =
"您的IP输入错误次数过多,请稍后再试";
        }
        
else {
            msg =
"登陆失败,未知原因_code_" + status;
        }
    }
   
return msg;
}



/*
*   获取验证码
*   @param      string      QQ号
*   @param      string      验证码随机数(上次请求获得的)
*   @return     string      头部信息        
*/

read_validate =
function(qq_number, validate_sn){
   
var rtime = "0." + time.tick();
   
var url = "http://captcha.qq.com/getimage?aid=1003903&r="+ rtime +"&uin="+ qq_number +"&vc_type=" + validate_sn;
   
var http = inet.http();
    http.flags = 0x80000000;   
//INTERNET_FLAG_RELOAD*强制文件从服务器下载不是缓存
    http.setTimeouts(10000);    //防止超时,默认10秒
    http.beginRequest(url, "GET");
   
var ok, status = http.send();
   
var http_header = null;
   
var str_response = null;
   
var http_cookie = null;
   
if (ok) {
        http_header = http.readHeader();
        
/*
HTTP/1.1 200 OK
Server: tencent http server
Accept-Ranges: bytes
Pragma: No-cache
P3P: CP=CAO PSA OUR
Content-Length: 2744
Set-Cookie: verifysession=h00358bc45e664197d5f76b417327e6b55fd7eb3b5e7e45225988f
45c725e0da78c61b2eda7ba11b9ed896e59ffc9dd83e2; PATH=/; DOMAIN=qq.com;
Connection: close
Content-Type: image/jpeg
        */

        
var tbuffer = {};
        
//开始下载数据
        for(str,size in http.eachRead() ){
            table.push(tbuffer,str) ;
        }  
        str_response =  string.join(tbuffer);
        
if (!io.exist("\data")) {
            fsys.createDir(
"\data");
        }
        
if (!io.exist("\data\" + qq_number)) {
            fsys.createDir(
"\data\" + qq_number);
        }
        
if (io.exist("\data\"+ qq_number +"\validate.bmp")) {
            fsys.delete(
"\data\"+ qq_number +"\validate.bmp");
        }
        string.save(
"\data\"+ qq_number +"\validate.bmp", str_response);
        
//io.print("打开图片目录");
        //io.print(http_header);
        process.execute("\data\"+ qq_number);
    }
    http.endRequest();
   
return http_header;
}


/*
*   登陆
*   @param      string      QQ号
*   @param      string      QQ密码(明文)
*   @return     null        
*/

login =
function(){
   
if (login_number > 3) {
        
return;
    }
   
if (qq_number == "" || qq_password == "") {
        io.print(
"请输入QQ号,然后按回车");
        qq_number = io.getText();
        io.print(
"请输入QQ密码,然后按回车");
        qq_password = io.getText();
        
        
if (qq_number == "" || qq_password == "") {
            io.print(
"QQ号或密码为空有误");
            
return;
        }
   
    }
    io.print(
"是否隐身登陆,是请输入字母y,否则输入字母n,完毕后按回车");
   
var input_webqq_type = io.getText();
   
if (input_webqq_type != "") {
        
if (string.upper(input_webqq_type) == "Y") {
            webqq_type =
"1";
        }
else {
            webqq_type =
"0";
        }
    }
   
   
var rtime = "0." + time.tick();
   
var url = "http://ptlogin2.qq.com/check?uin="+ qq_number +"&appid=1003903&r=" + rtime;
   
var http = inet.http();
    http.flags = 0x80000000;   
//INTERNET_FLAG_RELOAD*强制文件从服务器下载不是缓存
    http.setTimeouts(10000);    //防止超时,默认10秒
    var str_response, str_status = http.get(url);
    http.close();
   
/*
    返回值
    ptui_checkVC('1','23317b93d341f585cd6ee26e8ae7b1d28bea751be3777d88');
    @param 1 - 需要输入验证码
    @param 0 - 不需要输入验证码
    */

   
var need_validate, validate_sn = rx_validate_status(str_response);
   
if (need_validate && validate_sn) {
        
var validate = "";
        
if (need_validate == "1") {
               
var http_header = read_validate(qq_number, validate_sn);
               
if (http_header) {
                    
var str_verifysession = string.match(http_header, "verifysession=(\w+);");  //匹配出verifysession值
                    if (str_verifysession) {
                        
//加密算法 将验证码大写化, 算法 md5(md5_3(密码明文) + 大写验证码);
                        io.print("请输入验证码,然后回车");
                        
var input_validate = io.getText();
                        input_validate = input_validate ? string.trim(input_validate) :
"";
                        
var uper_validate = string.upper(input_validate);
                        
//创建一个支脚本虚拟机
                        var js_vm = web.script();
                        
var js_code_md5 = string.load("\res\md5.func.js");
                        js_vm.AddCode(js_code_md5);
//加载脚本
                        
                        
//直接调用函数,支持多参数,并直接获取返回值
                        var str_mp = js_vm.CodeObject.md5_3(qq_password);
                        
var qq_md5_pwd = js_vm.CodeObject.md5(str_mp ++ uper_validate);
                        
                        io.print(qq_md5_pwd);
                        js_code_md5 =
null;
                        
var url = "http://ptlogin2.qq.com/login?u="+ qq_number +"&p="+ qq_md5_pwd +"&verifycode="+ input_validate +"&webqq_type="+ webqq_type +"&remember_uin=0&aid=1002101&u1=http%3A%2F%2Fw.qq.com%2Fmain.shtml%3F816&h=1&ptredirect=1&ptlang=2052&from_ui=1&pttype=1&dumy=&fp=loginerroralert&action=6-11-17634&mibao_css=";
                        
var http = inet.http();
                        http.flags = 0x80000000;   
//INTERNET_FLAG_RELOAD*强制文件从服务器下载不是缓存
                        http.setTimeouts(10000);    //防止超时,默认10秒
                        http.beginRequest(url, "GET");
                        http.writeHeader(
"Cookie: verifysession=" + str_verifysession)
                        
var ok, status = http.send();
                        
var http_header = null;
                        
var str_response = null;
                        
var http_cookie = null;
                        
if (ok) {
                            http_header = http.readHeader();
                           
var tbuffer = {};
                           
//开始下载数据
                            for(str,size in http.eachRead() ){
                                table.push(tbuffer,str) ;
                            }  
                            str_response =  string.join(tbuffer);
                        }
else {
                            io.print(
"请求出错啦");
                        }
                        http.endRequest();
                        
if (str_response) {
                           
var login_status = string.match(str_response, "ptuiCB\('(\d+)'");
                           
var r_msg = get_login_msg(login_status);
                            io.print(
"状态码:", login_status);
                            io.print(r_msg);
                            io.print(
"====================================================");
                            io.print(http_header);
                           
if (login_status != "0") {
                                login_number++;
                                io.print(
"重新登陆函数中");
                                win.delay(1000);
                                login();
                            }
else {
                                login_number = 0;
                            }
                        }
else {
                            io.print(
"无");
                        }
                    }
                }
        }
    }
else {
        io.print(
"失败位置原因");
        
return;
    }
}
var str_wqq = /*
QQ1:1111111111111
PWD1:111111111111

QQ2:222222222222
PWD2:22222222222222222
*/
;

io.print(str_wqq);

login();


execute("pause") //按任意键继续
io.close();//关闭控制台

点评

同意: 5.0 真棒: 5.0
继续努力: 5.0
同意: 5 真棒: 5 继续努力: 5
顶!  发表于 2011-10-28 17:36

评分

参与人数 17专家分 +730 银币 +494 收起 理由
D→K_.oоО + 1 很给力!
蒹葭 + 2 很给力!
DDTer + 3
罗炎璋 + 30 很给力!
wanderer_hh + 30 赞一个!
fyy + 50 赞一个!
fantasynew + 90 赞一个!
Jacen.He + 500
游戏 + 90 赞一个!
quicker + 100 感谢!
qqmmcc + 50 不错
aiwen + 50 赞一个!
1/3为自己 + 5 很给力!
zhuyuruicu + 30 很给力!
quickerfans + 50 + 100 很给力!
低调点 + 30
dafei2599 + 13 很给力!

查看全部评分

最新评论

ninja911 发表于 2011-10-28 17:27:39

[i=s] 本帖最后由 ninja911 于 2011-10-29 10:06 编辑 [/i] [attach]1201[/attach] 需要用的md

本帖最后由 ninja911 于 2011-10-29 10:06 编辑

res.rar (1.71 KB, 下载次数: 182)
低调点 发表于 2011-10-28 17:29:30

不错 .

不错  


.
dafei2599 发表于 2011-10-28 17:44:42

支持忍者~{:3_46:}

支持忍者~
ghl781258 发表于 2011-10-28 17:50:02

厉害。。。。。。。。

厉害。。。。。。。。
quickerfans 发表于 2011-10-28 18:11:24

已经没有能力来表达对楼主的敬仰了。石化围观

已经没有能力来表达对楼主的敬仰了。石化围观
qqmmcc 发表于 2011-10-28 18:22:28

加密用aardio库的MD5库即可,不需要JS 麻烦 [quote] [color=#0000ff]import[/color][color=#000000

加密用aardio库的MD5库即可,不需要JS 麻烦
import string.md5;

md5_3 =
function(str){
var a,b,c = string.md5(str)
var a,b,c = string.md5(c)
var a,b,c = string.md5(c)
return a;      
}

var qqPass = string.md5(md5_3(password)+string.upper(verifycode))




ninja911 发表于 2011-10-28 20:15:55

[quote][size=2][color=#999999]qqmmcc 发表于 2011-10-28 18:22[/color] [url=forum.php

qqmmcc 发表于 2011-10-28 18:22
加密用aardio库的MD5库即可,不需要JS 麻烦

貌似QQ的算法没有那么简单哦,md5_3我看了js是又用到至少另外3个函数。改天反一下JS

点评

我测试过了,成功才发给你的  发表于 2011-10-28 20:17
ljtnine 发表于 2011-10-28 20:19:28

[quote][size=2][color=#999999]ninja911 发表于 2011-10-28 20:15[/color] [url=forum.p

ninja911 发表于 2011-10-28 20:15
貌似QQ的算法没有那么简单哦,md5_3我看了js是又用到至少另外3个函数。改天反一下JS

qqmmcc的方法是正确的。qq的js实现的也是md5
ninja911 发表于 2011-10-28 20:19:30

那就不错,可以不需要JS文件了。

那就不错,可以不需要JS文件了。
fyy 发表于 2011-10-29 00:46:35

以后有机会用到。看起来很不错

以后有机会用到。看起来很不错
mamer 发表于 2011-10-29 09:31:44

很赞,很赞,这是(一)楼主后面还有内容吧?

很赞,很赞,这是(一)楼主后面还有内容吧?
aiwen 发表于 2011-10-29 09:54:10

不知为何,我登陆老是失败,直接提示失败原因,但不知道具体什么原因,我查了一下代码,好像验证码判别有些问题,但一直查到具体原因,向楼主请教!

不知为何,我登陆老是失败,直接提示失败原因,但不知道具体什么原因,我查了一下代码,好像验证码判别有些问题,但一直查到具体原因,向楼主请教!
ninja911 发表于 2011-10-29 09:58:52

[quote][size=2][color=#999999]mamer 发表于 2011-10-29 09:31[/color] [url=forum.php?

mamer 发表于 2011-10-29 09:31
很赞,很赞,这是(一)楼主后面还有内容吧?

恩,今天会研究QQ发送消息和保持链接keepAlive
ninja911 发表于 2011-10-29 10:03:14

[quote][size=2][color=#999999]aiwen 发表于 2011-10-29 09:54[/color] [url=forum.php?

aiwen 发表于 2011-10-29 09:54
不知为何,我登陆老是失败,直接提示失败原因,但不知道具体什么原因,我查了一下代码,好像验证码判别有些 ...

1、请首先使用aardio最新版IDE(也就我们官方最新版的aardio软件)
2、代码都经过大家测试,特别是“算法”那块,你可以结合qqmmcc的md5_3函数,抛弃我原有调用js处理那块。算法不能变,其中验证码大写,不能忽视。
3、如果暂时找不出原因,你可以试试 io.print(); 把变量或者常量都打印出来看看,到底是哪里出问题了
ozhpeng 发表于 2011-10-29 13:07:17

这个得存下来 以后能用的到

这个得存下来  以后能用的到
aiwen 发表于 2011-10-29 13:12:21

我仔细跟踪了一下代码,发觉问题在取ptui_checkVC函数信息的时候出现了问题,我用我自己的帐号,后面的好像不是32位的字符串,而是几个乱码。我随即输入qq

我仔细跟踪了一下代码,发觉问题在取ptui_checkVC函数信息的时候出现了问题,我用我自己的帐号,后面的好像不是32位的字符串,而是几个乱码。我随即输入qq号和密码是可以得到check文件中的正常函数信息,然后后面验证码图片也能得到。不知道其他人是否也是这样,期待回复!
donque2010 发表于 2011-10-29 13:59:40

感谢分享,谢谢楼主!

感谢分享,谢谢楼主!
ninja911 发表于 2011-10-29 15:23:33

[quote][size=2][color=#999999]aiwen 发表于 2011-10-29 13:12[/color] [url=forum.php?

aiwen 发表于 2011-10-29 13:12
我仔细跟踪了一下代码,发觉问题在取ptui_checkVC函数信息的时候出现了问题,我用我自己的帐号,后面的好像 ...

你说的是 rx_validate_status 这个函数里的匹配问题吧,你改成
var rx = "ptui_checkVC\('(\d{1})','(\w+)'\)";
元{48}变成+即可
12下一页

手机版|未经许可严禁引用或转载本站文章|站长邮箱|aardio.com|aardio官方社区 ( 皖ICP备09012014号 )

GMT+8, 2017-11-21 16:11 , Processed in 0.109375 second(s), 22 queries , WinCache On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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