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>
相关推荐
qq_白羊座7 分钟前
UI自动化:seldom框架和Selenium
selenium·ui·自动化
泽众云测试9 分钟前
泽众TestOne推出快速测试用例设计,让自动化更快捷
自动化·测试用例
海绵波波10711 分钟前
【部署】ubuntu部署olmOCR
linux·运维·ubuntu
自由鬼13 分钟前
OpenAI定义的Agent新范式如何构建自动化系统
运维·ai·自动化·agent
自律的阿龙34 分钟前
Linux练级宝典->多线程
linux·运维·服务器
TravisBytes44 分钟前
在 VMware 中安装 Ubuntu 的超详细实战分享
linux·运维·ubuntu
Tipriest_1 小时前
打包当前Ubuntu镜像 制作Ubuntu togo系统
linux·运维·ubuntu·ubuntu to go
敲上瘾1 小时前
共享内存通信效率碾压管道?System V IPC原理与性能实测
linux·运维·服务器·c++·算法·信息与通信
小白学安全hhhh3 小时前
VPC4-通达oa-docker逃逸-shiro反序列化-hash传递-CrackMapExec喷射-历史ptt攻击-进程注入
运维·安全·网络安全·docker·容器·网络攻击模型·安全架构
酷熊代理3 小时前
软路由如何屏蔽国外IP?RouterOS保姆级实战教程(附自动化脚本)
运维·网络协议·tcp/ip·自动化·智能路由器·软路由·小猫pptp