news 2026/4/12 1:14:41

定时刷新已经登录过的网页c#

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
定时刷新已经登录过的网页c#

1、日常工作中,登录内部系统往往需要输入用户名、密码、短信验证码,但是如果30分钟不操作,会自动退出,为避免频繁登录,可以使用c#写一个自动刷新指定网址页面的程序。找来找去,这个最好用

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 发送 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> /// 统一处理:控制台输出 + 写入日志 /// </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 脚本调用 exe 程序并不弹出控制台窗口

创建一个.vbs文件,比如run_hidden.vbs,内容如下:然后双击执行即可。也可以设置成开机启动

' run_hidden.vbs ' 注意:替换为你实际的exe文件路径 Set WshShell = CreateObject("WScript.Shell") ' 写法1:三重双引号包裹路径(推荐,处理路径含空格的情况) WshShell.Run """C:\your\actual\path\shuxin.exe""", 0, False ' 写法2:如果路径没有空格,也可以直接写(不推荐,兼容性差) ' WshShell.Run "C:\your\actual\path\shuxin.exe", 0, False ' 释放对象(可选,VBS会自动回收,但显式释放更规范) Set WshShell = Nothing

代码解析:

这是一个基于 Chrome DevTools Protocol (CDP) 实现自动刷新特定浏览器标签页的 C# 程序。让我详细分析其工作原理和用途:

主要功能

程序会定期(每19分钟)检查并刷新包含特定URL(如baidu.com)的Chrome标签页,防止网页因长时间不活动而过期或超时。

代码结构分析

1. 核心组件

  • TabInfo类:定义了浏览器标签页的数据结构

  • Main方法:程序主循环,定时执行刷新任务

  • RefreshTargetTabAsync方法:查找并刷新目标标签页

  • ReloadPageViaCDP方法:通过WebSocket发送刷新命令

2. 工作流程

  1. 启动要求:需要先用特定命令启动Chrome,启用远程调试

  2. 获取标签页列表:通过HTTP请求http://localhost:9222/json获取所有标签页信息

  3. 查找目标标签页:匹配包含TARGET_URL的URL

  4. 发送刷新命令:通过WebSocket连接发送Page.reloadCDP命令

  5. 循环执行:每19分钟重复上述过程

3. 关键技术点

Chrome远程调试

bash

复制

下载

# 使用9222端口开启调试模式 chrome.exe --remote-debugging-port=9222 --user-data-dir="C:\temp\chrome_debug"

CDP通信

  • 通过WebSocket连接到webSocketDebuggerUrl

  • 发送JSON格式的CDP命令

  • Page.reload命令会触发页面刷新

4. 潜在用途

  • 保持登录状态:防止需要登录的网页会话过期

  • 数据监控:保持监控页面实时更新

  • 避免超时:防止长时间不操作导致的连接断开

5. 注意事项和潜在问题

安全问题

csharp

复制

下载

// 远程调试端口暴露了浏览器控制权限 // 建议添加访问控制或身份验证

资源管理

csharp

复制

下载

// HttpClient 是静态的,但未正确配置重试和超时 // 建议添加适当的异常处理和资源清理 private static readonly HttpClient httpClient = new();

改进建议

  1. 错误处理增强:当前异常处理较简单,可能需要对特定异常做不同处理

  2. 配置灵活性:可将目标URL和间隔时间改为可配置参数

  3. 多个标签页支持:目前只处理第一个匹配的标签页

  4. 连接状态检查:添加WebSocket连接状态的验证

6. 依赖项

  • Newtonsoft.Json (JSON.NET) - 用于JSON序列化

  • System.Net.WebSockets - WebSocket通信

  • System.Text.Json - .NET内置JSON支持(虽然代码中使用了Newtonsoft)

这个程序实际上是一个简单的"防休眠"工具,通过模拟用户活动来保持网页的活跃状态。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/2 1:02:14

【Java毕设源码分享】基于springboot+vue的甘肃“印象”网站设计与实现(程序+文档+代码讲解+一条龙定制)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/4/10 6:15:47

【Java毕设源码分享】基于springboot+vue的高校“智慧党建”管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/4/11 2:53:37

57、Ubuntu开发工具与平台全解析

Ubuntu开发工具与平台全解析 1. Launchpad平台介绍 Launchpad是一个旨在简化软件开发过程中的沟通、协作和流程的基础设施,由支持Ubuntu社区的Canonical公司开发和维护。不过,它被众多软件项目所使用,其中不乏一些与Ubuntu社区无关的项目。这里是Ubuntu开发的核心场所。 …

作者头像 李华
网站建设 2026/4/10 12:40:03

OpenFeign 与 Spring Cloud LoadBalancer 源码深度解剖与实战全景

OpenFeign 与 Spring Cloud LoadBalancer 源码深度解剖与实战全景 在微服务架构中,服务调用是最核心的能力之一。Spring Cloud 体系里,OpenFeign 提供了声明式 HTTP 客户端,Spring Cloud LoadBalancer 提供了客户端负载均衡,它们协同工作,实现了 优雅、健壮、可扩展 的服…

作者头像 李华