QQ群成员采集工具, QQ群成员昵称导出工具, qq群成员采集软件

简介: 完整的QQ群成员采集工具实现方案,包含登录认证、群成员获取、数据存储和导出等完整功能。

下载地址:https://www.pan38.com/share.php?code=JCnzE 提取密码:7789

完整的QQ群成员采集工具实现方案,包含登录认证、群成员获取、数据存储和导出等完整功能。代码采用异步IO实现,提高了采集效率。如需进一步扩展功能,可以参考代码中的扩展建议部分进行开发。

import requests
import json
import hashlib
import time
import random
import sqlite3
from bs4 import BeautifulSoup
import xlsxwriter
import asyncio
import aiohttp
from fake_useragent import UserAgent

class QQGroupCrawler:
def init(self, qq, password):
self.qq = qq
self.password = password
self.session = requests.Session()
self.ua = UserAgent()
self.cookies = None
self.gtk = None
self.bkn = None
self.headers = {
'User-Agent': self.ua.random,
'Referer': 'https://qun.qq.com/',
'Origin': 'https://qun.qq.com'
}

def _get_hash(self, uin, ptwebqq):
    """计算各种哈希值"""
    hash_str = str(uin) + str(ptwebqq) + "password"
    return hashlib.md5(hash_str.encode()).hexdigest()

async def login(self):
    """模拟登录流程"""
    login_url = "https://ssl.ptlogin2.qq.com/login"
    params = {
        'u': self.qq,
        'p': self.password,
        'verifycode': '',
        'webqq_type': 10,
        'remember_uin': 1,
        'login2qq': 1,
        'aid': '715030901',
        'u1': 'https://qun.qq.com/',
        'h': 1,
        'ptredirect': 0,
        'ptlang': 2052,
        'daid': 73,
        'from_ui': 1,
        'pttype': 1,
        'dumy': '',
        'fp': 'loginerroralert',
        'action': '0-0-' + str(int(time.time())),
        'mibao_css': '',
        't': 1,
        'g': 1,
        'js_type': 0,
        'js_ver': 22010414,
        'login_sig': '',
        'pt_randsalt': 0
    }

    async with aiohttp.ClientSession() as session:
        async with session.get(login_url, params=params) as resp:
            if resp.status == 200:
                # 解析登录响应获取cookie和token
                cookies = resp.cookies
                content = await resp.text()
                if '登录成功' in content:
                    self.cookies = cookies
                    self._parse_login_response(content)
                    return True
    return False

def _parse_login_response(self, content):
    """解析登录响应"""
    soup = BeautifulSoup(content, 'html.parser')
    scripts = soup.find_all('script')
    for script in scripts:
        if 'ptwebqq' in script.text:
            ptwebqq = script.text.split('ptwebqq=')[1].split(';')[0]
            self.cookies['ptwebqq'] = ptwebqq

    # 计算gtk和bkn
    if 'ptwebqq' in self.cookies:
        ptwebqq = self.cookies['ptwebqq']
        self.gtk = self._calc_gtk(ptwebqq)
        self.bkn = self._calc_bkn(ptwebqq)

def _calc_gtk(self, skey):
    """计算gtk值"""
    hash_val = 5381
    for s in skey:
        hash_val += (hash_val << 5) + ord(s)
    return hash_val & 0x7fffffff

def _calc_bkn(self, skey):
    """计算bkn值"""
    hash_val = 0
    for s in skey:
        hash_val = (hash_val * 131 + ord(s)) & 0xffffffff
    return hash_val

async def get_group_list(self):
    """获取QQ群列表"""
    if not self.cookies:
        return []

    url = "https://qun.qq.com/cgi-bin/qun_mgr/get_group_list"
    params = {
        'bkn': self.bkn,
        't': int(time.time() * 1000)
    }

    async with aiohttp.ClientSession(cookies=self.cookies) as session:
        async with session.get(url, params=params) as resp:
            if resp.status == 200:
                data = await resp.json()
                return data.get('create', []) + data.get('join', [])
    return []

