已实装在 about | Tilnel’s Blog
给静态页面加这种东西,疑似有点闲。
实现分为三步:
1、判断我是否在工位 - 采取的标准是检测右手边主机是否锁屏
2、动态更新
3、将其显示在静态页面上。毕竟 github.io 仓库太慢了
判断
修改 Windows 组策略使得锁定(4800)解锁(4801)事件被记录。写一个cpp获取最后一个事件,挂在后台。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| void CheckLockUnlockEvents() { HANDLE hEventLog = OpenEventLog(NULL, "Security"); if (hEventLog == NULL) { std::cerr << "Failed to open event log.\n"; return; }
DWORD bytesRead = 0, minBytesNeeded = 0; const int bufferSize = 1024 * 10; std::vector<BYTE> buffer(bufferSize);
if (!ReadEventLog(hEventLog, EVENTLOG_SEQUENTIAL_READ | EVENTLOG_BACKWARDS_READ, 0, buffer.data(), bufferSize, &bytesRead, &minBytesNeeded)) { std::cerr << "Failed to read event log.\n"; CloseEventLog(hEventLog); return; }
auto* pRecord = reinterpret_cast<EVENTLOGRECORD*>(buffer.data());
while ((BYTE*)pRecord < buffer.data() + bytesRead) { if (pRecord->EventID == EVENT_LOCK || pRecord->EventID == EVENT_UNLOCK) { std::string eventType = (pRecord->EventID == EVENT_LOCK) ? "Lock" : "Unlock"; std::string message = "Event: " + eventType + ", Time: " + std::to_string(pRecord->TimeGenerated); std::cout << message << std::endl;
SendUDPMessage(message); break; } pRecord = (EVENTLOGRECORD*)((BYTE*)pRecord + pRecord->Length); }
CloseEventLog(hEventLog); }
|
更新
把事件信息发到 Linux 主机上。启动一个守护进程,监听消息并生成一个 /tmp/activity 文件,内容为需要在网站上显示的 html 标签。
例如:
1
| <font color='#ff0000' 已经离开了</font>
|
配置 nginx
1 2 3 4
| location /activity { default_type text/html; alias /tmp/activity; }
|
显示
塞一个 JavaScript 到主题的 js 文件夹里,fetch 这个 html 标签并塞到另一个 html 标签里。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| const url = "?";
fetch(url, { mode: 'cors' }) .then(response => { if (!response.ok) { throw new Error(`HTTP error! Status: ${response.status}`); } return response.text(); }) .then(html => { document.getElementById('html-container').innerHTML = html; }) .catch(error => { console.error('Failed to fetch HTML:', error); document.getElementById('html-container').innerText = 'Failed to load content.'; });
|
现在,为了从 github.io 上跨域访问,需要设置 nginx 的 Head
1 2 3 4 5 6 7
| location = /activity { add_header 'Access-Control-Allow-Origin' '*'; add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS'; add_header 'Access-Control-Allow-Headers' 'Content-Type, Authorization'; default_type text/html; alias /tmp/activity; }
|
然后我们把需要的元素装在 About 的 markdown 里面。
1 2
| <div id="html-container">校园网访问可加载当前状态</div> <script type="text/javascript" src="/js/active.js"></script>
|
效果:
校园网访问可加载当前状态