【AAuto】QQ 客户端全源码
【简介】
快手W.QQ2012,采用腾讯QQ之w.qq.com协议(手机网页版)。
【目的】
1、第一次尝试Web UI开发应用
2、进阶学习快手
3、制作QQ机器人,应用于PHP或者直接数据库交互
【分享包】
1、快手项目包(aau、htm、js、css、picture)
2、Png源文件以及QQ素材
【开发用的工具有】
1、IDE:快手AAuto最新版
2、网页设计:DreamWeaver CS5.5 + Jquery插件智能提示
3、图形UI设计:FireWorks CS5.5
4、快速编辑器:EditPlus3
5、调试Debug浏览器:FireFox8 + fireBug插件
6、应用图标设计:IconWorkshop
【准备与流程】
1、熟看快手范例
2、熟悉Javascript语言
3、熟悉Jquery框架
4、熟悉CSS层叠样式设计
5、参考腾讯官方QQ界面,构思UI
5、获取基本素材,通过QQ资源包获取
6、了解w.qq.com功能,分析网页js以及firebug进行抓包对比分析
【协议】
1、登陆协议: 由于腾讯所有WEB登陆应用,都是同一协议。我会在细化补充
2、w.qq.com协议看似比较简单,但也有难度。简单:利用官方的rpcservice.js文件能看懂逻辑交互类似(MVC里的M和C),views.js相当于V。复杂:数据相对复杂,没有json那样的美观,一句话简陋得不能再简陋(需要靠读rpcservice.js和dump结果分析)。
3、我下次会专门抽时间,把协议简单理一下,并画出w.qq.com中的js简单逻辑流程图
【备注】
1、源码开源!“自由”请理解好,请不要拿这个东西干坏事,切忌切忌!
2、可以转载,可以二次开发,可以商用,反正“自由”。
全源码下载地址: http://www.aau.cn/thread-4216-1-1.html
快手W.QQ2012,采用腾讯QQ之w.qq.com协议(手机网页版)。
【目的】
1、第一次尝试Web UI开发应用
2、进阶学习快手
3、制作QQ机器人,应用于PHP或者直接数据库交互
【分享包】
1、快手项目包(aau、htm、js、css、picture)
2、Png源文件以及QQ素材
【开发用的工具有】
1、IDE:快手AAuto最新版
2、网页设计:DreamWeaver CS5.5 + Jquery插件智能提示
3、图形UI设计:FireWorks CS5.5
4、快速编辑器:EditPlus3
5、调试Debug浏览器:FireFox8 + fireBug插件
6、应用图标设计:IconWorkshop
【准备与流程】
1、熟看快手范例
2、熟悉Javascript语言
3、熟悉Jquery框架
4、熟悉CSS层叠样式设计
5、参考腾讯官方QQ界面,构思UI
5、获取基本素材,通过QQ资源包获取
6、了解w.qq.com功能,分析网页js以及firebug进行抓包对比分析
【协议】
1、登陆协议: 由于腾讯所有WEB登陆应用,都是同一协议。我会在细化补充
2、w.qq.com协议看似比较简单,但也有难度。简单:利用官方的rpcservice.js文件能看懂逻辑交互类似(MVC里的M和C),views.js相当于V。复杂:数据相对复杂,没有json那样的美观,一句话简陋得不能再简陋(需要靠读rpcservice.js和dump结果分析)。
3、我下次会专门抽时间,把协议简单理一下,并画出w.qq.com中的js简单逻辑流程图
【备注】
1、源码开源!“自由”请理解好,请不要拿这个东西干坏事,切忌切忌!
2、可以转载,可以二次开发,可以商用,反正“自由”。
全源码下载地址: http://www.aau.cn/thread-4216-1-1.html
【界面】
import web.ui;
import web.util;
import process;
import fsys;
import qq;
/*DSG{{*/
var winform = win.form(parent=...; text="Web UI";title=false;bottom=226;max=false;right=353;border="none";mode="popup" )
winform.add(
pic_validate={ dl=1;bottom=294;text="picturebox";left=48;dt=1;top=241;z=1;right=178;hide=1;cls="picturebox" }
)
/*}}*/
winform.text = "W.QQ2012";
var wb = web.form( winform, 0x4/*_UIFLAG_NO3DBORDER*/ );
wb.showMenu=function(x,y,id,ele){
return false;//关闭右键菜单
}
wb.go("/res/login.htm");
//web.ui( wb, 354, 242);
web.ui( wb, false);
wb.jQuery();
wb.attachAll(
/* html节点ID = 事件触发函数表 */
caption_button_website = {
onclick = function(event){
process.execute("http://www.ninja911.com");
//web.util.ieBrowser("http://www.ninja911.com")
}
onmouseup = function(event){
event.srcElement.blur();
}
}
);
var dir_data = "\data";
if (!io.exist(dir_data)) {
fsys.createDir(dir_data);
}
var file_my_qqpcs = "\data\my_qqpcs.js";
if (!io.exist(file_my_qqpcs)) {
string.save(file_my_qqpcs, $"\res\js\my_qqpcs.js");
}
var qqClass = qq.myqq();
var qq_number = "";
var qq_password = "";
var webqq_type = "";
var tmid = null;
winform.show(true);
wb.external = {
ext_qq_login = function (qq_number, qq_password, webqq_type, remember, validate) {
qq_login(qq_number, qq_password, webqq_type, remember, validate);
};
ext_reload_validate = function(qq_number, qq_password, webqq_type){
reload_validate(qq_number, qq_password, webqq_type);
};
ext_recheck_qq_number_validate = function(qq_number){
recheck_qq_number_validate(qq_number);
}
};
show_validate = function(qq_number, status = "show"){
if (status == "hide") {
var x,y,cx,cy = win.getPos(winform.hwnd);
if (cy > 226) {
win.setPos(winform.hwnd,x,y,cx,226);
}
winform.pic_validate.hide = true;
wb.doScript("show_input_validate('hide');");
} else {
var x,y,cx,cy = win.getPos(winform.hwnd);
if (cy < 306) {
win.setPos(winform.hwnd,x,y,cx,306);
}
var validate_file = "\data\" + qq_number +"\validate.bmp";
if (io.exist(validate_file)) {
var validate_data = string.load(validate_file);
winform.pic_validate.redraw();
winform.pic_validate.image = validate_data;
}
winform.pic_validate.hide = false;
wb.doScript("show_input_validate('show');");
}
}
qq_login = function(qq_number, qq_password, webqq_type, remember, validate){
var js_return = -1;
if (qq_number == "") {
win.msgbox('错误:QQ不能为空', '错误', '0x10');
return;
}
if (qq_password == "") {
win.msgbox('错误:密码不能为空', '错误', '0x10');
return;
}
var tb_config = qqClass.get_class_config();
qqClass.ini(qq_number, qq_password, webqq_type);
show_validate(qq_number, "hide");
if (qqClass.get_logined_status() == false) {
wb.doScript("toggle_btn_login('hide');");
var login_status, v1_need_validate, v1_verifysession = qqClass.ui_login(validate);
if (login_status == "0") {
show_validate(qq_number, "hide");
winform.show(false);
child_form_mbar, child_wb = winform.loadcode("\res\aform\mbar.aau");
mbar_qq_ini(qqClass.get_class_config());
} elseif (login_status == -9002) {
wb.doScript("toggle_btn_login('show');");
win.msgbox('需要输入验证码' + qq_number, '错误', '0x10');
show_validate(qq_number);
} else {
wb.doScript("toggle_btn_login('show');");
if (login_status == "4") {
win.msgbox('验证码校验错误,请重新输入', '错误', '0x10');
var need_validate, str_verifysession = qqClass.login_request_validate();
if (need_validate == 1) {
show_validate(qq_number, "show");
}
} else {
var err_msg = qqClass.err_msg;
if (v1_verifysession) {
err_msg = v1_verifysession;
} else {
if (err_msg == "") {
err_msg = "未知错误";
}
}
win.msgbox(err_msg, '错误', '0x10');
qqClass.close();
}
}
}
};
reload_validate = function(qq_number, qq_password, webqq_type){
if (qq_number == "") {
win.msgbox('错误:QQ不能为空', '错误', '0x10');
return;
}
if (qq_password == "") {
win.msgbox('错误:密码不能为空', '错误', '0x10');
return;
}
qqClass.ini(qq_number, qq_password, webqq_type);
var need_validate, str_verifysession = qqClass.login_request_validate();
if (need_validate == 1) {
show_validate(qq_number, "show");
} else {
show_validate(qq_number, "hide");
}
}
recheck_qq_number_validate = function(qq_number){
if (qq_number == "") {
win.msgbox('错误:QQ不能为空', '错误', '0x10');
return;
}
if (qqClass.get_logined_status() == false) {
var need_validate, str_verifysession = qqClass.login_request_validate(qq_number);
if (need_validate == 1) {
show_validate(qq_number, "show");
} else {
show_validate(qq_number, "hide");
}
}
}
winform.wndproc = function(hwnd,message,wparam,lparam){
select(message) {//判断消息类型
case 0x10/*_WM_CLOSE窗口关闭消息*/{
winform.show(false);
qqClass.exit();
io.close();
win.quitMessage();
}
}
}
//进入消息循环
win.loopMessage();
return winform,wb;
import web.util;
import process;
import fsys;
import qq;
/*DSG{{*/
var winform = win.form(parent=...; text="Web UI";title=false;bottom=226;max=false;right=353;border="none";mode="popup" )
winform.add(
pic_validate={ dl=1;bottom=294;text="picturebox";left=48;dt=1;top=241;z=1;right=178;hide=1;cls="picturebox" }
)
/*}}*/
winform.text = "W.QQ2012";
var wb = web.form( winform, 0x4/*_UIFLAG_NO3DBORDER*/ );
wb.showMenu=function(x,y,id,ele){
return false;//关闭右键菜单
}
wb.go("/res/login.htm");
//web.ui( wb, 354, 242);
web.ui( wb, false);
wb.jQuery();
wb.attachAll(
/* html节点ID = 事件触发函数表 */
caption_button_website = {
onclick = function(event){
process.execute("http://www.ninja911.com");
//web.util.ieBrowser("http://www.ninja911.com")
}
onmouseup = function(event){
event.srcElement.blur();
}
}
);
var dir_data = "\data";
if (!io.exist(dir_data)) {
fsys.createDir(dir_data);
}
var file_my_qqpcs = "\data\my_qqpcs.js";
if (!io.exist(file_my_qqpcs)) {
string.save(file_my_qqpcs, $"\res\js\my_qqpcs.js");
}
var qqClass = qq.myqq();
var qq_number = "";
var qq_password = "";
var webqq_type = "";
var tmid = null;
winform.show(true);
wb.external = {
ext_qq_login = function (qq_number, qq_password, webqq_type, remember, validate) {
qq_login(qq_number, qq_password, webqq_type, remember, validate);
};
ext_reload_validate = function(qq_number, qq_password, webqq_type){
reload_validate(qq_number, qq_password, webqq_type);
};
ext_recheck_qq_number_validate = function(qq_number){
recheck_qq_number_validate(qq_number);
}
};
show_validate = function(qq_number, status = "show"){
if (status == "hide") {
var x,y,cx,cy = win.getPos(winform.hwnd);
if (cy > 226) {
win.setPos(winform.hwnd,x,y,cx,226);
}
winform.pic_validate.hide = true;
wb.doScript("show_input_validate('hide');");
} else {
var x,y,cx,cy = win.getPos(winform.hwnd);
if (cy < 306) {
win.setPos(winform.hwnd,x,y,cx,306);
}
var validate_file = "\data\" + qq_number +"\validate.bmp";
if (io.exist(validate_file)) {
var validate_data = string.load(validate_file);
winform.pic_validate.redraw();
winform.pic_validate.image = validate_data;
}
winform.pic_validate.hide = false;
wb.doScript("show_input_validate('show');");
}
}
qq_login = function(qq_number, qq_password, webqq_type, remember, validate){
var js_return = -1;
if (qq_number == "") {
win.msgbox('错误:QQ不能为空', '错误', '0x10');
return;
}
if (qq_password == "") {
win.msgbox('错误:密码不能为空', '错误', '0x10');
return;
}
var tb_config = qqClass.get_class_config();
qqClass.ini(qq_number, qq_password, webqq_type);
show_validate(qq_number, "hide");
if (qqClass.get_logined_status() == false) {
wb.doScript("toggle_btn_login('hide');");
var login_status, v1_need_validate, v1_verifysession = qqClass.ui_login(validate);
if (login_status == "0") {
show_validate(qq_number, "hide");
winform.show(false);
child_form_mbar, child_wb = winform.loadcode("\res\aform\mbar.aau");
mbar_qq_ini(qqClass.get_class_config());
} elseif (login_status == -9002) {
wb.doScript("toggle_btn_login('show');");
win.msgbox('需要输入验证码' + qq_number, '错误', '0x10');
show_validate(qq_number);
} else {
wb.doScript("toggle_btn_login('show');");
if (login_status == "4") {
win.msgbox('验证码校验错误,请重新输入', '错误', '0x10');
var need_validate, str_verifysession = qqClass.login_request_validate();
if (need_validate == 1) {
show_validate(qq_number, "show");
}
} else {
var err_msg = qqClass.err_msg;
if (v1_verifysession) {
err_msg = v1_verifysession;
} else {
if (err_msg == "") {
err_msg = "未知错误";
}
}
win.msgbox(err_msg, '错误', '0x10');
qqClass.close();
}
}
}
};
reload_validate = function(qq_number, qq_password, webqq_type){
if (qq_number == "") {
win.msgbox('错误:QQ不能为空', '错误', '0x10');
return;
}
if (qq_password == "") {
win.msgbox('错误:密码不能为空', '错误', '0x10');
return;
}
qqClass.ini(qq_number, qq_password, webqq_type);
var need_validate, str_verifysession = qqClass.login_request_validate();
if (need_validate == 1) {
show_validate(qq_number, "show");
} else {
show_validate(qq_number, "hide");
}
}
recheck_qq_number_validate = function(qq_number){
if (qq_number == "") {
win.msgbox('错误:QQ不能为空', '错误', '0x10');
return;
}
if (qqClass.get_logined_status() == false) {
var need_validate, str_verifysession = qqClass.login_request_validate(qq_number);
if (need_validate == 1) {
show_validate(qq_number, "show");
} else {
show_validate(qq_number, "hide");
}
}
}
winform.wndproc = function(hwnd,message,wparam,lparam){
select(message) {//判断消息类型
case 0x10/*_WM_CLOSE窗口关闭消息*/{
winform.show(false);
qqClass.exit();
io.close();
win.quitMessage();
}
}
}
//进入消息循环
win.loopMessage();
return winform,wb;