保定建設(shè)網(wǎng)站國際平臺(tái)有哪些
鶴壁市浩天電氣有限公司
2026/01/24 14:26:32
保定建設(shè)網(wǎng)站,國際平臺(tái)有哪些,無錫連夜發(fā)布最新通告,解決設(shè)計(jì)網(wǎng)站問題1、日常工作中#xff0c;登錄內(nèi)部系統(tǒng)往往需要輸入用戶名、密碼、短信驗(yàn)證碼#xff0c;但是如果30分鐘不操作#xff0c;會(huì)自動(dòng)退出#xff0c;為避免頻繁登錄#xff0c;可以使用c#寫一個(gè)自動(dòng)刷新指定網(wǎng)址頁面的程序。找來找去#xff0c;這個(gè)最好用 using System;
us…1、日常工作中登錄內(nèi)部系統(tǒng)往往需要輸入用戶名、密碼、短信驗(yàn)證碼但是如果30分鐘不操作會(huì)自動(dòng)退出為避免頻繁登錄可以使用c#寫一個(gè)自動(dòng)刷新指定網(wǎng)址頁面的程序。找來找去這個(gè)最好用using System; using System.Collections.Generic; using System.Linq; using System.Net.Http; using System.Text; using System.Text.Json; using System.Threading; using System.Threading.Tasks; using System.Net.WebSockets; using Newtonsoft.Json; ///用這個(gè)命令行打開谷歌然后在進(jìn)入自己的地址 C:Program FilesGoogleChromeApplicationchrome.exe --remote-debugging-port9222 --user-data-dirC: empchrome_debug namespace shuxin { public class TabInfo { [JsonProperty(id)] public string Id { get; set; } [JsonProperty(url)] public string Url { get; set; } [JsonProperty(webSocketDebuggerUrl)] public string WebSocketUrl { get; set; } [JsonProperty(title)] public string Title { get; set; } } class Program { private const string TARGET_URL sd4a.com; // 支持部分匹配如包含 baidu.com private const int REFRESH_INTERVAL_MINUTES 19; private static readonly HttpClient httpClient new(); static async Task Main(string[] args) { Console.WriteLine(Auto-refresh for browser tabs started...); Console.WriteLine($Target URL pattern: {TARGET_URL}); Console.WriteLine($Refresh every {REFRESH_INTERVAL_MINUTES} minutes.
); while (true) { try { await RefreshTargetTabAsync(); } catch (Exception ex) { Console.WriteLine($Error: {ex.Message}); } await Task.Delay(TimeSpan.FromMinutes(REFRESH_INTERVAL_MINUTES)); } } static async Task RefreshTargetTabAsync() { // Step 1: 獲取所有標(biāo)簽頁 var tabsJson await httpClient.GetStringAsync(http://localhost:9222/json); var tabs JsonConvert.DeserializeObjectListTabInfo(tabsJson); // Step 2: 查找目標(biāo) URL支持子路徑 var targetTab tabs.FirstOrDefault(t t.Url ! null t.Url.Contains(TARGET_URL, StringComparison.OrdinalIgnoreCase)); if (targetTab null) { Console.WriteLine($[{DateTime.Now:HH:mm:ss}] Target tab not found.); return; } Console.WriteLine($[{DateTime.Now:HH:mm:ss}] Found tab: {targetTab.Title} - {targetTab.Url}); // Step 3: 通過 WebSocket 發(fā)送 Page.reload 命令 await ReloadPageViaCDP(targetTab.WebSocketUrl); Console.WriteLine($[{DateTime.Now:HH:mm:ss}] Page refreshed successfully.); } static async Task ReloadPageViaCDP(string webSocketUrl) { using var ws new ClientWebSocket(); await ws.ConnectAsync(new Uri(webSocketUrl), CancellationToken.None); // 構(gòu)造 CDP Page.reload 命令 var command new { id 1, method Page.reload, params new { } }; string json JsonConvert.SerializeObject(command); var buffer Encoding.UTF8.GetBytes(json); await ws.SendAsync(buffer, WebSocketMessageType.Text, true, CancellationToken.None); // 可選讀取響應(yīng)非必須 var receiveBuffer new byte[1024]; await ws.ReceiveAsync(receiveBuffer, CancellationToken.None); await ws.CloseAsync(WebSocketCloseStatus.NormalClosure, , CancellationToken.None); } } }2、如果想增加日志可以這樣寫using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net.Http; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Net.WebSockets; using Newtonsoft.Json; /// 啟動(dòng)Chrome命令C:Program FilesGoogleChromeApplicationchrome.exe --remote-debugging-port9222 --user-data-dirC: empchrome_debug namespace shuxin { public class TabInfo { [JsonProperty(id)] public string Id { get; set; } [JsonProperty(url)] public string Url { get; set; } [JsonProperty(webSocketDebuggerUrl)] public string WebSocketUrl { get; set; } [JsonProperty(title)] public string Title { get; set; } } class Program { private const string TARGET_URL sd4a.com; private const int REFRESH_INTERVAL_MINUTES 19; private static readonly HttpClient httpClient new(); private const string LogFilePath c:log.txt; static async Task Main(string[] args) { // 初始化信息 LogAndPrint(Auto-refresh for browser tabs started...); LogAndPrint($Target URL pattern: {TARGET_URL}); LogAndPrint($Refresh every {REFRESH_INTERVAL_MINUTES} minutes.
); while (true) { try { await RefreshTargetTabAsync(); } catch (Exception ex) { LogAndPrint($Error: {ex.Message}); } await Task.Delay(TimeSpan.FromMinutes(REFRESH_INTERVAL_MINUTES)); } } static async Task RefreshTargetTabAsync() { // 獲取所有標(biāo)簽頁 var tabsJson await httpClient.GetStringAsync(http://localhost:9222/json); var tabs JsonConvert.DeserializeObjectListTabInfo(tabsJson); // 查找目標(biāo)標(biāo)簽頁 var targetTab tabs.FirstOrDefault(t t.Url ! null t.Url.Contains(TARGET_URL, StringComparison.OrdinalIgnoreCase)); if (targetTab null) { LogAndPrint($[{DateTime.Now:HH:mm:ss}] Target tab not found.); return; } LogAndPrint($[{DateTime.Now:HH:mm:ss}] Found tab: {targetTab.Title} - {targetTab.Url}); // 刷新頁面 await ReloadPageViaCDP(targetTab.WebSocketUrl); LogAndPrint($[{DateTime.Now:HH:mm:ss}] Page refreshed successfully.); } static async Task ReloadPageViaCDP(string webSocketUrl) { using var ws new ClientWebSocket(); await ws.ConnectAsync(new Uri(webSocketUrl), CancellationToken.None); // 構(gòu)造刷新命令 var command new { id 1, method Page.reload, params new { } }; var buffer Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(command)); await ws.SendAsync(buffer, WebSocketMessageType.Text, true, CancellationToken.None); // 讀取響應(yīng)可選 var receiveBuffer new byte[1024]; await ws.ReceiveAsync(receiveBuffer, CancellationToken.None); await ws.CloseAsync(WebSocketCloseStatus.NormalClosure, , CancellationToken.None); } /// summary /// 統(tǒng)一處理控制臺(tái)輸出 寫入日志 /// /summary private static void LogAndPrint(string message) { Console.WriteLine(message); try { // 追加寫入日志帶完整時(shí)間戳 var logContent $[{DateTime.Now:yyyy-MM-dd HH:mm:ss}] {message}{Environment.NewLine}; File.AppendAllText(LogFilePath, logContent, Encoding.UTF8); } catch (Exception ex) { // 日志寫入失敗時(shí)僅提示不影響主程序 Console.WriteLine($Failed to write log: {ex.Message}); } } } }3、可以通過 VBS 腳本調(diào)用 exe 程序并不彈出控制臺(tái)窗口創(chuàng)建一個(gè).vbs文件比如run_hidden.vbs內(nèi)容如下然后雙擊執(zhí)行即可。也可以設(shè)置成開機(jī)啟動(dòng) run_hidden.vbs 注意替換為你實(shí)際的exe文件路徑 Set WshShell CreateObject(WScript.Shell) 寫法1三重雙引號(hào)包裹路徑推薦處理路徑含空格的情況 WshShell.Run C:youractualpathshuxin.exe, 0, False 寫法2如果路徑?jīng)]有空格也可以直接寫不推薦兼容性差 WshShell.Run C:youractualpathshuxin.exe, 0, False 釋放對(duì)象可選VBS會(huì)自動(dòng)回收但顯式釋放更規(guī)范 Set WshShell Nothing代碼解析這是一個(gè)基于 Chrome DevTools Protocol (CDP) 實(shí)現(xiàn)自動(dòng)刷新特定瀏覽器標(biāo)簽頁的 C# 程序。讓我詳細(xì)分析其工作原理和用途主要功能程序會(huì)定期每19分鐘檢查并刷新包含特定URL如baidu.com的Chrome標(biāo)簽頁防止網(wǎng)頁因長時(shí)間不活動(dòng)而過期或超時(shí)。代碼結(jié)構(gòu)分析1. 核心組件TabInfo類定義了瀏覽器標(biāo)簽頁的數(shù)據(jù)結(jié)構(gòu)Main方法程序主循環(huán)定時(shí)執(zhí)行刷新任務(wù)RefreshTargetTabAsync方法查找并刷新目標(biāo)標(biāo)簽頁ReloadPageViaCDP方法通過WebSocket發(fā)送刷新命令2. 工作流程啟動(dòng)要求需要先用特定命令啟動(dòng)Chrome啟用遠(yuǎn)程調(diào)試獲取標(biāo)簽頁列表通過HTTP請(qǐng)求http://localhost:9222/json獲取所有標(biāo)簽頁信息查找目標(biāo)標(biāo)簽頁匹配包含TARGET_URL的URL發(fā)送刷新命令通過WebSocket連接發(fā)送Page.reloadCDP命令循環(huán)執(zhí)行每19分鐘重復(fù)上述過程3. 關(guān)鍵技術(shù)點(diǎn)Chrome遠(yuǎn)程調(diào)試bash復(fù)制下載# 使用9222端口開啟調(diào)試模式 chrome.exe --remote-debugging-port9222 --user-data-dirC: empchrome_debugCDP通信通過WebSocket連接到webSocketDebuggerUrl發(fā)送JSON格式的CDP命令Page.reload命令會(huì)觸發(fā)頁面刷新4. 潛在用途保持登錄狀態(tài)防止需要登錄的網(wǎng)頁會(huì)話過期數(shù)據(jù)監(jiān)控保持監(jiān)控頁面實(shí)時(shí)更新避免超時(shí)防止長時(shí)間不操作導(dǎo)致的連接斷開5. 注意事項(xiàng)和潛在問題安全問題csharp復(fù)制下載// 遠(yuǎn)程調(diào)試端口暴露了瀏覽器控制權(quán)限 // 建議添加訪問控制或身份驗(yàn)證資源管理csharp復(fù)制下載// HttpClient 是靜態(tài)的但未正確配置重試和超時(shí) // 建議添加適當(dāng)?shù)漠惓L幚砗唾Y源清理 private static readonly HttpClient httpClient new();改進(jìn)建議錯(cuò)誤處理增強(qiáng)當(dāng)前異常處理較簡單可能需要對(duì)特定異常做不同處理配置靈活性可將目標(biāo)URL和間隔時(shí)間改為可配置參數(shù)多個(gè)標(biāo)簽頁支持目前只處理第一個(gè)匹配的標(biāo)簽頁連接狀態(tài)檢查添加WebSocket連接狀態(tài)的驗(yàn)證6. 依賴項(xiàng)Newtonsoft.Json (JSON.NET) - 用于JSON序列化System.Net.WebSockets - WebSocket通信System.Text.Json - .NET內(nèi)置JSON支持雖然代碼中使用了Newtonsoft這個(gè)程序?qū)嶋H上是一個(gè)簡單的防休眠工具通過模擬用戶活動(dòng)來保持網(wǎng)頁的活躍狀態(tài)。