微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

通过 Tor 网络上传 .NET 中的图像文件

如何解决通过 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 举报,一经查实,本站将立刻删除。