(转)QQ群成员提取-aardio版

By admin at 2018-12-09 • 0人收藏 • 307人看过

以下所有内容整理自:aar群聊  感谢3G(171090098) ,抄代码小学生(507446),indertust(1448724558) 以及群其他成员对代码的编写

关键BKN码的获取:

https://qun.qq.com/member.html#gid=600797878

image.png

获取BKN的C++版本算法:(用Skey算bnk)

public long GetBkn(string skey)
        {
            var hash = 5381;
            for (int i = 0, len = skey.Length; i < len; ++i)
            {
                hash += (hash << 5) + (int)skey[i];
            }
            return hash & 2147483647;
        }

转化为aar版本(js版):

jsGetBkn(skey){
    var hash = 5381;
    for(var i = 0, len = skey.length; i <len; ++ i){
      hash +=(hash << 5) + skey.charAt(i).charCodeAt();
    }
    return hash & 2147483647;	
}

算BKN(第二版):

var key = "@PtfJfPGaF"

getGtk = function(str){
    var hash = 5381;
    for(i=1; #str){
        hash += (hash << 5) + str[ i ];
    }
    return hash & 2147483647;
}
var t = getGtk(key)

console.varDump(t)


1 个回复 | 最后更新于 2018-12-02
2018-12-09   #1

image.png

login.aardio 文件

import win.ui;
import console;
import inet.http
import web.form
/*DSG{{*/
var winform = win.form(text="QQ群会员提取-作者QQ171090098";right=487;bottom=351;max=false;min=false)
winform.add(
custom={cls="custom";text="自定义控件";left=11;top=4;right=481;bottom=346;z=1}
)
/*}}*/

//获取传入参数
var params = {...}
params = params[2]

..p('formLogin 入口参数:')
..d(params)


/*
params.cookieString = 'what?'
params.cookie[4] = 4
params.bkn = 'hi'
*/

//把参数作为 winform 的成员,以便父窗口获取
winform['ret'] = params

wb = web.form(winform.custom)


wb.go("https://qun.qq.com/member.html#gid=")
//wb.wait()

winform.show();


function getBkn(skey){
	var s = /*
function jsGetBkn(skey){
    var hash = 5381;
    for(var i = 0, len = skey.length; i <len; ++ i){
      hash +=(hash << 5) + skey.charAt(i).charCodeAt();
    }
    return hash & 2147483647;	
}

external.setBkn(jsGetBkn("%s"))
*/

	s = string.format(s, skey)
	
	//..p("getBkn 语句", s)
	
	wb.doScript(s)
	
	//..p("getBkn 执行完毕")
}



wb.external={
	setCookie = function(cookie){
		//..p(cookie)
		var qqCookie = {}
		
		var lines = string.split(cookie, ';')
		
		for(i=1;#lines;1){
			var item = string.split(lines[i], '=')
			qqCookie[string.trim(item[1])] = item[2]
		}

		//..d(qqCookie)
		
		
		
		params.cookieString = cookie
		params.cookie = qqCookie
		
		//..p('formLogin 已获取到 cookie', 'qqCookie.skey = ' ++ qqCookie.skey)
		
		getBkn(qqCookie.skey)
		
		//..p('formLogin 已获取到 bkn')
		
		//..d(params)
		
		
	};
	
	setBkn = function(bkn){
		//..p('wb.external.setBkn 得到参数', bkn)
		params.bkn = bkn
	};
}



wb.BeforeNavigate2 = function( pDisp, url, flags, targetFrame, postData, headers, cancel ) { 
  // console.varDump(url)
	if(url){
		
		//..p('wb.BeforeNavigate2', url, flags, targetFrame, postData, headers, cancel)
		
		var str = string.match(url,"https\:\/\/qun\.qq\.com\/member\.html\#gid\=(\d+)")
		
		if(str){
			//win.msgbox("登陆成功:" ++ str ++ ', ' ++ url)
			var js = /**
				external.setCookie(document.cookie);
			**/
			wb.doScript(js)

			winform.endModal("登录成功")
		}
	}
	
	return url, flags, targetFrame, postData, headers, cancel;
}

//不要 return 这个
//return win.loopMessage()

win.loopMessage()

