diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a449598 --- /dev/null +++ b/.gitignore @@ -0,0 +1,83 @@ +/.github +/.idea +/.vs +/.vscode + +#环境变量 +.env + +#构建删除 +Run/*.exe + +# 忽略所有obj +**/obj/** + +# 已构建程序不上传 +*.exe + +# IDEA +Server/.idea + +[Tt]humbs.db +*.DS_Store + +#Visual Studio files +*.[Oo]bj +*.user +*.aps +*.pch +*.vspscc +*.vssscc +*_i.c +*_p.c +*.ncb +*.suo +*.tlb +*.tlh +*.bak +*.[Cc]ache +*.ilk +*.log +*.lib +*.sbr +*.sdf +*.opensdf +*.unsuccessfulbuild +ipch/ +obj/ +[Bb]in +[Dd]ebug*/ +[Rr]elease*/ +Ankh.NoLoad + +#MonoDevelop +*.pidb +*.userprefs + +#Tooling +_ReSharper*/ +*.resharper +[Tt]est[Rr]esult* +*.sass-cache + +#Project files +[Bb]uild/ + +#Subversion files +.svn + +# Office Temp Files +~$* + +#NuGet +packages/ + +#ncrunch +*ncrunch* +*crunch*.local.xml + +# visual studio database projects +*.dbmdl + +#Test files +*.testsettings diff --git a/FromBrowser.sln b/FormBrowser.sln similarity index 84% rename from FromBrowser.sln rename to FormBrowser.sln index 4d49b4f..cf4b128 100644 --- a/FromBrowser.sln +++ b/FormBrowser.sln @@ -1,9 +1,9 @@  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 17 -VisualStudioVersion = 17.13.35931.197 d17.13 +VisualStudioVersion = 17.13.35931.197 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FromBrowser", "FromBrowser\FromBrowser.csproj", "{88D34179-7D4E-42B1-A755-CA96F7B242B4}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FormBrowser", "FromBrowser\FormBrowser.csproj", "{88D34179-7D4E-42B1-A755-CA96F7B242B4}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution diff --git a/FromBrowser/.vs/FromBrowser.csproj.dtbcache.json b/FromBrowser/.vs/FromBrowser.csproj.dtbcache.json new file mode 100644 index 0000000..7bbf087 --- /dev/null +++ b/FromBrowser/.vs/FromBrowser.csproj.dtbcache.json @@ -0,0 +1 @@ +{"RootPath":"C:\\Git\\FromBrowser\\FromBrowser","ProjectFileName":"FromBrowser.csproj","Configuration":"Debug|AnyCPU","FrameworkPath":"","Sources":[{"SourceFile":"Form1.cs"},{"SourceFile":"Form1.Designer.cs"},{"SourceFile":"Program.cs"},{"SourceFile":"Properties\\AssemblyInfo.cs"},{"SourceFile":"Properties\\Resources.Designer.cs"},{"SourceFile":"Properties\\Settings.Designer.cs"},{"SourceFile":"obj\\Debug\\.NETFramework,Version=v4.7.2.AssemblyAttributes.cs"}],"References":[{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.7.2\\Microsoft.CSharp.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.7.2\\mscorlib.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.7.2\\System.Core.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.7.2\\System.Data.DataSetExtensions.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.7.2\\System.Data.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.7.2\\System.Deployment.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.7.2\\System.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.7.2\\System.Drawing.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.7.2\\System.Net.Http.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.7.2\\System.Windows.Forms.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.7.2\\System.Xml.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.7.2\\System.Xml.Linq.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""}],"Analyzers":[],"Outputs":[{"OutputItemFullPath":"C:\\Git\\FromBrowser\\FromBrowser\\bin\\Debug\\FromBrowser.exe","OutputItemRelativePath":"FromBrowser.exe"},{"OutputItemFullPath":"","OutputItemRelativePath":""}],"CopyToOutputEntries":[]} \ No newline at end of file diff --git a/FromBrowser/Browser.Designer.cs b/FromBrowser/Browser.Designer.cs new file mode 100644 index 0000000..2da25e5 --- /dev/null +++ b/FromBrowser/Browser.Designer.cs @@ -0,0 +1,146 @@ +namespace FormBrowser +{ + partial class Browser + { + /// + /// 必需的设计器变量。 + /// + private System.ComponentModel.IContainer components = null; + + private System.Windows.Forms.TextBox txtUrl; + private System.Windows.Forms.Button btnGo; + private System.Windows.Forms.Button btnBack; + private System.Windows.Forms.Button btnForward; + private System.Windows.Forms.Button btnRefresh; + private System.Windows.Forms.Panel navPanel; + + /// + /// 清理所有正在使用的资源。 + /// + /// 如果应释放托管资源,为 true;否则为 false。 + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows 窗体设计器生成的代码 + + /// + /// 设计器支持所需的方法 - 不要修改 + /// 使用代码编辑器修改此方法的内容。 + /// + private void InitializeComponent() + { + this.webBrowser1 = new System.Windows.Forms.WebBrowser(); + this.folderBrowserDialog1 = new System.Windows.Forms.FolderBrowserDialog(); + this.navPanel = new System.Windows.Forms.Panel(); + this.btnBack = new System.Windows.Forms.Button(); + this.btnForward = new System.Windows.Forms.Button(); + this.btnRefresh = new System.Windows.Forms.Button(); + this.txtUrl = new System.Windows.Forms.TextBox(); + this.btnGo = new System.Windows.Forms.Button(); + this.navPanel.SuspendLayout(); + this.SuspendLayout(); + // + // webBrowser1 + // + this.webBrowser1.Dock = System.Windows.Forms.DockStyle.Fill; + this.webBrowser1.Location = new System.Drawing.Point(0, 40); + this.webBrowser1.MinimumSize = new System.Drawing.Size(20, 20); + this.webBrowser1.Name = "webBrowser1"; + this.webBrowser1.ScriptErrorsSuppressed = true; + this.webBrowser1.Size = new System.Drawing.Size(1024, 728); + this.webBrowser1.TabIndex = 0; + this.webBrowser1.Navigated += new System.Windows.Forms.WebBrowserNavigatedEventHandler(this.WebBrowser_Navigated); + // + // navPanel + // + this.navPanel.Controls.Add(this.btnBack); + this.navPanel.Controls.Add(this.btnForward); + this.navPanel.Controls.Add(this.btnRefresh); + this.navPanel.Controls.Add(this.txtUrl); + this.navPanel.Controls.Add(this.btnGo); + this.navPanel.Dock = System.Windows.Forms.DockStyle.Top; + this.navPanel.Location = new System.Drawing.Point(0, 0); + this.navPanel.Name = "navPanel"; + this.navPanel.Size = new System.Drawing.Size(1024, 40); + this.navPanel.TabIndex = 1; + // + // btnBack + // + this.btnBack.Location = new System.Drawing.Point(5, 5); + this.btnBack.Name = "btnBack"; + this.btnBack.Size = new System.Drawing.Size(60, 30); + this.btnBack.TabIndex = 0; + this.btnBack.Text = "后退"; + this.btnBack.UseVisualStyleBackColor = true; + this.btnBack.Click += new System.EventHandler(this.BtnBack_Click); + // + // btnForward + // + this.btnForward.Location = new System.Drawing.Point(70, 5); + this.btnForward.Name = "btnForward"; + this.btnForward.Size = new System.Drawing.Size(60, 30); + this.btnForward.TabIndex = 1; + this.btnForward.Text = "前进"; + this.btnForward.UseVisualStyleBackColor = true; + this.btnForward.Click += new System.EventHandler(this.BtnForward_Click); + // + // btnRefresh + // + this.btnRefresh.Location = new System.Drawing.Point(135, 5); + this.btnRefresh.Name = "btnRefresh"; + this.btnRefresh.Size = new System.Drawing.Size(60, 30); + this.btnRefresh.TabIndex = 2; + this.btnRefresh.Text = "刷新"; + this.btnRefresh.UseVisualStyleBackColor = true; + this.btnRefresh.Click += new System.EventHandler(this.BtnRefresh_Click); + // + // txtUrl + // + this.txtUrl.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.txtUrl.Location = new System.Drawing.Point(199, 9); + this.txtUrl.Name = "txtUrl"; + this.txtUrl.Size = new System.Drawing.Size(700, 21); + this.txtUrl.TabIndex = 3; + this.txtUrl.KeyDown += new System.Windows.Forms.KeyEventHandler(this.TxtUrl_KeyDown); + // + // btnGo + // + this.btnGo.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.btnGo.Location = new System.Drawing.Point(905, 5); + this.btnGo.Name = "btnGo"; + this.btnGo.Size = new System.Drawing.Size(60, 30); + this.btnGo.TabIndex = 4; + this.btnGo.Text = "转到"; + this.btnGo.UseVisualStyleBackColor = true; + this.btnGo.Click += new System.EventHandler(this.BtnGo_Click); + // + // Browser + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(1024, 768); + this.Controls.Add(this.webBrowser1); + this.Controls.Add(this.navPanel); + this.Name = "Browser"; + this.Text = "Cookie浏览器"; + this.Load += new System.EventHandler(this.Browser_Load); + this.navPanel.ResumeLayout(false); + this.navPanel.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.WebBrowser webBrowser1; + private System.Windows.Forms.FolderBrowserDialog folderBrowserDialog1; + } +} + diff --git a/FromBrowser/Browser.cs b/FromBrowser/Browser.cs new file mode 100644 index 0000000..e061788 --- /dev/null +++ b/FromBrowser/Browser.cs @@ -0,0 +1,474 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; +using System.Net; +using System.IO; + +namespace FormBrowser +{ + public partial class Browser : Form + { + private string currentCookies; + + public Browser() + { + InitializeComponent(); + } + + /// + /// 使用指定的URL和Cookie创建浏览器窗口 + /// + /// 要访问的网址 + /// Cookie字符串,格式为"name1=value1; name2=value2" + public Browser(string url, string cookies) : this() + { + this.currentCookies = cookies; + NavigateWithCookies(url, cookies); + } + + + + private void Browser_Load(object sender, EventArgs e) + { + // 窗体加载时的初始化操作 + + // 设置WebBrowser使用最新的IE版本 + SetBrowserFeatureControl(); + + // 设置Grafana特定配置 + ConfigureForGrafana(); + } + + /// + /// 配置浏览器以更好地支持Grafana + /// + private void ConfigureForGrafana() + { + // 设置WebBrowser的脚本错误抑制 + webBrowser1.ScriptErrorsSuppressed = true; + + // 设置额外的浏览器特性控制,以支持现代Web应用 + string appName = System.IO.Path.GetFileName(System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName); + + // 启用JavaScript + SetBrowserFeatureControlKey("FEATURE_BROWSER_EMULATION", appName, 11001); // IE11 Edge模式 + SetBrowserFeatureControlKey("FEATURE_AJAX_CONNECTIONEVENTS", appName, 1); + SetBrowserFeatureControlKey("FEATURE_ENABLE_CLIPCHILDREN_OPTIMIZATION", appName, 1); + SetBrowserFeatureControlKey("FEATURE_MANAGE_SCRIPT_CIRCULAR_REFS", appName, 1); + SetBrowserFeatureControlKey("FEATURE_DOMSTORAGE ", appName, 1); + SetBrowserFeatureControlKey("FEATURE_GPU_RENDERING ", appName, 1); + SetBrowserFeatureControlKey("FEATURE_WEBOC_DOCUMENT_ZOOM", appName, 1); + SetBrowserFeatureControlKey("FEATURE_NINPUT_LEGACYMODE", appName, 0); + } + + /// + /// 设置WebBrowser控件使用最新的IE版本 + /// + private void SetBrowserFeatureControl() + { + // 获取当前应用程序名称 + string appName = System.IO.Path.GetFileName(System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName); + + // 设置IE特性控制 + SetBrowserFeatureControlKey("FEATURE_BROWSER_EMULATION", appName, GetBrowserEmulationMode()); + } + + /// + /// 获取浏览器模拟模式值 + /// + /// IE版本对应的值 + private uint GetBrowserEmulationMode() + { + // 返回IE11的模拟模式值 (11001表示IE11 Edge模式) + return 11001; + } + + /// + /// 设置浏览器特性控制注册表项 + /// + /// 特性名称 + /// 应用程序名称 + /// 设置的值 + private void SetBrowserFeatureControlKey(string featureName, string appName, uint value) + { + using (Microsoft.Win32.RegistryKey key = Microsoft.Win32.Registry.CurrentUser.CreateSubKey( + @"Software\Microsoft\Internet Explorer\Main\FeatureControl\" + featureName, Microsoft.Win32.RegistryKeyPermissionCheck.ReadWriteSubTree)) + { + key.SetValue(appName, value, Microsoft.Win32.RegistryValueKind.DWord); + } + } + + /// + /// 使用Cookie导航到指定URL + /// + /// 要访问的网址 + /// Cookie字符串 + public void NavigateWithCookies(string url, string cookies) + { + if (string.IsNullOrEmpty(url)) + return; + + // 保存当前Cookie + this.currentCookies = cookies; + + // 设置地址栏文本 + txtUrl.Text = url; + + try + { + // 创建Cookie容器并添加Cookie + CookieContainer cookieContainer = new CookieContainer(); + + // 解析URL获取域名 + Uri uri = new Uri(url); + string domain = uri.Host; + + // 解析Cookie字符串并添加到容器 + if (!string.IsNullOrEmpty(cookies)) + { + string[] cookiePairs = cookies.Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries); + foreach (string cookiePair in cookiePairs) + { + string[] cookieNameValue = cookiePair.Trim().Split(new[] { '=' }, 2); + if (cookieNameValue.Length == 2) + { + string name = cookieNameValue[0].Trim(); + string value = cookieNameValue[1].Trim(); + Cookie cookie = new Cookie(name, value, "/", domain); + cookieContainer.Add(cookie); + } + } + } + + // 创建HTTP请求 + HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); + request.CookieContainer = cookieContainer; + request.Method = "GET"; + request.UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36 Edg/114.0.1823.67"; + + // 添加额外的HTTP头以模拟现代浏览器 + // 使用专用属性设置Accept标头,而不是Headers.Add + request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7"; + request.Headers.Add("Accept-Language", "zh-CN,zh;q=0.9,en;q=0.8"); + request.Headers.Add("Upgrade-Insecure-Requests", "1"); + request.Headers.Add("sec-ch-ua", "\"Not.A/Brand\";v=\"8\", \"Chromium\";v=\"114\", \"Microsoft Edge\";v=\"114\""); + request.Headers.Add("sec-ch-ua-mobile", "?0"); + request.Headers.Add("sec-ch-ua-platform", "\"Windows\""); + + // 特别处理Grafana请求 + if (uri.Host.Contains("grafana") || url.Contains("/grafana")) + { + // 确保请求包含正确的Referer头 + string referer = $"{uri.Scheme}://{uri.Host}"; + if (!string.IsNullOrEmpty(uri.PathAndQuery)) + { + // 如果URL包含子路径,确保Referer也包含 + string path = uri.AbsolutePath; + if (path.EndsWith("/")) + path = path.Substring(0, path.Length - 1); + + // 如果是子路径下的Grafana,添加到Referer + if (path.Contains("/")) + { + string subPath = path.Substring(0, path.LastIndexOf('/')); + referer += subPath; + } + } + request.Referer = referer; + + // 添加额外的Grafana相关头信息 + request.Headers.Add("X-Grafana-Org-Id", "1"); + } + + // 获取响应 + using (HttpWebResponse response = (HttpWebResponse)request.GetResponse()) + { + // 读取响应内容 + using (Stream stream = response.GetResponseStream()) + using (StreamReader reader = new StreamReader(stream)) + { + string html = reader.ReadToEnd(); + + // 处理Grafana的相对路径问题 + if (uri.Host.Contains("grafana") || url.Contains("/grafana")) + { + // 修复Grafana的相对路径引用 + string basePath = ""; + if (uri.AbsolutePath.Contains("/") && !uri.AbsolutePath.Equals("/")) + { + string path = uri.AbsolutePath; + if (path.EndsWith("/")) + path = path.Substring(0, path.Length - 1); + + if (path.Contains("/")) + basePath = path.Substring(0, path.LastIndexOf('/')); + } + + // 如果检测到Grafana加载失败的错误信息,尝试修复 + if (html.Contains("Grafana has failed to load its application files")) + { + // 在HTML中注入基础路径修复脚本 + html = html.Replace("", + $"\n" + + "\n" + + ""); + } + } + + // 使用WebBrowser控件加载HTML内容前设置兼容性头信息 + string compatHtml = "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + html + + "\n\n" + + ""; + + // 使用WebBrowser控件加载HTML内容 + webBrowser1.DocumentText = compatHtml; + + // 设置文档URL,使相对链接正常工作 + webBrowser1.Url = uri; + } + } + } + catch (Exception ex) + { + MessageBox.Show($"导航错误: {ex.Message}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + /// + /// 导航到指定URL + /// + /// 要访问的网址 + public void Navigate(string url) + { + if (string.IsNullOrEmpty(url)) + return; + + // 处理Grafana URL,确保包含正确的子路径 + url = NormalizeGrafanaUrl(url); + + // 如果有Cookie,使用Cookie导航 + if (!string.IsNullOrEmpty(currentCookies)) + { + NavigateWithCookies(url, currentCookies); + } + else + { + // 直接使用WebBrowser导航 + webBrowser1.Navigate(url); + txtUrl.Text = url; + } + } + + /// + /// 标准化Grafana URL,确保子路径正确 + /// + /// 原始URL + /// 标准化后的URL + private string NormalizeGrafanaUrl(string url) + { + try + { + // 检查是否是Grafana URL + if (url.Contains("grafana")) + { + Uri uri = new Uri(url); + + // 如果URL不包含子路径,可能需要添加 + if (uri.AbsolutePath.Equals("/") || string.IsNullOrEmpty(uri.AbsolutePath)) + { + // 检查URL中是否已经包含了查询参数 + string query = uri.Query; + string baseUrl = url; + + // 移除查询参数以便添加子路径 + if (!string.IsNullOrEmpty(query)) + { + baseUrl = url.Replace(query, ""); + } + + // 确保URL以/结尾,以便添加子路径 + if (!baseUrl.EndsWith("/")) + { + baseUrl += "/"; + } + + // 重新组合URL,确保包含查询参数 + return baseUrl + (string.IsNullOrEmpty(query) ? "" : query); + } + } + } + catch (Exception ex) + { + System.Diagnostics.Debug.WriteLine($"标准化Grafana URL时出错: {ex.Message}"); + } + + return url; + } + + #region 事件处理方法 + + private void BtnBack_Click(object sender, EventArgs e) + { + if (webBrowser1.CanGoBack) + webBrowser1.GoBack(); + } + + private void BtnForward_Click(object sender, EventArgs e) + { + if (webBrowser1.CanGoForward) + webBrowser1.GoForward(); + } + + private void BtnRefresh_Click(object sender, EventArgs e) + { + webBrowser1.Refresh(); + } + + private void BtnGo_Click(object sender, EventArgs e) + { + Navigate(txtUrl.Text); + } + + private void TxtUrl_KeyDown(object sender, KeyEventArgs e) + { + if (e.KeyCode == Keys.Enter) + { + Navigate(txtUrl.Text); + e.SuppressKeyPress = true; + e.Handled = true; + } + } + + private void WebBrowser_Navigated(object sender, WebBrowserNavigatedEventArgs e) + { + // 更新地址栏 + txtUrl.Text = webBrowser1.Url?.ToString() ?? string.Empty; + + // 更新导航按钮状态 + btnBack.Enabled = webBrowser1.CanGoBack; + btnForward.Enabled = webBrowser1.CanGoForward; + + // 设置文档模式为Edge模式 + SetDocumentMode(); + + // 如果是Grafana页面,应用特殊处理 + string url = webBrowser1.Url?.ToString() ?? string.Empty; + if (url.Contains("grafana")) + { + HandleGrafanaPage(); + } + } + + /// + /// 处理Grafana页面的特殊需求 + /// + private void HandleGrafanaPage() + { + if (webBrowser1.Document == null) return; + + try + { + // 检查是否有Grafana加载失败的错误信息 + HtmlElement body = webBrowser1.Document.Body; + if (body != null && body.InnerText.Contains("Grafana has failed to load its application files")) + { + // 获取当前URL信息 + Uri uri = webBrowser1.Url; + if (uri == null) return; + + // 确定基础路径 + string basePath = ""; + if (uri.AbsolutePath.Contains("/") && !uri.AbsolutePath.Equals("/")) + { + string path = uri.AbsolutePath; + if (path.EndsWith("/")) + path = path.Substring(0, path.Length - 1); + + if (path.Contains("/")) + basePath = path.Substring(0, path.LastIndexOf('/')); + } + + // 注入修复脚本 + HtmlElement head = webBrowser1.Document.GetElementsByTagName("head")[0]; + if (head != null) + { + // 添加base标签 + HtmlElement baseTag = webBrowser1.Document.CreateElement("base"); + baseTag.SetAttribute("href", $"{uri.Scheme}://{uri.Host}{basePath}/"); + head.AppendChild(baseTag); + + // 添加修复脚本 + HtmlElement script = webBrowser1.Document.CreateElement("script"); + script.SetAttribute("type", "text/javascript"); + script.InnerHtml = $@" + // 修复Grafana资源加载路径 + window.grafanaBootData = window.grafanaBootData || {{}}; + window.grafanaBootData.settings = window.grafanaBootData.settings || {{}}; + window.grafanaBootData.settings.appSubUrl = '{basePath}'; + "; + head.AppendChild(script); + + // 刷新页面以应用更改 + webBrowser1.Refresh(); + } + } + } + catch (Exception ex) + { + System.Diagnostics.Debug.WriteLine($"处理Grafana页面时出错: {ex.Message}"); + } + } + + /// + /// 设置WebBrowser文档模式为Edge模式 + /// + private void SetDocumentMode() + { + if (webBrowser1.Document != null) + { + try + { + // 尝试通过执行JavaScript来设置文档模式 + webBrowser1.Document.InvokeScript("execScript", new object[] + { + "document.documentMode=11", "JavaScript" + }); + + // 添加X-UA-Compatible元标记到文档头部 + dynamic head = webBrowser1.Document.GetElementsByTagName("head")[0]; + if (head != null) + { + dynamic meta = webBrowser1.Document.CreateElement("meta"); + meta.httpEquiv = "X-UA-Compatible"; + meta.content = "IE=edge"; + head.AppendChild(meta); + } + } + catch (Exception ex) + { + // 忽略可能的脚本错误 + System.Diagnostics.Debug.WriteLine($"设置文档模式时出错: {ex.Message}"); + } + } + } + + #endregion + } +} diff --git a/FromBrowser/Form1.resx b/FromBrowser/Browser.resx similarity index 100% rename from FromBrowser/Form1.resx rename to FromBrowser/Browser.resx diff --git a/FromBrowser/Form1.Designer.cs b/FromBrowser/Form1.Designer.cs deleted file mode 100644 index 6f1d038..0000000 --- a/FromBrowser/Form1.Designer.cs +++ /dev/null @@ -1,62 +0,0 @@ -namespace FromBrowser -{ - partial class Form1 - { - /// - /// 必需的设计器变量。 - /// - private System.ComponentModel.IContainer components = null; - - /// - /// 清理所有正在使用的资源。 - /// - /// 如果应释放托管资源,为 true;否则为 false。 - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows 窗体设计器生成的代码 - - /// - /// 设计器支持所需的方法 - 不要修改 - /// 使用代码编辑器修改此方法的内容。 - /// - private void InitializeComponent() - { - this.webBrowser1 = new System.Windows.Forms.WebBrowser(); - this.folderBrowserDialog1 = new System.Windows.Forms.FolderBrowserDialog(); - this.SuspendLayout(); - // - // webBrowser1 - // - this.webBrowser1.Dock = System.Windows.Forms.DockStyle.Fill; - this.webBrowser1.Location = new System.Drawing.Point(0, 0); - this.webBrowser1.MinimumSize = new System.Drawing.Size(20, 20); - this.webBrowser1.Name = "webBrowser1"; - this.webBrowser1.Size = new System.Drawing.Size(800, 450); - this.webBrowser1.TabIndex = 0; - // - // Form1 - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(800, 450); - this.Controls.Add(this.webBrowser1); - this.Name = "Form1"; - this.Text = "Form1"; - this.ResumeLayout(false); - - } - - #endregion - - private System.Windows.Forms.WebBrowser webBrowser1; - private System.Windows.Forms.FolderBrowserDialog folderBrowserDialog1; - } -} - diff --git a/FromBrowser/Form1.cs b/FromBrowser/Form1.cs deleted file mode 100644 index e140a23..0000000 --- a/FromBrowser/Form1.cs +++ /dev/null @@ -1,20 +0,0 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Data; -using System.Drawing; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using System.Windows.Forms; - -namespace FromBrowser -{ - public partial class Form1 : Form - { - public Form1() - { - InitializeComponent(); - } - } -} diff --git a/FromBrowser/FromBrowser.csproj b/FromBrowser/FormBrowser.csproj similarity index 93% rename from FromBrowser/FromBrowser.csproj rename to FromBrowser/FormBrowser.csproj index a8ae841..f95ac94 100644 --- a/FromBrowser/FromBrowser.csproj +++ b/FromBrowser/FormBrowser.csproj @@ -46,14 +46,17 @@ - + Form - - Form1.cs + + Browser.cs + + Browser.cs + ResXFileCodeGenerator Resources.Designer.cs diff --git a/FromBrowser/Program.cs b/FromBrowser/Program.cs index 205a323..78b1111 100644 --- a/FromBrowser/Program.cs +++ b/FromBrowser/Program.cs @@ -4,7 +4,7 @@ using System.Linq; using System.Threading.Tasks; using System.Windows.Forms; -namespace FromBrowser +namespace FormBrowser { internal static class Program { @@ -16,7 +16,12 @@ namespace FromBrowser { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); - Application.Run(new Form1()); + + string url = "https://git.54sxh.cn/"; // 你要访问的网址 + string cookies = "gitea_incredible=JDsNY0PEJl%3Afa03bc6bc0f51c767cc876031280f08adb7030e8bc643b9916dc10150fa16858"; + + // 启动带Cookie的浏览器 + Application.Run(new Browser(url, cookies)); } } }