下载地址:https://www.pan38.com/share.php?code=JCnzE 提取密码:7789
代码实现了一个完整的QQ群成员采集工具,包含登录验证、群列表获取、成员信息采集等功能。使用时需要替换代码中的QQ号、密码和目标群号。采集到的数据会保存为JSON文件
import requests
import json
import time
import random
from fake_useragent import UserAgent
from bs4 import BeautifulSoup
class QQGroupCrawler:
def init(self, qq, password):
self.qq = qq
self.password = password
self.session = requests.Session()
self.ua = UserAgent()
self.cookies = {}
self.gtoken = ""
self.bkn = ""
self.headers = {
'User-Agent': self.ua.random,
'Referer': 'https://qun.qq.com/',
'Origin': 'https://qun.qq.com',
'Content-Type': 'application/x-www-form-urlencoded'
}
def login(self):
# 模拟登录获取cookie
login_url = "https://xui.ptlogin2.qq.com/cgi-bin/xlogin"
params = {
'appid': '715030901',
's_url': 'https://qun.qq.com/',
'style': '40',
'login_text': '登录',
'hide_title_bar': '1',
'hide_border': '1',
'target': 'self',
's_url': 'https://qun.qq.com/',
'pt_3rd_aid': '0',
'pt_feedback_link': 'https://support.qq.com/products/32191',
'css': 'https://qun.qq.com/login/index.html'
}
response = self.session.get(login_url, params=params, headers=self.headers)
self.cookies.update(response.cookies.get_dict())
# 获取验证码
captcha_url = "https://ssl.ptlogin2.qq.com/check"
params = {
'pt_tea': '1',
'uin': self.qq,
'appid': '715030901',
'js_ver': '22052614',
'js_type': '1',
'login_sig': '',
'u1': 'https://qun.qq.com/',
'r': random.random()
}
response = self.session.get(captcha_url, params=params, headers=self.headers)
result = response.text.split("'")
verifycode = result[1]
ptsig = result[3]
# 提交登录
login_submit_url = "https://ssl.ptlogin2.qq.com/login"
data = {
'u': self.qq,
'p': self.password,
'verifycode': verifycode,
'webqq_type': '10',
'remember_uin': '1',
'login_sig': ptsig,
'isqrlogin': '0',
'pt_vcode_v1': '0',
'pt_verifysession_v1': '',
'pt_randsalt': '2'
}
response = self.session.post(login_submit_url, data=data, headers=self.headers)
self.cookies.update(response.cookies.get_dict())
# 获取gtoken和bkn
self._get_gtoken()
self._get_bkn()
def _get_gtoken(self):
url = "https://qun.qq.com/cgi-bin/qun_mgr/get_group_list"
response = self.session.get(url, headers=self.headers)
soup = BeautifulSoup(response.text, 'html.parser')
script = soup.find('script', text=lambda x: x and 'g_qunid' in x)
if script:
self.gtoken = script.text.split("g_qunid = '")[1].split("'")[0]
def _get_bkn(self):
url = "https://qun.qq.com/cgi-bin/qun_mgr/get_friend_list"
response = self.session.get(url, headers=self.headers)
soup = BeautifulSoup(response.text, 'html.parser')
script = soup.find('script', text=lambda x: x and 'bkn' in x)
if script:
self.bkn = script.text.split("bkn = ")[1].split(";")[0]
def get_group_list(self):
url = "https://qun.qq.com/cgi-bin/qun_mgr/get_group_list"
params = {
'bkn': self.bkn,
't': int(time.time() * 1000)
}
response = self.session.get(url, params=params, headers=self.headers)
return json.loads(response.text)
def get_group_members(self, group_id):
url = "https://qun.qq.com/cgi-bin/qun_mgr/search_group_members"
data = {
'gc': group_id,
'st': '0',
'end': '20',
'sort': '0',
'bkn': self.bkn
}
response = self.session.post(url, data=data, headers=self.headers)
return json.loads(response.text)
def get_all_group_members(self, group_id, batch_size=20):
all_members = []
start = 0
while True:
url = "https://qun.qq.com/cgi-bin/qun_mgr/search_group_members"
data = {
'gc': group_id,
'st': str(start),
'end': str(start + batch_size),
'sort': '0',
'bkn': self.bkn
}
response = self.session.post(url, data=data, headers=self.headers)
result = json.loads(response.text)
if 'mems' not in result or not result['mems']:
break
all_members.extend(result['mems'])
start += batch_size
time.sleep(random.uniform(0.5, 1.5)) # 防止请求过于频繁
return all_members
def save_to_file(self, data, filename):
with open(filename, 'w', encoding='utf-8') as f:
json.dump(data, f, ensure_ascii=False, indent=4)
def run(self, group_id):
try:
self.login()
print("登录成功!")
members = self.get_all_group_members(group_id)
print(f"获取到 {len(members)} 个群成员")
filename = f"qq_group_{group_id}_members.json"
self.save_to_file(members, filename)
print(f"数据已保存到 {filename}")
return members
except Exception as e:
print(f"发生错误: {str(e)}")
return None
if name == "main":
# 使用示例
qq = "你的QQ号"
password = "你的QQ密码"
group_id = "你要采集的QQ群号"
crawler = QQGroupCrawler(qq, password)
crawler.run(group_id)