//这样才能被父窗口正确获取到子窗口及其他返回值
return winform,params;

main.aardio文件

/*
本代码由 3G(171090098) 分享

期间 抄代码小学生(507446) 及其他群友对 3G(171090098) 进行了帮助。

indertust(1448724558) 在增加计算 bkn 的过程中,顺便简单地手工格式化了一下代码并写了父子窗口之间传数据的 3 种方法:)

*/

import win.ui;
import inet.http;
import string.html;
import curl
import inet
import console
import web.rest.jsonLiteClient
import fsys.dlg
/*DSG{{*/
mainForm = win.form(text="QQ群会员提取-作者QQ171090098";right=625;bottom=478)
mainForm.add(
button={cls="button";text="提取QQ";left=239;top=300;right=346;bottom=350;z=2};
button2={cls="button";text="导出QQ";left=367;top=300;right=474;bottom=350;z=3};
button3={cls="button";text="取人数";left=169;top=328;right=224;bottom=351;z=14};
button4={cls="button";text="先取群号";left=496;top=299;right=603;bottom=349;z=12};
edit={cls="edit";text="70517368";left=91;top=301;right=224;bottom=324;edge=1;z=4};
edit3={cls="edit";text="100";left=93;top=330;right=165;bottom=352;edge=1;z=8};
groupbox={cls="groupbox";text="QQ群名称";left=324;top=8;right=613;bottom=293;edge=1;z=10};
groupbox2={cls="groupbox";text="QQ群名称";left=9;top=8;right=314;bottom=293;edge=1;z=11};
groupbox3={cls="groupbox";text="操作日志";left=12;top=363;right=615;bottom=467;edge=1;z=13};
listbox={cls="listbox";left=21;top=390;right=604;bottom=451;edge=1;items={};z=6};
listview={cls="listview";left=16;top=28;right=307;bottom=286;edge=1;gridLines=1;vscroll=1;z=1};
listview2={cls="listview";left=335;top=28;right=604;bottom=284;edge=1;gridLines=1;z=9};
static={cls="static";text="QQ群名称";left=17;top=299;right=75;bottom=325;center=1;transparent=1;z=5};
static2={cls="static";text="群人数:";left=19;top=332;right=71;bottom=352;transparent=1;z=7}
)
/*}}*/

import console; 
console.open()

execute("mode con cols=160 lines=500")
execute("color 0A")

var oh = console.getOutPutHandle()
var ih = console.getInputHandle()
console.modifyMode(ih,0,0x40)

p = console.print
d = console.dump
dj = console.dumpJson
vd = console.varDump


/*
if( ! win.loadForm("\res\login.aardio").doModal() ){
	return;
}
*/

//这个是需要取回 cookie 和 bkn 的对象
var dataObj = {
    cookieString = 'abc';
	cookie = {1;2;3};
	bkn = 'hello';
}


//var formLogin, ret = win.loadForm("\res\login.aardio", dataObj).doModal()

var formLogin, ret = mainForm.loadForm("\res\login.aardio", dataObj) //把 dataObj 作为参数传给子窗口

//要分开写,否则无法取回返回值
formLogin.doModal()

p('第一种:用返回值的方式取得数据')

p('formLogin 返回值', ret)
if(ret){
    dj(ret)
}

/*
p('第二种:用子窗口成员的方式取得数据')
if((formLogin) and formLogin.ret){
    dj(formLogin.ret)
}

//var formLogin = mainForm.loadForm("\res\login.aardio", dataObj).doModal()
p('第三种:原实参是作为引用传给子窗口的,现在数据已获得')

dj(dataObj)

*/

if(!formLogin){
    return
}


mainForm.show();
var code
mainForm.listview.insertColumn("id", 50, 1);
mainForm.listview.insertColumn("QQ号码", 120, 2);
mainForm.listview.insertColumn("QQ昵称", 150, 3);

mainForm.listview2.insertColumn("id", 30, 1);
mainForm.listview2.insertColumn("群名称", 100, 2);
mainForm.listview2.insertColumn("QQ昵称", 150, 3);
mainForm.listview2.insertColumn("群人数", 50, 4);

mainForm.listbox.add("程序初始化成功。。。",1)

http = inet.http()

rest1 = web.rest.jsonLiteClient()
rest1._http.disableCookies()

