C# Exe + Web 自动化 (BitComet 绿灯 自动化配置、设置)

BitComet GreenLight,内网黄灯转绿灯 (HighID), 增加p2p连接率提速下载-CSDN博客

前两天写个这个,每次开机关机后要重来一遍很麻烦的索性写个自动化。

先还是按照上面的教程自己制作一遍,留下Luck 以及 路由器相关的 端口记录信息。

(因为自动化我没写创建的逻辑,只是写了更改端口号的逻辑,所以基础信息条目需要存在。)

基于更改信息,自动化主要逻辑如下

1、取得Luck 设定好的端口

2、复制到路由器相关端口映射页面保存

3、启动BT,设置新的端口映射数据

完整代码如下:

cs 复制代码
 public class NetworkManagerExt
 {
     private string HostPort { get; set; }
     private string RemotePort { get; set; }
     private const string BitCometPath = @"D:\Program Files\BitComet\BitComet.exe";
     private const string LuckyPath = @"D:\Lucky\lucky.exe";
     private const string RouterUrl = "http://192.168.0.1/";
     private const string RouterPassword = "你自己的密码";
     private const string LuckyUrl = "http://127.0.0.1:16601/#/login";
     private const string LuckyPassword = "666"; //luck 默认密码
     private const int DefaultTimeoutSeconds = 30;

     public void ConfigureNetwork()
     {
         StartLuckyAndConfigureRouter();
     }

     public void StartBitComet()
     {
         if (!string.IsNullOrEmpty(RemotePort))
         {
             ConfigureBitComet(RemotePort);
         }
         else
         {
             Console.WriteLine("Error: RemotePort not set. Cannot configure BitComet.");
         }
     }

     private Process GetOrStartProcess(string exePath)
     {
         string processName = System.IO.Path.GetFileNameWithoutExtension(exePath);
         Process[] processes = Process.GetProcessesByName(processName);
         return processes.Length > 0 ? processes[0] : Process.Start(exePath);
     }

     private void ConfigureBitComet(string port)
     {
         Process calc = Process.Start(BitCometPath);
         AutomationElement mainExe = null;

         // 等待BitComet窗口出现
         DateTime startTime = DateTime.Now;
         TimeSpan timeout = TimeSpan.FromSeconds(DefaultTimeoutSeconds);

         while (mainExe == null)
         {
             if (DateTime.Now - startTime > timeout)
             {
                 throw new TimeoutException("Timeout waiting for BitComet window to appear");
             }

             AutomationElementCollection elementCollection = AutomationElement.RootElement.FindAll(
                 TreeScope.Children,
                 new PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.Window)
             );

             foreach (AutomationElement item in elementCollection)
             {
                 if (item.Current.Name.Contains("BitComet", StringComparison.OrdinalIgnoreCase))
                 {
                     mainExe = item;
                     break;
                 }
             }

             if (mainExe == null)
             {
                 System.Threading.Thread.Sleep(500); // 短暂等待后重试
             }
         }

         WindowPattern windowPattern = (WindowPattern)mainExe.GetCurrentPattern(WindowPattern.Pattern);
         windowPattern.SetWindowVisualState(WindowVisualState.Normal);

         System.Windows.Forms.SendKeys.SendWait("^p");
         bool setOperated = false;
         startTime = DateTime.Now;

         while (!setOperated)
         {
             if (DateTime.Now - startTime > timeout)
             {
                 throw new TimeoutException("Timeout waiting for BitComet settings dialog");
             }

             var tempWindow = mainExe.FindFirst(
                 TreeScope.Children,
                 new PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.Window)
             );

             if (tempWindow != null)
             {
                 var tempPane = tempWindow.FindFirst(
                     TreeScope.Subtree,
                     new PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.Edit)
                 );

                 var onButtonPane = tempWindow.FindFirst(
                     TreeScope.Children,
                     new PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.Button)
                 );

                 if (tempPane != null)
                 {
                     ValuePattern valuePattern = (ValuePattern)tempPane.GetCurrentPattern(ValuePattern.Pattern);
                     valuePattern.SetValue(port);
                     setOperated = true;

                     InvokePattern invokePattern = (InvokePattern)onButtonPane.GetCurrentPattern(InvokePattern.Pattern);
                     invokePattern.Invoke();
                 }
             }

             if (!setOperated)
             {
                 System.Threading.Thread.Sleep(500); // 短暂等待后重试
             }
         }
     }

     private void StartLuckyAndConfigureRouter()
     {
         Process calc = GetOrStartProcess(LuckyPath);
         AutomationElement mainExe = null;

         // 等待Lucky窗口出现
         DateTime startTime = DateTime.Now;
         TimeSpan timeout = TimeSpan.FromSeconds(DefaultTimeoutSeconds);

         while (mainExe == null)
         {
             if (DateTime.Now - startTime > timeout)
             {
                 throw new TimeoutException("Timeout waiting for Lucky window to appear");
             }

             var element = AutomationElement.RootElement.FindFirst(
                 TreeScope.Subtree,
                 new PropertyCondition(AutomationElement.NameProperty, "万吉")
             );

             if (element != null)
             {
                 mainExe = element;
             }
             else
             {
                 System.Threading.Thread.Sleep(500); // 短暂等待后重试
             }
         }

         using (IWebDriver driver = new EdgeDriver())
         {
             // 设置隐式等待,适用于所有元素查找
             driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(10);

             // 创建显式等待对象
             WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(DefaultTimeoutSeconds));

             // 登录Lucky
             driver.Navigate().GoToUrl(LuckyUrl);

             // 等待输入框出现并输入密码
             var inputElements = wait.Until(d => d.FindElements(By.CssSelector("input[placeholder='默认666']")));
             foreach (var item in inputElements)
             {
                 item.Clear();
                 item.SendKeys(LuckyPassword);
             }

             // 等待登录按钮出现并点击
             IWebElement loginButton = wait.Until(d => {
                 var button = d.FindElement(By.CssSelector("button.el-button.el-button--primary.is-round"));
                 return button.Text == "登录" ? button : null;
             });
             loginButton.Click();

             // 获取端口信息
             driver.Navigate().GoToUrl("http://127.0.0.1:16601/#/stun");

             // 等待第一个IP端口信息出现
             IWebElement firstIpSpan = wait.Until(d => d.FindElement(By.XPath(
                 "/html/body/div[1]/div/section/section/section/main/div/div/div[1]/div/div[1]/div[1]/div[1]/div/div/div/div/table/tbody/tr[2]/td[2]/span[1]/span")));

             // 等待第二个IP端口信息出现
             IWebElement secondIpSpan = wait.Until(d => d.FindElement(By.XPath(
                 "/html/body/div[1]/div/section/section/section/main/div/div/div[1]/div/div[1]/div[1]/div[1]/div/div/div/div/table/tbody/tr[2]/td[2]/span[3]/span")));

             string firstIpPort = firstIpSpan.Text;
             string secondIpPort = secondIpSpan.Text;

             if (!string.IsNullOrEmpty(firstIpPort) && !string.IsNullOrEmpty(secondIpPort))
             {
                 HostPort = firstIpPort.Split(':')[1];
                 RemotePort = secondIpPort.Split(':')[1];

                 // 配置路由器
                 ConfigureRouter(driver, wait);
             }
         }
     }

     private void ConfigureRouter(IWebDriver driver, WebDriverWait wait)
     {
         driver.Navigate().GoToUrl(RouterUrl);

         // 等待密码输入框出现
         IWebElement routerPwd = wait.Until(d => d.FindElement(By.XPath("/html/body/div[6]/div[2]/ul/li[2]/ul/li[1]/input")));
         routerPwd.Clear();
         routerPwd.SendKeys(RouterPassword);

         // 等待登录按钮出现并点击
         IWebElement loginButton = wait.Until(d => d.FindElement(By.XPath("/html/body/div[6]/div[2]/ul/li[3]/input")));
         loginButton.Click();

         // 等待功能1按钮出现并点击
         IWebElement func1 = wait.Until(d => d.FindElement(By.XPath("/html/body/div[3]/div[2]/div[2]/ul/li[3]/div/i[2]")));
         func1.Click();

         // 等待功能2按钮出现并点击
         IWebElement func2 = wait.Until(d => d.FindElement(By.XPath("/html/body/div[3]/div[2]/div[1]/div[3]/div[2]/div[1]/div/div[2]/div[1]/div[8]/div/div/input[3]")));
         func2.Click();

         // 等待功能3按钮出现并点击
         IWebElement func3 = wait.Until(d => d.FindElement(By.XPath("/html/body/div[3]/div[2]/div[1]/div[3]/div[2]/div[1]/div[2]/div/div[3]/table/tbody/tr[2]/td[7]/i")));
         func3.Click();

         // 设置外部端口
         IWebElement outport = wait.Until(d => d.FindElement(By.XPath("/html/body/div[3]/div[2]/div[1]/div[3]/div[2]/div[1]/div[2]/div/div[3]/table/tbody/tr[2]/td[3]/input")));
         outport.Clear();
         outport.SendKeys(HostPort);

         // 设置内部端口
         IWebElement selfport = wait.Until(d => d.FindElement(By.XPath("/html/body/div[3]/div[2]/div[1]/div[3]/div[2]/div[1]/div[2]/div/div[3]/table/tbody/tr[2]/td[4]/input")));
         selfport.Clear();
         selfport.SendKeys(RemotePort);

         // 保存路由器设置
         IWebElement saveButton = wait.Until(d => d.FindElement(By.XPath("/html/body/div[3]/div[2]/div[1]/div[3]/div[2]/div[1]/div[2]/div/div[3]/table/tbody/tr[2]/td[7]/input[1]")));
         saveButton.Click();
     }
 }

