如何解决通过 Tor 网络上传 .NET 中的图像文件
我正在使用 KnapCode.TorSharp 库尝试将图像上传到网站。我可以让我的代码在没有 Tor 的情况下工作,但是有了 Tor 我真的不知道出了什么问题。在下面的示例中,我收到了 403 响应(仅当我在端口 1337 上使用 privoxy 代理时)。那么如何配置 HttpUploadFile 函数来使用通过 TorSharp 库创建的代理?
using System;
using System.Collections.Specialized;
using System.IO;
using System.Net;
using System.Text;
using Knapcode.TorSharp;
using System.Net.Http;
namespace TorTest
{
class Program
{
static HttpClient m_ProxyClient = null;
static TorSharpProxy m_Proxy;
static void Main(string[] args)
{
TorConnect();
Console.Read();
}
private static async void TorConnect()
{
// configure
var settings = new TorSharpSettings
{
ZippedToolsDirectory = Path.Combine(Path.GetTempPath(),"TorZipped"),ExtractedToolsDirectory = Path.Combine(Path.GetTempPath(),"TorExtracted"),privoxySettings = { Port = 1337 },TorSettings =
{
SocksPort = 1338,ControlPort = 1339,ControlPassword = "MyPassword123123Pass*",},};
// download tools
await new TorSharpToolFetcher(settings,new HttpClient()).FetchAsync();
// execute
m_Proxy = new TorSharpProxy(settings);
var handler = new httpclienthandler
{
Proxy = new WebProxy(new Uri("http://localhost:" + settings.privoxySettings.Port))
};
await m_Proxy.ConfigureAndStartAsync();
System.Threading.Thread.Sleep(5000);
NameValueCollection nvc = new NameValueCollection();
nvc.Add("id","TTR");
nvc.Add("btn-submit-photo","Upload");
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine("Starting..");
Console.ForegroundColor = ConsoleColor.White;
string response = HttpUploadFile("https://prntscr.com/upload.PHP","test.png","image","image/png",nvc);
Console.Write(response);
}
public static string HttpUploadFile(string url,string file,string paramName,string contentType,NameValueCollection nvc)
{
string boundary = "---------------------------" + DateTime.Now.Ticks.ToString("x");
byte[] boundarybytes = Encoding.ASCII.GetBytes("\r\n--" + boundary + "\r\n");
HttpWebRequest wr = (HttpWebRequest)WebRequest.Create(url);
wr.ContentType = "multipart/form-data; boundary=" + boundary;
wr.Method = "POST";
wr.KeepAlive = true;
wr.Credentials = CredentialCache.DefaultCredentials;
wr.UserAgent = "Mozilla/5.0 (Windows NT x.y; Win64; x64; rv:10.0) Gecko/20100101 Firefox/10.0";
wr.Proxy = new WebProxy(new Uri("http://localhost:1337"));
Stream rs = wr.GetRequestStream();
string formdataTemplate = "Content-disposition: form-data; name=\"{0}\"\r\n\r\n{1}";
foreach (string key in nvc.Keys)
{
rs.Write(boundarybytes,boundarybytes.Length);
string formitem = string.Format(formdataTemplate,key,nvc[key]);
byte[] formitembytes = Encoding.UTF8.GetBytes(formitem);
rs.Write(formitembytes,formitembytes.Length);
}
rs.Write(boundarybytes,boundarybytes.Length);
string headerTemplate = "Content-disposition: form-data; name=\"{0}\"; filename=\"{1}\"\r\nContent-Type: {2}\r\n\r\n";
string header = string.Format(headerTemplate,paramName,file,contentType);
byte[] headerbytes = Encoding.UTF8.GetBytes(header);
rs.Write(headerbytes,headerbytes.Length);
FileStream fileStream = new FileStream(file,FileMode.Open,FileAccess.Read);
byte[] buffer = new byte[4096];
int bytesRead = 0;
while ((bytesRead = fileStream.Read(buffer,buffer.Length)) != 0)
{
rs.Write(buffer,bytesRead);
}
fileStream.Close();
byte[] trailer = Encoding.ASCII.GetBytes("\r\n--" + boundary + "--\r\n");
rs.Write(trailer,trailer.Length);
rs.Close();
WebResponse wresp = null;
try
{
wresp = wr.GetResponse();
Stream stream2 = wresp.GetResponseStream();
StreamReader reader2 = new StreamReader(stream2);
string response = reader2.ReadToEnd();
return response;
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
if (wresp != null)
{
wresp.Close();
wresp = null;
}
}
finally
{
wr = null;
}
return null;
}
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。