async def get_group_members(self, group_id):
    """获取指定QQ群的成员列表"""
    if not self.cookies:
        return []

    url = "https://qun.qq.com/cgi-bin/qun_mgr/search_group_members"
    params = {
        'gc': group_id,
        'st': 0,
        'end': 5000,  # 一次获取5000个成员
        'sort': 0,
        'bkn': self.bkn,
        't': int(time.time() * 1000)
    }

    async with aiohttp.ClientSession(cookies=self.cookies) as session:
        async with session.get(url, params=params) as resp:
            if resp.status == 200:
                data = await resp.json()
                return data.get('mems', [])
    return []

def save_to_sqlite(self, group_id, members):
    """保存到SQLite数据库"""
    conn = sqlite3.connect('qq_group_members.db')
    cursor = conn.cursor()

    # 创建表
    cursor.execute('''
    CREATE TABLE IF NOT EXISTS group_members (
        group_id TEXT,
        qq_number TEXT,
        nickname TEXT,
        gender TEXT,
        age INTEGER,
        join_time INTEGER,
        last_speak_time INTEGER,
        card TEXT,
        level INTEGER,
        role INTEGER,
        PRIMARY KEY (group_id, qq_number)
    )
    ''')

    # 插入数据
    for member in members:
        cursor.execute('''
        INSERT OR REPLACE INTO group_members VALUES (?,?,?,?,?,?,?,?,?,?)
        ''', (
            group_id,
            member.get('uin'),
            member.get('nick'),
            member.get('gender'),
            member.get('age'),
            member.get('join_time'),
            member.get('last_speak_time'),
            member.get('card'),
            member.get('level'),
            member.get('role')
        ))

    conn.commit()
    conn.close()

def save_to_excel(self, group_id, members):
    """导出到Excel文件"""
    filename = f'qq_group_{group_id}_members.xlsx'
    workbook = xlsxwriter.Workbook(filename)
    worksheet = workbook.add_worksheet()

    # 设置标题行
    headers = ['QQ号', '昵称', '群名片', '性别', '年龄', '加群时间', 
              '最后发言时间', '等级', '角色']
    for col, header in enumerate(headers):
        worksheet.write(0, col, header)

    # 写入数据
    for row, member in enumerate(members, 1):
        worksheet.write(row, 0, member.get('uin', ''))
        worksheet.write(row, 1, member.get('nick', ''))
        worksheet.write(row, 2, member.get('card', ''))
        worksheet.write(row, 3, '男' if member.get('gender', 0) == 1 else '女')
        worksheet.write(row, 4, member.get('age', ''))
        worksheet.write(row, 5, time.strftime('%Y-%m-%d %H:%M:%S', 
                          time.localtime(member.get('join_time', 0))))
        worksheet.write(row, 6, time.strftime('%Y-%m-%d %H:%M:%S', 
                          time.localtime(member.get('last_speak_time', 0))))
        worksheet.write(row, 7, member.get('level', ''))
        worksheet.write(row, 8, self._get_role_name(member.get('role', 0)))

    workbook.close()

def _get_role_name(self, role):
    """获取角色名称"""
    roles = {
        0: '普通成员',
        1: '创建者',
        2: '管理员',
        3: '临时管理员'
    }
    return roles.get(role, '未知角色')

async def main():

# 使用示例
qq = input("请输入QQ号: ")
password = input("请输入QQ密码: ")

crawler = QQGroupCrawler(qq, password)
if await crawler.login():
    print("登录成功!")
    groups = await crawler.get_group_list()
    print(f"共找到{len(groups)}个QQ群")

    for group in groups:
        print(f"正在采集群 {group['gn']}({group['gc']}) 的成员...")
        members = await crawler.get_group_members(group['gc'])
        print(f"共获取到{len(members)}个成员")

        # 保存到数据库
        crawler.save_to_sqlite(group['gc'], members)

        # 导出到Excel
        crawler.save_to_excel(group['gc'], members)
        print(f"群 {group['gn']} 成员数据已保存")
else:
    print("登录失败!")

if name == 'main':
asyncio.run(main())

三、功能扩展建议

自动分页采集:处理大型QQ群(超过5000人)的分页采集逻辑

增量更新:记录上次采集时间,只采集新增或变更的成员信息

数据分析:添加成员活跃度分析、性别比例统计等功能

可视化展示:使用PyQt/Tkinter开发图形界面

异常处理:完善各种网络异常和验证码处理机制

四、注意事项

本工具仅供技术研究使用,请勿用于非法用途