addHeaders=function(){
	rest1.addHeaders={
		["authority"]="qun.qq.com";
		["path"]="cgi-bin/qun_mgr/search_group_members";
		["accept-encoding"]="gzip, deflate, br";
		["accept-language"]="zh-CN,zh;q=0.9";
		["content-length"]="45";
		["cookie"] = dataObj.qqCookieString;
		["origin"]="https://qun.qq.com";
		["referer"]= "https://qun.qq.com/member.html";
		["user-agent"]= "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.80 Safari/537.36";
	}
}

mainForm.button.oncommand = function(id,event){//取群人员
	mainForm.listbox.add("程序准备开始提取群内人员相关信息。。。",1)
	
	addHeaders()
	
	var postdata2={
		["gc"]=mainForm.edit.text;
		["st"]=0;
		["end"]=mainForm.edit3.text;
		["sort"]=0;
		bkn = dataObj.bkn;
		
	}
	var postdatatxt = inet.url.stringifyParameters(postdata2)
	
	str=http.post("https://qun.qq.com/cgi-bin/qun_mgr/search_group_members",postdatatxt)
	
	d(str)
	
	if(#str){
      	var tab = web.json.tryParse(str)
      	var t = tab.mems
      	for(i=1;#t;1){
     		mainForm.listview.addItem({i;t[i].uin;t[i].nick})
      	}	
	}
	
	mainForm.listbox.add("信息已提取完成。。。",1)
}

mainForm.button4.oncommand = function(id,event){//取群分类

	mainForm.listbox.add("程序准备开始提取所有群分类。。。",1)
	
	addHeaders()
	
	var postdata2={
		
		bkn = dataObj.bkn;
	}
	
	var postdatatxt = inet.url.stringifyParameters(postdata2)
	
	str=http.post("https://qun.qq.com/cgi-bin/qun_mgr/get_group_list",postdatatxt)
	
	d(str)
	
	if(#str){
      	var tab = web.json.tryParse(str)
      	var t = tab.join
      	for(i=1;#t;1){
     		mainForm.listview2.addItem({i;t[i].gc;t[i].gn})
      	}	
		
	}
	
	mainForm.listbox.add("群分类提取完成,请输入群号提取群内总人数。。。",1)
}

mainForm.button3.oncommand = function(id,event){//取人数
	mainForm.listbox.add("程序准备开始提取所有群内总人数。。。",1)
	
	var postdata2={
		["gc"]=mainForm.edit.text;
		["st"]=0;
		["end"]=100;
		["sort"]=0;
		
		bkn = dataObj.bkn;
	}
	var postdatatxt = inet.url.stringifyParameters(postdata2)
	
	str=http.post("https://qun.qq.com/cgi-bin/qun_mgr/search_group_members",postdatatxt)
	
	d(str)
	
	if(#str){
      	var tab = web.json.tryParse(str)
      	code=tab.count
    	mainForm.edit3.text=code  
	}
	
	mainForm.listbox.add("人数提取完成。。。",1	)
}

mainForm.button2.oncommand = function(id,event){//导出QQ号
	mainForm.listbox.add("程序准备开始导出所有QQ号,请稍等。。。",1)
	
	var path = fsys.dlg.save("QQ文件|*.txt||","QQ群会员提取-作者QQ171090098","",mainForm.hwnd)
    	
    if(path){    
		for(i=1;mainForm.listview.count;1){
			var ok=mainForm.listview.getItemText(i,2,100)
			var ok2=ok
			string.save(path,ok2++'\r\n',true)
		}
    } 
    
	mainForm.listbox.add("QQ已经全部保存完成。。。",1)     	
}

return win.loopMessage();


登录后方可回帖

登 录
信息栏
本站永久域名:HtmLayout.Cn
纯私人站,当笔记本用的,学到哪写到哪,目前正在学aardio+halcon机器视觉.
本 站 主 站:Stm32cube中文网
Aardio 官方站:Aardio官方
Aardio最新功能:Aardio官方更新日志
黑猫Aar教程网:简码编程
C大Aardio论坛:Aar爱好者论坛
AARDIO语言QQ群:70517368
赞助商:才仁机械
下载站:非凡软件站
Loading...