ZBLOG

使用 Qt/C++ 与 Chrome 扩展通信获取用户输入数据 请给我一个能用是示例

要使用 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();
}

如何运行

  1. 创建 Chrome 扩展

    • 将以上 manifest.jsonbackground.jscontent.js 文件放入同一目录下,并在该目录下加载扩展(开发者模式)。
  2. 编译并运行 Qt 应用

    • 确保你有安装好 Qt 开发环境,然后根据提供的 CMakeLists.txt 编译项目。
    • 启动你的 Qt 应用,它将监听 localhost 的 3000 端口。
  3. 测试

    • 打开浏览器,访问任何页面,在输入框或文本区域中键入内容。
    • 检查生成的 input_log.csv 文件,以查看捕获到的用户输入数据。

通过以上步骤,你应该能够成功地从 Chrome 扩展捕获用户输入并将其发送到 QT/C++ 后端进行处理。这是一个基本示例,可以根据需求进行进一步扩展和优化。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=22859

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?