在 C# 中使用 Tor 下载文件
Posted
技术标签:
【中文标题】在 C# 中使用 Tor 下载文件【英文标题】:Download file using Tor in C# 【发布时间】:2021-09-21 08:16:48 【问题描述】:我想使用 Tor 下载文件。我发现的大多数解决方案都需要安装并运行其他软件(例如 privoxy),但我不想让其他软件一直运行,即使我不使用我的程序。
所以我尝试了Tor.NET 库,但我无法使用 Tor 获取它。这个例子不应该返回我的 IP 地址,但它确实:
ClientCreateParams createParams = new ClientCreateParams(@"D:\tor.exe", 9051);
Client client = Client.Create(createParams);
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://www.icanhazip.com/");
request.Proxy = client.Proxy.WebProxy;
using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
var reader = new StreamReader(response.GetResponseStream());
Console.WriteLine(reader.ReadToEnd());
Console.WriteLine("Press enter to exit...");
Console.ReadLine();
已经有多个关于这个的 cmets,但不幸的是图书馆的作者不再活跃了。
也许你知道我做错了什么(是否需要更多配置?)或者有一个使用 tor 下载文件的替代方法的想法。
【问题讨论】:
你真的应该考虑使用 C# 以外的东西。像 python 这样的脚本语言有对 tor 友好的库。如果您想尝试让它在 C# 中工作,您可以使用一个简单的 httpwebrequest 库,但传入 127.0.0.1 和 socks5 和端口 9050 的代理参数(取决于您的本地 torrc 文件)。如果您查看here,那么问题中的一些代码应该可以让您继续前进。 【参考方案1】:您按照 Tor 项目手册,命令行 HTTPTunnelPort 找到here:首先您必须使用以下命令启动 HTTP 隧道
Tor.exe --HTTPTunnelPort 4711
它为您提供位于 127.0.0.1:4711 的 HTTP 隧道(另请参阅 here)。现在你可以连接到这个代理了:
WebProxy oWebProxy = new WebProxy (IPAddress.Loopback.ToString (), 4711);
WebClient oWebClient = new WebClient ();
oWebClient.Proxy = oWebProxy;
oWebClient.DownloadFile ("http://myUri", "myFilename");
在使用Tor.exe时请注意以下几点:
如果端口已被使用,Tor.exe 将无法提供代理。它甚至不一定会通知您此失败。 确保没有人欺骗您的程序 Tor.exe,以便 Tor 为您提供此代理。因此,Tor.exe 应该位于文件系统中的安全位置。 了解有关使用 Tor 的其他注意事项。至少,您可能需要检查您的代理与本地互联网连接的 IP 地址是否不同。
【讨论】:
请注意,至少对我而言,这仅适用于https
-URI,不适用于http
。 HTTP 请求导致 405 Method Not Allowed
错误。【参考方案2】:
最后我通过@Ogglas使用https://github.com/Ogglas/SocksWebProxy通过Tor下载了一个文件。
该项目有一个不工作的例子(你第一次启动它会无限等待Tor退出,但是当你再次启动程序时它可以在你第一次尝试时使用Tor进程startet),所以我改变了它.
我做了一个 Start() 方法来启动 Tor:
public async void Start(IProgress<int> progress)
torProcess = new Process();
torProcess.StartInfo.FileName = @"D:\...\tor.exe";
torProcess.StartInfo.Arguments = @"-f ""D:\...\torrc""";
torProcess.StartInfo.UseShellExecute = false;
torProcess.StartInfo.RedirectStandardOutput = true;
torProcess.StartInfo.CreateNoWindow = true;
torProcess.Start();
var reader = torProcess.StandardOutput;
while (true)
var line = await reader.ReadLineAsync();
if (line == null)
// EOF
Environment.Exit(0);
// Get loading status
foreach (Match m in Regex.Matches(line, @"Bootstrapped (\d+)%"))
progress.Report(Convert.ToInt32(m.Groups[1].Value));
if (line.Contains("100%: Done"))
// Tor loaded
break;
if (line.Contains("Is Tor already running?"))
// Tor already running
break;
proxy = new SocksWebProxy(new ProxyConfig(
//This is an internal http->socks proxy that runs in process
IPAddress.Parse("127.0.0.1"),
//This is the port your in process http->socks proxy will run on
12345,
//This could be an address to a local socks proxy (ex: Tor / Tor Browser, If Tor is running it will be on 127.0.0.1)
IPAddress.Parse("127.0.0.1"),
//This is the port that the socks proxy lives on (ex: Tor / Tor Browser, Tor is 9150)
9150,
//This Can be Socks4 or Socks5
ProxyConfig.SocksVersion.Five
));
progress.Report(100);
之后你可以使用类似这样的东西来下载东西:
public static string DownloadString(string url)
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Proxy = proxy;
using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
return new StreamReader(response.GetResponseStream()).ReadToEnd();
当您退出程序时,您还应该终止 Tor 进程。
【讨论】:
以上是关于在 C# 中使用 Tor 下载文件的主要内容,如果未能解决你的问题,请参考以下文章