路由器 Web 部分(ConfigureRouter()方法),需要自行Web 页面 元素 XPath 取得慢慢调整,我的路由器是 TPLink ,TL-WDR8500,配置界面大致如下:

调用代码

cs 复制代码
   static void Main(string[] args)
   {
       var networkManager = new NetworkManagerExt();
       networkManager.ConfigureNetwork();
       networkManager.StartBitComet();
   }

这样 每次开机执行一下这个exe,保障BT 是绿灯,前面配置设置那些步骤全自动化。

需要的包和引用如下:(基于 .net 9.0 编译通过,测试通过)

XML 复制代码
<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net9.0</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
    <ApplicationManifest>app.manifest</ApplicationManifest>
  </PropertyGroup>
	<ItemGroup>
		<FrameworkReference Include="Microsoft.WindowsDesktop.App" />
		<PackageReference Include="Selenium.WebDriver" Version="4.29.0" />
	</ItemGroup>
</Project>
相关推荐
乘云数字DATABUFF3 天前
5分钟部署开源APM Databuff:OpenTelemetry全链路追踪入门实战
运维·后端
荣--5 天前
一键部署不是为了省时间 —— 它是把"买来的 PaaS"变成"自己的平台"的拐点
运维·zabbix·工程化·一键部署·平台化·边界设计
江华森5 天前
动手实战学 Docker — 从零到集群编排完全指南
运维
Avan_菜菜6 天前
FRP 内网穿透完整实战:从 HTTP 映射到 HTTPS 自签代理
运维·nginx·https
SelectDB7 天前
Litefuse 开源并推出单进程轻量模式,25 秒就能跑起来的 Agent 可观测与评估平台
运维·后端·自动化运维
XIAOHEZIcode8 天前
Linux系统鼠标偏移常见原因以及修复方案
linux·运维·游戏
用户0328472220709 天前
如何搭建本地yum源(上)
运维
大树8812 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠12 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质12 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务