疫情在校没有什么事情干,于是在吾爱论坛的各大网友帮助下,我完成了这款作品

使用python写的自动获取自己QQ群的信息,声明:***只是获取自己所在群的信息***

*********非常适用于群主管理自己的群***********

具体操作就看图片吧,仅用于研究学习,切勿用于其他非法用途

谢谢老铁们的支持

import threading
import tkinter as tk
from tkinter import ttk
from tkinter import *
import tkinter.filedialog
from tkinter import scrolledtext
import requests
from PIL import Image
import time
import re
import emoji
from hyper.contrib import HTTP20Adapter #导入HTTP2的模块
import json
import math
#import xlwt  #导入excel官方模块,用于将字典生成excel
import pandas as pd #将字典列表转换为DataFrame
from tkinter import messageboxroot = tk.Tk()
#----------------------------登录功能函数--------------------------------
def bkn(Skey):t = 5381n = 0o = len(Skey)while n < o:t += (t << 5) + ord(Skey[n])n += 1return t & 2147483647def ptqrtoken(qrsig):n = len(qrsig)i = 0e = 0while n > i:e += (e << 5) + ord(qrsig[i])i += 1return 2147483647 & edef QR():url = '自己的url'r = requests.get(url)qrsig = requests.utils.dict_from_cookiejar(r.cookies).get('qrsig')with open(r'QQ.png','wb') as f:f.write(r.content)im = Image.open(r'QQ.png')im = im.resize((350,350))# print('登录二维码获取成功',time.strftime('%Y-%m-%d %H:%M:%S'))im.show()return qrsigdef cookies(qrsig,ptqrtoken):while 1:url = '自己的url'cookies = {'qrsig': qrsig}r = requests.get(url,cookies = cookies)r1 = r.textif '二维码未失效' in r1:# print('二维码未失效',time.strftime('%Y-%m-%d %H:%M:%S'))passelif '二维码认证中' in r1:# print('二维码认证中',time.strftime('%Y-%m-%d %H:%M:%S'))passelif '二维码已失效' in r1:# print('二维码已失效',time.strftime('%Y-%m-%d %H:%M:%S'))#重新获取二维码qrsig = QR()else:# print('登录成功',time.strftime('%Y-%m-%d %H:%M:%S'))cookies = requests.utils.dict_from_cookiejar(r.cookies)# print(cookies)uin = requests.utils.dict_from_cookiejar(r.cookies).get('uin')regex = re.compile(r'ptsigx=(.*?)&')sigx = re.findall(regex,r.text)[0]url = '自己的url'r2 = requests.get(url,cookies=cookies,allow_redirects=False)targetCookies = requests.utils.dict_from_cookiejar(r2.cookies)skey = requests.utils.dict_from_cookiejar(r2.cookies).get('skey')breaktime.sleep(3)return targetCookies,skey
join_qun = {}
create_qun = {}
manage_qun = {}
def qun(cookies,bkn,num):url = '自己的url'data = {'bkn':bkn}cookies = cookies# print(cookies)r = requests.post(url,data = data,cookies = cookies)#--------------------传出去一个res的值,用于后面获取群列表的操作----------------res = r.textres = res.encode('utf-8', 'replace').decode()res1 = json.loads(res)global join_qunglobal create_qunglobal manage_qunif "create" in res1:create_qun = res1['create']else:create_qun = {}if "join" in res1:join_qun = res1['join']else:join_qun = {}if "manage" in res1:manage_qun = res1['manage']else:manage_qun = {}#--------------------传出去一个res的值,用于后面获取群列表的操作----------------regex = re.compile(r'"gc":(\d+),"gn')r = re.findall(regex,r.text)return cookies #----------------------------登录功能函数--------------------------------
#----------------------------群功能函数----------------------------------
def load_data(st,end):#加载数据需要传入st开始位置和end结束位置url = '自己的url'def str_cookie(state):str1 = ''for i in state:str1 = str1 + i + '=' + state[i] + '; 'return str1cookie = str_cookie(state)# print('cookie='+cookie)headers = {":authority": "自己的url",":method": "POST",":path": "/cgi-bin/qun_mgr/search_group_members",":scheme": "https","accept": "application/json, text/javascript, */*; q=0.01","accept-encoding": "gzip, deflate, br","accept-language": "zh-CN,zh;q=0.9","content-length": "45","content-type": "application/x-www-form-urlencoded; charset=UTF-8","cookie": cookie,"origin": "自己的url","referer": "自己的url","user-agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3947.100 Safari/537.36","x-requested-with": "XMLHttpRequest"}def get_bkn():#从QQ群中获取bkn函数e = state['skey']t = 5381n = 0o = len(e)while n < o:t += (t << 5) + ord(e[n])n += 1return(2147483647 & t)# print(get_bkn())# gc = input('请输入要查询的群号:')global gcgc = show_qqqun_number() #群号data = {"gc": gc, "st": st,  "end": end, "sort": "0","bkn": get_bkn()}sessions=requests.session()sessions.mount('自己的url', HTTP20Adapter())response=sessions.post(url,headers=headers,data=data)response = response.textresponse = response.encode('utf-8').decode("unicode_escape")return responsedef get_qq_member_count():#获取群成员数量函数response = load_data(0,0)qq_member_count = json.loads(response)['count'] #qq群人数# print(qq_member_count)return qq_member_countqq_qun_info = []
def get_qq_member_list():#获取群成员列表函数global qq_qun_info #全局变量qq群信息列表qq_qun_info = []count = math.ceil(get_qq_member_count()/21) #需要循环的次数# print('需要循环的次数:'+str(count))n = 0 #用于计数j = 0 #计数器用于判断当前循环的次数num = 1 #用于给字典里的信息加序号while j < count:#load_data()参数的取值 第一次是从1到20 第二次是从21到42 第三次是从43到63以此类推保证不获取重复值response = load_data(n+j,n+20+j)res = json.loads(response)['mems']# print('res='+str(res))qq_name = '' # qq名字qq_qun_name = ''    # qq群名字qq_number = ''  # qq号码sex = ''    # 性别qq_age = '' #q龄join_qun_time = '' # 入群时间last_speak_time = '' # 最后一次发言for i in res:qq_name = i['nick']#替换qq昵称中的\为空qq_name = filter_emoji(qq_name,'??????')qq_qun_name = i['card']#替换qq群昵称中的\为空qq_qun_name = filter_emoji(qq_qun_name,'??????')qq_number = str(i['uin'])sex = i['g'] #如果sex = 0则为男性, sex = -1未知, sex = 1为女性if sex == 0:sex = '男'elif sex == 1:sex = '女'elif sex == -1:sex = '未知'else:sex = '错误'qq_age = i['qage']join_qun_time = i['join_time'] #这里返回的是10位整数last_speak_time = i['last_speak_time']#将以上内容加入字典dict1中dict1 = {}dict1['num'] = numdict1["qq_name"] = qq_namedict1["qq_qun_name"] = qq_qun_namedict1["qq_number"] = qq_numberdict1["sex"] = sexdict1["qq_age"] = qq_age#将十位数入群时间转为正常时间join_qun_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(join_qun_time))dict1["join_qun_time"] = join_qun_time#将十位数最后一次发言时间转为正常时间last_speak_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(last_speak_time))dict1["last_speak_time"] = last_speak_time#将字典dict1加入列表qq_qun_info列表中qq_qun_info.append(dict1)if select_var.get() == 0:table.insert('', 'end', values=(num, qq_name, qq_qun_name, qq_number, sex,qq_age,join_qun_time,last_speak_time))#滚动到table的最下方#打印输出日志 由于num是从1开始的 但是列表是从0计数,所以此处num-1scroll.insert(END, "\n"+str(qq_qun_info[num-1]))scroll.see("end")# print(qq_qun_info[num-1]) num = num + 1  j = j + 1n += 20# print(qq_qun_info)member_count = get_qq_member_count()if member_count > 0:if(select_var.get() == 1):#选中messagebox.showinfo('提示','查询到'+str(member_count)+'个好友数据,正在扫描后四位信息,此过程可能会比较漫长,请耐心等待...')from_qq_get_info() #调用查后四位数据的函数messagebox.showinfo('提示','导入完成,一共导入'+str(member_count)+'个好友数据')else:messagebox.showinfo('提示','查询到'+str(member_count)+'个好友数据')else:messagebox.showinfo('提示','没有查询到任何好友数据')return qq_qun_info# print(qq_qun_info) #显示群成员列表#利用qq号码获取更多信息,此方法耗时严重,不建议使用
def from_qq_get_info():time.sleep(2)headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36',}for i in qq_qun_info:url = 自己的urlresponse = requests.get(url,headers=headers)response = response.textresponse = json.loads(response)# print(response)if response['status'] == 200:qq_qun_info[qq_qun_info.index(i)]['phone'] = response['phone']qq_qun_info[qq_qun_info.index(i)]['diqu'] = response['phonediqu']qq_qun_info[qq_qun_info.index(i)]['lol'] = response['lol']qq_qun_info[qq_qun_info.index(i)]['wb'] = response['wb']else:qq_qun_info[qq_qun_info.index(i)]['phone'] = '未知'qq_qun_info[qq_qun_info.index(i)]['diqu'] = '未知'qq_qun_info[qq_qun_info.index(i)]['lol'] = '未知'qq_qun_info[qq_qun_info.index(i)]['wb'] = '未知'table.insert('', 'end', values=(i['num'], i['qq_name'], i['qq_qun_name'], i['qq_number'], i['sex'],i['qq_age'],i['join_qun_time'],i['last_speak_time'],i['phone'],i['diqu'],i['lol'],i['wb']))def log():scroll.insert(END, "\n"+str(qq_qun_info[qq_qun_info.index(i)]))scroll.see("end")# print(qq_qun_info[qq_qun_info.index(i)])threading.Thread(target = log).start()def export_excel(export):#将qq_qun_info列表保存为excel函数#将字典列表转换为DataFramepf = pd.DataFrame(list(export))#指定字段顺序if select_var.get() == 1:order = ['num','qq_name','qq_qun_name','qq_number','sex','qq_age','join_qun_time','last_speak_time','phone','diqu','lol','wb']else:order = ['num','qq_name','qq_qun_name','qq_number','sex','qq_age','join_qun_time','last_speak_time']pf = pf[order]#将列名替换为中文columns_map = {'num':'序号','qq_name':'qq昵称','qq_qun_name':'qq群昵称','qq_number':'qq号码','sex':'性别','qq_age':'Q龄','join_qun_time':'入群时间','last_speak_time':'最近发言时间','phone':'手机号','diqu':'地区','lol':'lol','wb':'微博UID'}pf.rename(columns = columns_map,inplace = True)#指定生成的Excel表格名称file_path = pd.ExcelWriter(save_path+'.xlsx')#替换空单元格pf.fillna(' ',inplace = True)#输出pf.to_excel(file_path,encoding = 'utf-8',index = False)#保存表格file_path.save()#过滤特殊字符函数
def filter_emoji(desstr, restr=''):#desstr是要过滤的字符串#restr是替换的字符串# 过滤表情res = re.compile(u'[\U00010000-\U0010ffff\\uD800-\\uDBFF\\uDC00-\\uDFFF]')return res.sub(restr, desstr)
#----------------------------群功能函数----------------------------------#----------------------------获取群列表----------------------------------
def get_allqun_list(group_name):####修改这里####修改这里####修改这里####修改这里####修改这里####修改这里if group_name == '我创建的群':# print('create_qun:',create_qun)return create_qunif group_name == '我加入的群':# print('join_qun:',join_qun)return join_qunif group_name == '我管理的群':# print('manage_qun:',manage_qun)return manage_qun
#----------------------------获取群列表----------------------------------#----------------------------界面----------------------------------
label1 = tk.Label(root,text = 'QQ群号:')
label1.place(x = 150,y = 10)
label1.config(font = ('微软雅黑',12))
#-------------------------选择相应的分组----------------------------------
qq_qun_gc = []
qq_qun_gn = []
def show_group(*arg):global qq_qun_gcglobal qq_qun_gnqq_qun_gc = []qq_qun_gn = []all_qun1 = get_allqun_list(value_group.get())# print(all_qun1)for i in all_qun1:qq_qun_gc.append(i['gc'])gn = emoji.demojize(i['gn'])gn = re.sub(emoji.get_emoji_regexp(), r"?", gn)gn = filter_emoji(gn,'?')qq_qun_gn.append(gn)# print(qq_qun_gc)# print(qq_qun_gn)#下拉列表框中的值xiala_list["values"] = qq_qun_gnxiala_list.current(0)
value_group = StringVar()
#定义一个下拉列表
data_group = ["我创建的群","我管理的群","我加入的群"]
# if create_qun =={}:
#     data_group.remove('我创建的群')
# if join_qun =={}:
#     data_group.remove('我加入的群')
# if manage_qun =={}:
#     data_group.remove('我管理的群')
#创建一个下拉列表
group_list = ttk.Combobox(root, width = 10, height = 10, textvariable = value_group, state="readonly")
#设置字体
group_list.config(font = ('微软雅黑',12))
group_list.bind("<<ComboboxSelected>>",show_group)  #事件的绑定
group_list.place(x = 230, y = 10)
#下拉列表框中的值
group_list["values"] = data_group
#-------------------------选择相应的分组----------------------------------#-------------------------对应分组的群号----------------------------------
def show_qqqun_number(*arg):index1 = xiala_list.current()qq_qun_num = qq_qun_gc[index1]# print(qq_qun_num)return qq_qun_numvalue = StringVar()
#创建一个下拉列表
xiala_list = ttk.Combobox(root, width = 13, height = 10, textvariable = value)
#设置字体
xiala_list.config(font = ('微软雅黑',12))
xiala_list.place(x = 360, y = 10)
#-------------------------对应分组的群号----------------------------------screenwidth = root.winfo_screenwidth()  # 屏幕宽度
screenheight = root.winfo_screenheight()  # 屏幕⾼度
width = 1000
height = 500
x = int((screenwidth - width) / 2)
y = int((screenheight - height) / 2)
root.geometry('{}x{}+{}+{}'.format(width, height, x, y))  # ⼤⼩以及位置
xscroll = Scrollbar(root, orient=HORIZONTAL)
yscroll = Scrollbar(root, orient=VERTICAL)
columns = ['序号', 'qq昵称', 'qq群昵称', 'qq号码', '性别', 'Q龄', '入群时间', '最近发言时间','手机号','地区','lol','微博UID']
table = ttk.Treeview(master=root,  # ⽗容器height=20,  # 表格显⽰的⾏数,height⾏columns=columns,  # 显⽰的列show='headings',  # 隐藏⾸列xscrollcommand=xscroll.set,  # x轴滚动条yscrollcommand=yscroll.set,  # y轴滚动条)
xscroll.config(command=table.xview)
xscroll.pack(side=BOTTOM, fill=X)
yscroll.config(command=table.yview)
yscroll.pack(side=RIGHT, fill=Y)
table.pack(fill=BOTH, expand=True)
table.heading(column='序号', text='序号', anchor='w',command=lambda: print('序号'))  # 定义表头
table.heading('qq昵称', text='qq昵称', )  # 定义表头
table.heading('qq群昵称', text='qq群昵称', )  # 定义表头
table.heading('qq号码', text='qq号码', )  # 定义表头
table.heading('性别', text='性别', )  # 定义表头
table.heading('Q龄', text='Q龄', )  # 定义表头
table.heading('入群时间', text='入群时间', )  # 定义表头
table.heading('最近发言时间', text='最近发言时间', )  # 定义表头
table.heading('手机号', text='手机号', )  # 定义表头
table.heading('地区', text='地区', )  # 定义表头
table.heading('lol', text='lol', )  # 定义表头
table.heading('微博UID', text='微博UID', )  # 定义表头
table.column('序号', width=50, minwidth=50, anchor=S, )  # 定义列
table.column('qq昵称', width=100, minwidth=100, anchor=S)  # 定义列
table.column('qq群昵称', width=100, minwidth=100, anchor=S)  # 定义列
table.column('qq号码', width=100, minwidth=100, anchor=S)  # 定义列
table.column('性别', width=50, minwidth=50, anchor=S)  # 定义列
table.column('Q龄', width=50, minwidth=50, anchor=S)  # 定义列
table.column('入群时间', width=150, minwidth=150, anchor=S)  # 定义列
table.column('最近发言时间', width=150, minwidth=150, anchor=S)  # 定义列
table.column('手机号', width=100, minwidth=100, anchor=S)  # 定义列
table.column('地区', width=100, minwidth=100, anchor=S)  # 定义列
table.column('lol', width=100, minwidth=100, anchor=S)  # 定义列
table.column('微博UID', width=100, minwidth=100, anchor=S)  # 定义列
table.place(x = 10,y = 50)#添加一个命令输出框 log
scroll=scrolledtext.ScrolledText(root,width=164,height=14,font=('黑体',10))
def Scroll(root):scroll.place(x=10,y=480)
Scroll(root)#----------------------------操作数据------------------------------
#添加一个复选框
select_var = IntVar()
select = Checkbutton(root, text='查询后四位数据(耗时)', variable=select_var)
select.place(x = 520, y = 10)def chaxun():#清空Scroll中的全部内容scroll.delete(1.0,END)#清除table中的数据table.delete(*table.get_children())#设置查询的线程threading.Thread(target=get_qq_member_list).start()#添加一个btn1按钮
btn1 = tk.Button(root,text = '查询',command = chaxun)
btn1.config(font = ('微软雅黑',9))
btn1.config(width = 8)
btn1.place(x = 680,y = 10)def save():export_excel(qq_qun_info)messagebox.showinfo('提示','保存成功')
save_path =''
def FileSave():global save_pathsave_path = tkinter.filedialog.asksaveasfilename(title='保存',initialfile=value.get(),filetypes=[('excel', '*.xlsx')])#如果用户点击了保存按钮则返回保存的文件名if save_path:save()else:messagebox.showinfo('提示','取消保存')#添加一个btn2按钮
btn2 = tk.Button(root,text = '保存表格',command = FileSave)
btn2.config(font = ('微软雅黑',9))
btn2.config(width = 8)
btn2.place(x = 770,y = 10)#----------------------------操作数据------------------------------#----------------------------界面----------------------------------if __name__ == '__main__':#---------------只调试界面请注释本段代码----------------global stateqrsig = QR()ptqrtoken = ptqrtoken(qrsig)cookie = cookies(qrsig,ptqrtoken)skey = cookie[1]bkn = bkn(skey)ck = cookie[0]state = qun(ck, bkn,'434252251')#获取的cookie#---------------只调试界面请注释本段代码----------------root.iconbitmap('imgs/favicon.ico')root.geometry('1190x700')root.title("QQ群信息爬取")root.resizable(False, False)root.mainloop()

python获取Q群的信息数据100%用得到【已开源】相关推荐

  1. python获取微信群成员信息

    python获取微信群成员信息 #!/usr/bin/python #coding: utf-8import itchat,datetime from itchat.content import TE ...

  2. python 获取qq群成员信息_python 获取qq群成员列表数据

    #!/usr/bin/python # -*- coding: utf-8 -*- import re import time import xlsxwriter from selenium impo ...

  3. python 获取qq群成员信息_[Python-ItChat]获取微信所有好友, 群信息(群内人员),批量添加好友,自动发送信息等...

    New 09.10 降低使用门槛, 编译生成exe 使用方法 下载exe,双击, 然后扫码-> 同级目录下生成friends.txt和chatrooms.txt[格式为json]对应的是好友列表 ...

  4. python 获取qq群成员信息_教你用python爬取自己加入的QQ群成员名单,它们竟然是这样的人...

    本次实验环境: 操作系统:Mac OS 开发语言:python 3.6 IDE:jupyter notebook(建议使用) 浏览器:Chrome(版本75.0.3770.100) 需要用到的库:se ...

  5. python 获取qq群成员信息_用Python编写工具获取QQ群成员的昵称和号码,使用,及,小...

    使用火狐浏览器进行数据的抓取,火狐浏览器对json比较友好 进入QQ群官网: 登录后,点击成员管理: 先随机选择一个群,抓取一下信息,找一下规律 打开浏览器控制台,重新刷新网页: 这是我们想要的一些信 ...

  6. python 获取qq群成员信息_Python-获取QQ群成员信息并存入excel及redis并发送邮件

    '''需求: 1.请求qq群的接口,实现传入一个群号 2.把群里每个人的 昵称.群备注.入群时间.qq号,性别,存到redis里面,用hash类型 {"qq_num":XXX,&q ...

  7. python qq群文件_python 获取qq群成员列表数据

    #!/usr/bin/python # -*- coding: utf-8 -*- import re import time import xlsxwriter from selenium impo ...

  8. Python 获取EXSI宿主机上虚拟机数据

    以下从 Vsphere 导出的数据的 Class 是根据此文提供的代码改写,感谢原作者现成儿的代码为我节省了时间 参考地址: Python 获取EXSI宿主机上虚拟机数据 - 一毛丶丶 - 博客园 f ...

  9. 用python爬取基金网信息数据,保存到表格,并做成四种简单可视化。(爬虫之路,永无止境!)

    用python爬取基金网信息数据,保存到表格,并做成四种简单可视化.(爬虫之路,永无止境!) 上次 2021-07-07写的用python爬取腾讯招聘网岗位信息保存到表格,并做成简单可视化. 有的人留 ...

最新文章

  1. linux添加美式键盘,win8\win server 2012添加【中文--美式键盘】
  2. 当领导,核心是“抓住2点、做好5条”!做到了,员工根本不用管
  3. selenium - webdriver常用方法
  4. MyEclipse 快捷键及经验总结
  5. 浅谈常见的七种加密算法及实现(附代码)
  6. 嘿!不用太过于担心的单点故障
  7. 超全面Python基础入门教程【十天课程】博客笔记汇总表
  8. xtrabackup迁移单独一张INNODB表
  9. vagrant box各种命令汇总
  10. php 商品规格笛卡尔积,PHP 求多个数组的笛卡尔积,适用于求商品规格组合【原创】...
  11. 卢伟冰直播拆机 或是性价比最高的骁龙855手机
  12. WPF实现Win10汉堡菜单
  13. PowerToys 又推新工具 Launcher,可以替代 Win+R
  14. 北大青鸟学java是用什么课程_来自北大青鸟参加过JAVA课程的学长建议
  15. EVEREST工具---检测硬件
  16. 中国气象台API(2017.09)
  17. 0ops CTF/0CTF writeup
  18. 计算机中丢失msvcp120.dll是什么意思,win7系统玩游戏提示“msvcp120.dll丢失”怎么修复...
  19. photoshop合并图层:向下合并、合并选中层、合并可见图层、拼合图像操作
  20. 钱,才是成年人活着的最大底气

热门文章

  1. 深度学习中的normalization总结(BN、LN、WN、IN、GN)
  2. 光速入门消息队列Kafka
  3. 有限体积法(1)——一维扩散方程的推导
  4. 微信、QQ等第三方账号登录的具体思路
  5. Cas5.3.14手机号码登录(五)
  6. 手把手教你做多重线性逐步回归
  7. foxmail和outlook2007邮件如何互相导入?
  8. SQL数据库-创建数据库
  9. Python基础:数据可视化1
  10. 心目中的编程高手,经典计算机书籍作者介绍(部分,以后不定期更新)!