C# Selenium - 无法启动 Tor

C# Selenium - Failed to Start Tor

我正在尝试使用以下代码在 C# 中通过 Selenium 启动 Tor 浏览器:

using OpenQA.Selenium.Firefox;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace AutomatorApp
{
  public class BrowserAutomator
  {
     public void Automate()
     {

        String torPath = "D:\Tor Browser\Browser\firefox.exe";
        String profilePath = "D:\Tor Browser\Browser\TorBrowser\Data\Browser\profile.default\";

        FirefoxProfile profile = new FirefoxProfile(profilePath);
        profile.SetPreference("network.proxy.type", 1);
        profile.SetPreference("network.proxy.socks", "127.0.0.1");
        profile.SetPreference("network.proxy.socks_port", 9153);
        profile.SetPreference("network.proxy.socks_remote_dns", false);

        FirefoxDriverService firefoxDriverService = FirefoxDriverService.CreateDefaultService("D:\geckodriver-v0.26.0-win64", "geckodriver.exe");
        firefoxDriverService.FirefoxBinaryPath = torPath;

        var firefoxOptions = new FirefoxOptions
        {
            Profile = profile,
            LogLevel = FirefoxDriverLogLevel.Trace
        };

        FirefoxDriver driver = new FirefoxDriver(firefoxDriverService, firefoxOptions);
      }
   }
}

但是,这会显示错误“Tor 启动失败”,异常仅包含“权限被拒绝”。我尝试以管理员模式启动应用程序并确保所有用户都可以访问该文件夹,但这并没有解决问题。

有趣的是,当我尝试使用相同的设置启动 Firefox 浏览器时,它运行良好。

非常感谢任何帮助。

Update - Solved: 更新到最新的Tor版本(9.5.1)后最终工作代码:

            FirefoxProfile profile = new FirefoxProfile(profilePath);
            profile.SetPreference("network.proxy.type", 1);
            profile.SetPreference("network.proxy.socks", "127.0.0.1");
            profile.SetPreference("network.proxy.socks_port", 9153);
            profile.SetPreference("network.proxy.socks_remote_dns", false);

            FirefoxDriverService firefoxDriverService = FirefoxDriverService.CreateDefaultService(geckoDriverDirectory);
            firefoxDriverService.FirefoxBinaryPath = torPath;
            firefoxDriverService.BrowserCommunicationPort = 2828;
            var firefoxOptions = new FirefoxOptions
            {
                Profile = null,
                LogLevel = FirefoxDriverLogLevel.Trace
            };
            firefoxOptions.AddArguments("-profile", profilePath);
            FirefoxDriver driver = new FirefoxDriver(firefoxDriverService, firefoxOptions);
            driver.Navigate().GoToUrl("https://www.google.com");

重要提示:

需要在 about:config 中更改以下 TOR 配置:

据我记得几年前的尝试,当您设置“Profile”选项时,带有 WebDriver 的 TOR 不起作用。普通的 Firefox 能用,但 TOR 根本不能用。

如果在此之后出现超时错误,请确保 marionetteabout:config 上启用。如果它已经启用,请在启动时关注 TOR 的情况。比如实际的 firefox 浏览器没有加载,卡在连接启动器等,或者浏览器启动时有一个消息框等等......还要确保没有其他 firefox.exegeckodriver.exe或者 tor.exe 在背景上是 运行。如果多个可执行文件未配置为侦听不同的端口号,则可能会导致问题。

    Environment.SetEnvironmentVariable("webdriver.gecko.driver", "C:\TorBrowser\Browser\geckodriver.exe");
    var gekcoService = FirefoxDriverService.CreateDefaultService("C:\TorBrowser\Browser", "geckodriver.exe");
    var gekcoService.FirefoxBinaryPath = "C:\TorBrowser\Browser\firefox.exe";

    // marionette port that browser listens to. I had it set to a custom port on about:config
    var gekcoService.BrowserCommunicationPort = 50111; 

    // also had given a custom port for geckodriver listen port
    var gekcoService.Port = 9881; 
    var gekcoService.Host = 127.0.0.1;
    var gekcoService.HostName = 127.0.0.1;
    var gekcoService.Start();
    
    var ffOptions = new FirefoxOptions
    {
        AcceptInsecureCertificates = true,
        BrowserExecutableLocation = "C:\TorBrowser\Browser\firefox.exe",
        Profile = null, 
        UnhandledPromptBehavior = UnhandledPromptBehavior.Dismiss
    };
    
    ffOptions.AddArguments("-profile", "C:\TorBrowser\Browser\TorBrowser\Data\Browser\profile.default");
    ffOptions.LogLevel = FirefoxDriverLogLevel.Info;
    ffOptions.PageLoadStrategy = PageLoadStrategy.Eager;
    var ffDriver = new FirefoxDriver(gekcoService, ffOptions);
    ffDriver.Manage().Timeouts().PageLoad = TimeSpan.FromSeconds(10);
    ffDriver.Manage().Timeouts().AsynchronousJavaScript = TimeSpan.FromSeconds(10);
    ffDriver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(30);

我觉得你的代码块很完美。

然而,打开使用默认 Firefox v68.9.0esr 浏览器 9.5 似乎存在问题.

You can find a detailed discussion in How to initiate a Tor Browser 9.5 which uses the default Firefox to 68.9.0esr using GeckoDriver and Selenium through Python


解决方案

解决方案是安装并使用以下任一浏览器:

  • Firefox v77.0.1
  • Firefox Nightly v79.0a1

如果您使用上述浏览器,您需要:

  • Firefox v77.0.1:

    String torPath = "C:\Program Files\Mozilla Firefox\firefox.exe";
    
  • Firefox Nightly v79.0a1

    String torPath = "C:\Program Files\Firefox Nightly\firefox.exe";