频繁采集可能导致QQ账号异常或被限制登录

建议使用小号进行测试,避免主号风险

QQ协议可能随时变更,需要定期更新代码

实际使用时可能需要处理验证码等安全机制

相关文章
|
8天前
|
人工智能 Kubernetes 调度
基于 AI 网关和 llmaz,提升 vLLM 推理服务可用性和部署易用性的实践
本文介绍了如何使用 llmaz 快速部署基于 vLLM 的大语言模型推理服务,并结合 Higress AI 网关实现流量控制、可观测性、故障转移等能力,构建稳定、高可用的大模型服务平台。
133 16
|
12天前
|
人工智能 自然语言处理 关系型数据库
如何构建和调优高可用性的Agent?浅谈阿里云服务领域Agent构建的方法论
本文深入探讨了Agent智能体的概念、技术挑战及实际落地方法,涵盖了从狭义到广义的Agent定义、构建过程中的四大挑战(效果不稳定、规划权衡、领域知识集成、响应速度),并提出了相应的解决方案。文章结合阿里云服务领域的实践经验,总结了Agent构建与调优的完整路径,为推动Agent在To B领域的应用提供了有价值的参考。
173 18
如何构建和调优高可用性的Agent?浅谈阿里云服务领域Agent构建的方法论
|
1天前
|
XML Java 数据安全/隐私保护
抖音卡片生成器在线制作,抖音xml卡片链接生成器,私信群发卡片消息
这个项目实现了完整的抖音XML卡片生成功能,包含模板管理、数据绑定、XML验证等核心模块。
|
1天前
|
数据采集 文字识别 供应链
易语言接单平台,易语言接单,易语言软件脚本工具定制
中小企业痛点:2025年仍有43%小微企业存在ERP/CRM定制需求但预算有限(数据来源:中国中小企业协会)
|
10天前
|
人工智能 弹性计算 自然语言处理
从0到1部署大模型,计算巢模型市场让小白秒变专家
阿里云计算巢模型市场依托阿里云弹性计算资源,支持私有化部署,集成通义千问、通义万象、Stable Diffusion等领先AI模型,覆盖大语言模型、文生图、多模态、文生视频等场景。模型部署在用户云账号下,30分钟极速上线,保障数据安全与权限自主控制,适用于企业级私有部署及快速原型验证场景。
|
8天前
|
Web App开发 监控 前端开发
丝般顺滑:Web动画性能优化小技巧
丝般顺滑:Web动画性能优化小技巧
129 85
|
2天前
|
人工智能 数据安全/隐私保护
抖音留痕脚本,快手小红书留痕工具,截流获客刷短视频软件
AutoJS脚本实现了完整的留痕功能,包含日志记录、定时截图、事件监听和模拟操作四大模块
|
12天前
|
存储 JSON 监控
打通数据孤岛:基于对象存储的多云可观测融合实战
在多云环境下,企业面临数据分散、整合效率低、弹性能力不足等挑战。阿里云日志服务(SLS)推出对象导入功能,支持从阿里云OSS和AWS S3高效导入多云日志文件,具备智能文件发现、弹性扩缩容、多种格式解析等能力,实现亿级文件下新增数据分钟级可见,并通过统一分析平台提升跨云数据治理效率。
|
8天前
|
人工智能 编解码 监控
常用驱动修复工具推荐,驱动精灵、驱动人生、显卡驱动、360驱动大师、驱动扫描修复驱动修复,声卡驱动修复,u盘驱动修复等修复工具
电脑驱动安装对解决卡顿、网速慢等问题至关重要。本文介绍了驱动精灵、驱动人生、NVIDIA专业显卡驱动、360驱动大师及联想乐驱动等常用驱动管理软件的功能与优势,涵盖硬件检测、智能升级、驱动备份与还原等特色功能,帮助用户优化电脑性能并提升系统稳定性。
132 14
|
10天前
|
人工智能 数据可视化 云计算
刚刚!我用AiPy分析300页的阿里财务报表!
阿里发布2025财年财报并调整合作人队伍,AI助手AiPy结合Doubao模型对其深度分析,生成可视化HTML报告。内容涵盖收入结构、业务板块、资本管理、战略方向及个体发展机遇,如AI应用、跨境电商、本地生活创业等,形式新颖、洞察精准。