使用 Golang-WebSocket 實現按鍵記錄

在 Web 開發和安全研究中,監聽用戶輸入是一項重要的功能,比如在在線代碼編輯器遊戲按鍵綁定快捷鍵管理中,我們可能需要記錄用戶的按鍵輸入。本文將介紹如何使用 Golang + WebSocket 實現一個簡單的按鍵記錄系統。

按鍵監聽的原理

在 Web 端,我們可以使用 JavaScript 的事件監聽器來捕獲用戶的鍵盤輸入事件。JavaScript 提供了 keydown、keypress 和 keyup 三種事件來監聽按鍵:

其中,keydown 是最常用的,因爲它可以捕獲所有鍵,包括 Ctrl、Alt、Shift 等特殊按鍵。在後端,我們可以使用 WebSocket 來實現一個持久化的雙向通信通道,使前端可以實時發送按鍵數據,而後端負責接收並存儲這些數據。

例子總覽

本例子包含**前端(HTML + JavaScript)後端(Golang WebSocket 服務器)**兩部分:

  1. 前端:
  1. 後端:

後端實現(Golang WebSocket 服務器)

按照慣例我們先創建一個 go 項目,操作如下所示:

mkdir weboscket-demo
cd websocket-demo/ go mod init github.com/xxx/websocket-demo
go get github.com/gorilla/websocket

新建 index.go 文件,並寫入以下代碼:

package main
import (
	"log"
	"net/http"
	"github.com/gorilla/websocket"
)
// WebSocket升級器
var upgrader = websocket.Upgrader{
	CheckOrigin: func(r *http.Request) bool {
		return true // 允許所有跨域請求(可根據需要調整)
	},
}
// 處理WebSocket連接
func handleConnections(w http.ResponseWriter, r *http.Request) {
	// 升級HTTP連接爲WebSocket 連接
	conn, err := upgrader.Upgrade(w, r, nil)
	if err != nil {
		log.Println("WebSocket 連接升級失敗:", err)
		return
	}
	defer conn.Close()
	log.Println("客戶端已連接")
	// 監聽WebSocket消息
	for {
		_, msg, err := conn.ReadMessage()
		if err != nil {
			log.Println("讀取消息失敗:", err)
			break
		}
		log.Printf("收到按鍵: %s\n", msg) // 這裏可以存入數據庫
	}
}
func main() {
	http.HandleFunc("/ws", handleConnections)
	log.Println("WebSocket 服務器啓動: ws://localhost:9527/ws")
	err := http.ListenAndServe(":9527", nil)
	if err != nil {
		log.Fatal("服務器啓動失敗:", err)
	}
}

代碼解析

前端實現(JavaScript 監聽按鍵)

新建 demo.html,並寫入以下代碼:

<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <meta >
    <title>按鍵記錄</title>
</head>
<body>
    <h2>按鍵記錄示例</h2>
    <p>請在頁面中按任意鍵,按鍵數據將發送到 WebSocket 服務器。</p>
    <script>
        // 連接 WebSocket 服務器
        const ws = new WebSocket("ws://localhost:9527/ws");
        ws.onopen = function() {
            console.log("已連接到 WebSocket 服務器");
        };
        ws.onmessage = function(event) {
            console.log("收到服務器消息:", event.data);
        };
        ws.onerror = function(error) {
            console.error("WebSocket 錯誤:", error);
        };
        ws.onclose = function() {
            console.log("WebSocket 連接已關閉");
        };
        // 監聽鍵盤按鍵事件
        document.addEventListener("keydown"function(event) {
            const keyData = {
                key: event.key,        // 按鍵字符(如 "a""Enter")
                code: event.code,      // 按鍵代碼(如 "KeyA""Enter")
                timestamp: new Date().toISOString() // 記錄時間
            };
            console.log("發送按鍵數據:", keyData);
            ws.send(JSON.stringify(keyData));
        });
    </script>
</body>
</html>

代碼解析

運行示例

運行效果如下圖所示:

總結

本文介紹了:

請在微信客戶端打開

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/Dm0VKpHvRlco5IU96rKohw