使用C#定時刷新已經(jīng)登錄過的網(wǎng)頁
1、引言
日常工作中,登錄內(nèi)部系統(tǒng)往往需要輸入用戶名、密碼、短信驗證碼,但是如果30分鐘不操作,會自動退出,為避免頻繁登錄,可以使用c#寫一個自動刷新指定網(wǎng)址頁面的程序。找來找去,這個最好用
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;
///用這個命令行打開谷歌,然后在進入自己的地址 "C:\Program Files\Google\Chrome\Application\chrome.exe" --remote-debugging-port=9222 --user-data-dir="C:\temp\chrome_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.\n");
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: 獲取所有標簽頁
var tabsJson = await httpClient.GetStringAsync("http://localhost:9222/json");
var tabs = JsonConvert.DeserializeObject<List<TabInfo>>(tabsJson);
// Step 2: 查找目標 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);
// 構造 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);
// 可選:讀取響應(非必須)
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;
/// 啟動Chrome命令:"C:\Program Files\Google\Chrome\Application\chrome.exe" --remote-debugging-port=9222 --user-data-dir="C:\temp\chrome_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.\n");
while (true)
{
try
{
await RefreshTargetTabAsync();
}
catch (Exception ex)
{
LogAndPrint($"Error: {ex.Message}");
}
await Task.Delay(TimeSpan.FromMinutes(REFRESH_INTERVAL_MINUTES));
}
}
static async Task RefreshTargetTabAsync()
{
// 獲取所有標簽頁
var tabsJson = await httpClient.GetStringAsync("http://localhost:9222/json");
var tabs = JsonConvert.DeserializeObject<List<TabInfo>>(tabsJson);
// 查找目標標簽頁
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);
// 構造刷新命令
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);
// 讀取響應(可選)
var receiveBuffer = new byte[1024];
await ws.ReceiveAsync(receiveBuffer, CancellationToken.None);
await ws.CloseAsync(WebSocketCloseStatus.NormalClosure, "", CancellationToken.None);
}
/// <summary>
/// 統(tǒng)一處理:控制臺輸出 + 寫入日志
/// </summary>
private static void LogAndPrint(string message)
{
Console.WriteLine(message);
try
{
// 追加寫入日志,帶完整時間戳
var logContent = $"[{DateTime.Now:yyyy-MM-dd HH:mm:ss}] {message}{Environment.NewLine}";
File.AppendAllText(LogFilePath, logContent, Encoding.UTF8);
}
catch (Exception ex)
{
// 日志寫入失敗時僅提示,不影響主程序
Console.WriteLine($"Failed to write log: {ex.Message}");
}
}
}
}3、可以通過 VBS 腳本調(diào)用 exe 程序并不彈出控制臺窗口
創(chuàng)建一個 .vbs 文件,比如 run_hidden.vbs,內(nèi)容如下:然后雙擊執(zhí)行即可。也可以設置成開機啟動
' run_hidden.vbs
' 注意:替換為你實際的exe文件路徑
Set WshShell = CreateObject("WScript.Shell")
' 寫法1:三重雙引號包裹路徑(推薦,處理路徑含空格的情況)
WshShell.Run """C:\your\actual\path\shuxin.exe""", 0, False
' 寫法2:如果路徑?jīng)]有空格,也可以直接寫(不推薦,兼容性差)
' WshShell.Run "C:\your\actual\path\shuxin.exe", 0, False
' 釋放對象(可選,VBS會自動回收,但顯式釋放更規(guī)范)
Set WshShell = Nothing代碼解析:
這是一個基于 Chrome DevTools Protocol (CDP) 實現(xiàn)自動刷新特定瀏覽器標簽頁的 C# 程序。讓我詳細分析其工作原理和用途:
主要功能
程序會定期(每19分鐘)檢查并刷新包含特定URL(如baidu.com)的Chrome標簽頁,防止網(wǎng)頁因長時間不活動而過期或超時。
代碼結構分析
1. 核心組件
- TabInfo類:定義了瀏覽器標簽頁的數(shù)據(jù)結構
- Main方法:程序主循環(huán),定時執(zhí)行刷新任務
- RefreshTargetTabAsync方法:查找并刷新目標標簽頁
- ReloadPageViaCDP方法:通過WebSocket發(fā)送刷新命令
2. 工作流程
- 啟動要求:需要先用特定命令啟動Chrome,啟用遠程調(diào)試
- 獲取標簽頁列表:通過HTTP請求
http://localhost:9222/json獲取所有標簽頁信息 - 查找目標標簽頁:匹配包含
TARGET_URL的URL - 發(fā)送刷新命令:通過WebSocket連接發(fā)送
Page.reloadCDP命令 - 循環(huán)執(zhí)行:每19分鐘重復上述過程
3. 關鍵技術點
Chrome遠程調(diào)試:
# 使用9222端口開啟調(diào)試模式 chrome.exe --remote-debugging-port=9222 --user-data-dir="C:\temp\chrome_debug"
CDP通信:
- 通過WebSocket連接到
webSocketDebuggerUrl - 發(fā)送JSON格式的CDP命令
Page.reload命令會觸發(fā)頁面刷新
4. 潛在 用途
- 保持登錄狀態(tài):防止需要登錄的網(wǎng)頁會話過期
- 數(shù)據(jù)監(jiān)控:保持監(jiān)控頁面實時更新
- 避免超時:防止長時間不操作導致的連接斷開
5. 注意事項和潛在問題
安全問題:
// 遠程調(diào)試端口暴露了瀏覽器控制權限 // 建議添加訪問控制或身份驗證
資源管理:
// HttpClient 是靜態(tài)的,但未正確配置重試和超時 // 建議添加適當?shù)漠惓L幚砗唾Y源清理 private static readonly HttpClient httpClient = new();
改進建議:
- 錯誤處理增強:當前異常處理較簡單,可能需要對特定異常做不同處理
- 配置靈活性:可將目標URL和間隔時間改為可配置參數(shù)
- 多個標簽頁支持:目前只處理第一個匹配的標簽頁
- 連接狀態(tài)檢查:添加WebSocket連接狀態(tài)的驗證
6. 依賴項
- Newtonsoft.Json (JSON.NET) - 用于JSON序列化
- System.Net.WebSockets - WebSocket通信
- System.Text.Json - .NET內(nèi)置JSON支持(雖然代碼中使用了Newtonsoft)
這個程序?qū)嶋H上是一個簡單的"防休眠"工具,通過模擬用戶活動來保持網(wǎng)頁的活躍狀態(tài)。
以上就是使用C#定時刷新已經(jīng)登錄過的網(wǎng)頁的詳細內(nèi)容,更多關于C#定時刷新網(wǎng)頁的資料請關注腳本之家其它相關文章!
相關文章
C#實現(xiàn)CSV與PDF和DataTable的快速轉(zhuǎn)換
CSV作為輕量級數(shù)據(jù)載體,在數(shù)據(jù)傳輸中占比超過70%,這篇文章主要為大家介紹了如何使用C#實現(xiàn)CSV與PDF和DataTable的快速轉(zhuǎn)換,需要的可以了解下2025-07-07
在C#中將選定的單元格范圍轉(zhuǎn)換為PDF的操作步驟
在實際開發(fā)中,我們經(jīng)常需要處理Excel文件,并將其轉(zhuǎn)換為PDF格式以方便分享、打印或存檔,然而,直接將整個工作表轉(zhuǎn)換為PDF,常常會導致隱私泄露的風險,那么,如何在C#中高效、準確地將Excel的“選定單元格范圍”轉(zhuǎn)換為PDF,下面小編給大家詳細說說2025-09-09

