(转)QQ群成员提取-aardio版
By
admin
at 2018-12-09 • 0人收藏 • 1782人看过
以下所有内容整理自:aar群聊 感谢3G(171090098) ,抄代码小学生(507446),indertust(1448724558) 以及群其他成员对代码的编写
关键BKN码的获取:
https://qun.qq.com/member.html#gid=600797878

获取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
登录后方可回帖
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();