news 2026/4/18 9:42:16

定时刷新已经登录过的网页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/18 0:28:05

【paperzz博士生开题报告】博士开题报告写不动了?Paperzz智能辅助+权威查重,助你突破瓶颈,导师说“这思路可以申基金”!

Paperzz-AI官网免费论文查重复率AIGC检测/开题报告/文献综述/论文初稿 https://www.paperzz.cc/proposalhttps://www.paperzz.cc/proposal 副标题&#xff1a; 博士开题不是“熬”出来的&#xff0c;是“智”出来的&#xff01;Paperzz帮你搞定50文献、五级大纲、顶刊级图表、基…

作者头像 李华
网站建设 2026/4/18 3:25:56

基于VUE的数字化文档管理系统[VUE]-计算机毕业设计源码+LW文档

摘要&#xff1a;随着信息技术的飞速发展&#xff0c;数字化文档管理系统在企业和教育等领域变得越来越重要。本文介绍了一个基于VUE框架开发的数字化文档管理系统&#xff0c;详细阐述了其需求分析、系统设计&#xff08;包括架构设计、功能模块设计等&#xff09;、具体实现过…

作者头像 李华
网站建设 2026/4/18 3:26:44

基于VUE的蔬菜营销系统[VUE]-计算机毕业设计源码+LW文档

摘要&#xff1a;随着互联网技术的发展和消费者对蔬菜品质与购买体验要求的提高&#xff0c;传统的蔬菜营销模式面临挑战。本文旨在设计并实现一个基于VUE框架的蔬菜营销系统&#xff0c;阐述系统的需求分析、技术选型、架构设计、功能模块设计以及具体实现过程。该系统实现了蔬…

作者头像 李华
网站建设 2026/4/17 22:35:03

12.8-12.13总结

一周总结 python语法 字符串 分割&#xff1a;传入分隔字符&#xff0c;返回分割后的字符串列表。分隔符不能是空字符串&#xff08;&#xff09; str str_1_2_name str_list str.split(_)# str_list:[str,1,2,name]拼接&#xff1a;用拼接字符调用&#xff0c;传入字符串或字…

作者头像 李华