要使用 Qt/C++ 与 Chrome 扩展进行通信以获取用户输入数据,通常可以通过以下方式实现:将 Chrome 扩展程序发送的数据传递给一个后端应用程序(如 Qt/C++ 应用),并在这个应用中处理接收到的数据。下面是一个简单的示例,包括 Chrome 扩展和 Qt/C++ 后端代码。
1. 创建 Chrome 扩展
manifest.json
{
"manifest_version": 3,
"name": "Input Logger",
"version": "1.0",
"permissions": ["activeTab"],
"background": {
"service_worker": "background.js"
},
"content_scripts": [
{
"matches": ["<all_urls>"],
"js": ["content.js"]
}
]
}
background.js
chrome.runtime.onMessage.addListener((request, sender, sendResponse) => {
if (request.type === 'logInput') {
console.log('Logging input:', request.data);
// 在这里,可以添加代码,将数据发送到你的 Qt 应用
fetch('http://localhost:3000/log', { // 假设 Qt 应用运行在此地址
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(request.data)
});
sendResponse({ status: 'success' });
}
});
content.js
document.addEventListener('input', function(event) {
const target = event.target;
// 只记录输入框和文本区域的值
if (target.tagName === 'INPUT' || target.tagName === 'TEXTAREA') {
chrome.runtime.sendMessage({
type: 'logInput',
data: {
value: target.value,
url: window.location.href,
hostname: window.location.hostname,
timestamp: new Date().getTime()
}
});
}
});
2. 创建 Qt/C++ 应用
在这个示例中,Qt 应用将启动一个简单的 HTTP 服务器来监听来自 Chrome 扩展的 POST 请求。
CMakeLists.txt (如果使用 CMake)
cmake_minimum_required(VERSION 3.5)
project(InputLogger)
set(CMAKE_CXX_STANDARD 11)
find_package(Qt6 REQUIRED COMPONENTS Core Network)
add_executable(InputLogger main.cpp)
target_link_libraries(InputLogger PRIVATE Qt6::Core Qt6::Network)
main.cpp
#include <QCoreApplication>
#include <QTcpServer>
#include <QTcpSocket>
#include <QJsonDocument>
#include <QJsonObject>
#include <QFile>
#include <QDateTime>
class HttpServer : public QTcpServer {
public:
HttpServer(QObject *parent = nullptr) : QTcpServer(parent) {}
protected:
void incomingConnection(qintptr socketDescriptor) override {
QTcpSocket *socket = new QTcpSocket(this);
socket->setSocketDescriptor(socketDescriptor);
connect(socket, &QTcpSocket::readyRead, this, [this, socket]() {
QByteArray request = socket->readAll();
// 简单解析HTTP请求,只处理POST请求
if (request.startsWith("POST")) {
QByteArray responseData;
int jsonStartIndex = request.indexOf("\r\n\r\n") + 4; // 跳过头部
QByteArray jsonData = request.mid(jsonStartIndex);
// 写入日志文件
logInputData(jsonData);
QString response =
"HTTP/1.1 200 OK\r\n"
"Content-Type: application/json\r\n"
"\r\n";
responseData.append(response);
socket->write(responseData);
socket->flush();
socket->close();
} else {
socket->close(); // 非POST请求直接关闭连接
}
});
connect(socket, &QTcpSocket::disconnected, socket, &QTcpSocket::deleteLater);
}
private:
void logInputData(const QByteArray &data) {
QFile logFile("input_log.csv");
if (!logFile.open(QIODevice::Append | QIODevice::Text)) return;
QJsonDocument doc = QJsonDocument::fromJson(data);
if (doc.isNull()) return; // JSON解析失败
QJsonObject jsonObj = doc.object();
QString logLine = QString("%1,%2,%3,%4\n")
.arg(QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm:ss"))
.arg(jsonObj["hostname"].toString())
.arg(jsonObj["url"].toString())
.arg(jsonObj["value"].toString());
logFile.write(logLine.toUtf8());
logFile.close();
}
};
int main(int argc, char *argv[]) {
QCoreApplication a(argc, argv);
HttpServer server;
if (!server.listen(QHostAddress::Any, 3000)) {
qFatal("Failed to start server");
return -1;
}
qDebug() << "Listening on port:" << server.serverPort();
return a.exec();
}
如何运行
创建 Chrome 扩展:
- 将以上
manifest.json
、background.js
和content.js
文件放入同一目录下,并在该目录下加载扩展(开发者模式)。
- 将以上
编译并运行 Qt 应用:
- 确保你有安装好 Qt 开发环境,然后根据提供的 CMakeLists.txt 编译项目。
- 启动你的 Qt 应用,它将监听 localhost 的 3000 端口。
测试:
- 打开浏览器,访问任何页面,在输入框或文本区域中键入内容。
- 检查生成的
input_log.csv
文件,以查看捕获到的用户输入数据。
通过以上步骤,你应该能够成功地从 Chrome 扩展捕获用户输入并将其发送到 QT/C++ 后端进行处理。这是一个基本示例,可以根据需求进行进一步扩展和优化。
内容由零声教学AI助手提供,问题来源于学员提问