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

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

以下所有内容整理自: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();


登录后方可回帖

登 录
信息栏
 私人小站

本站域名

ChengXu.XYZ

投诉联系:  popdes@126.com



快速上位机开发学习,本站主要记录了学习过程中遇到的问题和解决办法及上位机代码分享

这里主要专注于学习交流和经验分享.
纯私人站,当笔记本用的,学到哪写到哪.
如果侵权,联系 Popdes@126.com

友情链接
Aardio官方
Aardio资源网


才仁机械


网站地图SiteMap

Loading...