下载地址:https://www.pan38.com/share.php?code=JCnzE 提取密码:7789
代码说明:
核心功能模块:
使用libcurl进行HTTP请求4
JSON解析处理API响应数据
多线程加速群组处理15
Excel文件导出功能7
环境依赖:
需安装LLOneBot服务(参考4)
libcurl开发库
jsoncpp库
Windows系统需安装Excel
扩展建议:
可增加QQ号有效性验证模块13
添加群成员入群时间统计2
支持TXT格式导出3
include
include
include
include
include
include
include
include
include
using namespace std;
// 全局锁保证线程安全
mutex g_mutex;
// 回调函数处理HTTP响应
static size_t WriteCallback(void contents, size_t size, size_t nmemb, void userp) {
((string)userp)->append((char)contents, size nmemb);
return size nmemb;
}
// 获取群成员API调用
vector GetGroupMembers(int group_id, const string& api_url) {
CURL* curl = curl_easy_init();
string readBuffer;
vector members;
if (curl) {
string url = api_url + "/get_group_member_list?group_id=" + to_string(group_id);
curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &readBuffer);
CURLcode res = curl_easy_perform(curl);
if (res == CURLE_OK) {
Json::Value root;
Json::CharReaderBuilder builder;
istringstream iss(readBuffer);
string errs;
if (Json::parseFromStream(builder, iss, &root, &errs)) {
if (root.isMember("data") && root["data"].isArray()) {
for (const auto& member : root["data"]) {
string qq = to_string(member["user_id"].asInt64());
string nickname = member["nickname"].asString();
members.push_back(qq + "," + nickname);
}
}
}
}
curl_easy_cleanup(curl);
}
return members;
}
// 导出到Excel文件
void ExportToExcel(const vector& members, const string& filename) {
ofstream outFile(filename + ".csv");
outFile << "QQ号,昵称,加群时间\n";
for (const auto& member : members) {
outFile << member << "\n";
}
outFile.close();
// 转换CSV为Excel
string command = "powershell -command \"$excel = New-Object -ComObject Excel.Application; "
"$workbook = $excel.Workbooks.Open('" + filename + ".csv'); "
"$workbook.SaveAs('" + filename + ".xlsx', 51); "
"$workbook.Close(); $excel.Quit();\"";
system(command.c_str());
remove((filename + ".csv").c_str());
}
// 多线程处理群组
void ProcessGroups(const vector& group_ids, const string& api_url) {
vector threads;
for (int group_id : group_ids) {
threads.emplace_back([group_id, &api_url]() {
auto members = GetGroupMembers(group_id, api_url);
lock_guard<mutex> lock(g_mutex);
cout << "提取群 " << group_id << " 完成,共 " << members.size() << " 个成员\n";
ExportToExcel(members, "Group_" + to_string(group_id));
});
}
for (auto& t : threads) {
t.join();
}
}
int main() {
curl_global_init(CURL_GLOBAL_ALL);
// 配置LLOneBot API地址
string api_url = "http://localhost:3000";
vector<int> group_ids = {123456, 654321}; // 替换为目标群号
cout << "开始批量提取QQ群成员..." << endl;
ProcessGroups(group_ids, api_url);
curl_global_cleanup();
cout << "所有群成员导出完成!" << endl;
return 0;
}
cmake_minimum_required(VERSION 3.10)
project(QQGroupExtractor)
set(CMAKE_CXX_STANDARD 17)
find_package(CURL REQUIRED)
find_package(JSONCPP REQUIRED)
add_executable(QQGroupExtractor QQGroupExtractor.cpp)
target_link_libraries(QQGroupExtractor ${CURL_LIBRARIES} ${JSONCPP_LIBRARIES})