下载地址: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;
}