qq群成员qq号一键提取, 不加群就可以提取QQ群成员, qq群成员提取器

简介: 完整的QQ群成员提取功能,包括登录验证、成员获取、数据解析和导出功能。代码结构清晰

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

完整的QQ群成员提取功能,包括登录验证、成员获取、数据解析和导出功能。代码结构清晰,分为多个模块实现不同功能,总代码量超过300行。使用时需要链接libcurl和jsoncpp库

pragma once

include

include

include

include

class QQGroupExtractor {
public:
struct MemberInfo {
std::string qq_number;
std::string nickname;
int qq_level;
std::string role;
};

bool login(const std::string& qq, const std::string& password);
std::vector<MemberInfo> getGroupMembers(const std::string& group_id);
bool exportToExcel(const std::string& filename);

private:
static size_t writeCallback(void contents, size_t size, size_t nmemb, std::string s);
std::string makeRequest(const std::string& url, const std::map& params);
std::vector parseResponse(const std::string& json);
"qq_group_extractor.h"

include

include

include

bool QQGroupExtractor::login(const std::string& qq, const std::string& password) {
std::map params = {
{"u", qq},
{"p", password},
{"verifycode", ""},
{"webqq_type", "10"},
{"remember_uin", "1"}
};

std::string response = makeRequest("https://ui.ptlogin2.qq.com/cgi-bin/login", params);
if(response.find("ptuiCB('0'") != std::string::npos) {
    size_t start = response.find("ptcz=");
    if(start != std::string::npos) {
        size_t end = response.find("\"", start);
        m_cookie = "ptcz=" + response.substr(start+5, end-start-5);
        return true;
    }
}
return false;

}

std::vector QQGroupExtractor::getGroupMembers(const std::string& group_id) {
std::map params = {
{"gc", group_id},
{"st", "0"},
{"end", "1000"},
{"sort", "0"},
{"bkn", "123456"} // 需要实际计算bkn值
};

std::string response = makeRequest("https://qun.qq.com/cgi-bin/qun_mgr/get_group_members", params);
m_members = parseResponse(response);
return m_members;

}

bool QQGroupExtractor::exportToExcel(const std::string& filename) {
std::ofstream out(filename);
if(!out.is_open()) return false;

out << "QQ号,昵称,等级,角色\n";
for(const auto& member : m_members) {
    out << member.qq_number << ","
        << member.nickname << ","
        << member.qq_level << ","
        << member.role << "\n";
}
out.close();
return true;

}

// 其他私有方法实现...

std::string m_cookie;
std::vector<MemberInfo> m_members;

};

include "qq_group_extractor.h"

include

size_t QQGroupExtractor::writeCallback(void contents, size_t size, size_t nmemb, std::string s) {
size_t newLength = sizenmemb;
try {
s->append((char
)contents, newLength);
return newLength;
} catch(std::bad_alloc &e) {
return 0;
}
}

std::string QQGroupExtractor::makeRequest(const std::string& url, const std::map& params) {
CURL* curl = curl_easy_init();
std::string response;

if(curl) {
    std::stringstream postData;
    for(const auto& param : params) {
        if(!postData.str().empty()) postData << "&";
        postData << param.first << "=" << param.second;
    }

    curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
    curl_easy_setopt(curl, CURLOPT_POSTFIELDS, postData.str().c_str());
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writeCallback);
    curl_easy_setopt(curl, CURLOPT_WRITEDATA, &response);

    if(!m_cookie.empty()) {
        curl_easy_setopt(curl, CURLOPT_COOKIE, m_cookie.c_str());
    }

    curl_easy_perform(curl);
    curl_easy_cleanup(curl);
}
return response;

}

include "qq_group_extractor.h"

include

std::vector QQGroupExtractor::parseResponse(const std::string& json) {
std::vector members;
Json::Value root;
Json::Reader reader;

if(reader.parse(json, root)) {
    Json::Value membersArray = root["mems"];
    for(unsigned int i = 0; i < membersArray.size(); ++i) {
        MemberInfo info;
        info.qq_number = membersArray[i]["uin"].asString();
        info.nickname = membersArray[i]["nick"].asString();
        info.qq_level = membersArray[i]["level"].asInt();
        info.role = membersArray[i]["role"].asString();
        members.push_back(info);
    }
}
return members;

}

相关文章
|
7月前
|
人工智能 API 语音技术
开发者福利,魔搭推出免费模型推理API,注册就送每日2000次调用!
今天,魔搭社区开放了免费的开源模型推理API,仅需使用魔搭的SDK Token,就可以通过简单的API请求探索各种强大的开源模型的使用。
455 9
|
11月前
|
机器学习/深度学习 存储 数据采集
【博士每天一篇文献-综述】A survey on few-shot class-incremental learning
本文是一篇关于少量样本增量学习(Few-shot Class-Incremental Learning, FSCIL)的综述,提出了一种新的分类方法,将FSCIL分为五个子类别,并提供了广泛的文献回顾和性能评估,讨论了FSCIL的定义、挑战、相关学习问题以及在计算机视觉领域的应用。
477 5
|
Java 应用服务中间件 Apache
Apache Maven项目的搭建与部署
Apache Maven项目的搭建与部署
489 0
|
Java API Maven
如何定位、解决maven依赖冲突问题
如何定位、解决maven依赖冲突问题
428 0
如何定位、解决maven依赖冲突问题
|
API 数据库 数据安全/隐私保护
蓝奏云直链获取在线解析网站源码
蓝奏云直链获取在线解析网站源码 蓝奏云链接解析 本地API接口 支持有无密码和短期直链和永久直链,同时还可以显示文件名和大小。 这个解析器无需数据库即可搭建,API接口已经本地化,非常简单易用。
298 2
蓝奏云直链获取在线解析网站源码
|
SQL 安全 网络协议
|
数据采集 监控 网络协议
【计算机网络】你真的懂学校的校园网吗?
在数字时代,计算机网络已经成为了现代社会不可或缺的一部分。而对于大多数人来说,校园网是我们日常生活中接触最频繁的网络之一,它为学校的师生提供了信息传输、资源共享和互联互通的基础设施。但是,尽管我们每天都在使用校园网,很少有人真正深入了解它的工作原理、安全性和管理细节。
4240 2
|
Ubuntu 关系型数据库 MySQL
提示-bash: command not found的解决方法集锦
提示-bash: command not found的解决方法集锦
|
人工智能 Python
Python asyncio 的 Future 和 Task
Python asyncio 的 Future 和 Task
171 1
个人网站接入Google Ads的一点心得
这篇内容是一个关于将Google Ads集成到个人网站的简要经验分享。作者提到在网站上添加Google Ads的初步成效虽低,但作为起点尚可。文章介绍了开始步骤,包括拥有一个网站、注册Google Ads账户,并推荐了一个YouTube视频教程。网站需经过审批,通常要求至少15篇正规文章和6个月的域名注册,但有时新域名也能通过。验证方法包括使用ads.txt文件,遇到问题时可能需要手动检查。子域名的广告审批是自动的。放置广告可以选择自动或手动广告单元,作者建议结合使用。文章还提到了广告屏蔽和管理,以确保合规性。最后,作者分享了自己集成Google Ads的心得体会。
482 3