当前位置: 首页 > news >正文

GrassWebProxy

GrassWebProxy第一版:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Sockets;
using System.Net;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.IO;
using Newtonsoft.Json;
using System.Net.Http;
using System.Runtime.InteropServices.ComTypes;namespace GrassWebProxy
{public class Ticket{public ulong TicketNo { get; set; }public string BeginDateTime {  get; set; }public string EndDateTime { get; set; }}public class GP{public static bool CheckFlag(ref byte[] msg){//"G" 71 0x47//"P" 80 0x50if (msg[0]==0x47 && msg[1]==0x50){Console.WriteLine("CheckFlag OK");return true;}return false;}static public Ticket ReadConfig(string cfg = "Ticket1.json"){// 读取文件内容  string jsonContent = File.ReadAllText(cfg);// 反序列化JSON字符串到对象  Ticket ticket = JsonConvert.DeserializeObject<Ticket>(jsonContent);// 输出结果  Console.WriteLine($"{ticket.TicketNo}\r\n{ticket.BeginDateTime}---{ticket.EndDateTime}");return ticket;}static public bool CheckTicket(ref byte[] msg, Ticket counterfoil){ulong ticket = (ulong)((msg[2]<< 56) | (msg[3] << 48) | (msg[4] << 40)| (msg[5] << 32) | (msg[6] << 24) | (msg[7] <<16)|(msg[8] <<8)|msg[9]);Console.WriteLine(ticket.ToString("X"));if(counterfoil.TicketNo==ticket){return true;}return false;}}class TcpServer{private TcpListener tcpListener;private Thread listenThread;public TcpServer(string ipAddress, int port){this.tcpListener = new TcpListener(IPAddress.Parse(ipAddress), port);this.listenThread = new Thread(new ThreadStart(ListenForClients));this.listenThread.Start();}private void ListenForClients(){this.tcpListener.Start();while (true){// 阻塞直到客户端连接  TcpClient client = this.tcpListener.AcceptTcpClient();// 创建一个新的线程来处理客户端通信  Thread clientThread = new Thread(new ParameterizedThreadStart(HandleClientComm));clientThread.Start(client);}}/// <summary>/// 注意接受缓存只有4096字节。/// </summary>/// <param name="client"></param>private async void HandleClientComm(object client){TcpClient tcpClient = (TcpClient)client;NetworkStream clientStream = tcpClient.GetStream();//GuestIP.RecordIpToDatabase(tcpClient);byte[] message = new byte[8192];int bytesRead;while (true){bytesRead = 0;try{// 阻塞直到客户端发送数据  bytesRead = clientStream.Read(message, 0, message.Length);if (bytesRead == 0){// 客户端关闭了连接  break;}Console.WriteLine($"Read Bytes:{bytesRead}");}catch{// 客户端断开了连接  break;}try{//Checkif (GP.CheckFlag(ref message) == true && bytesRead >= 10){Console.WriteLine("GrassWebProxy应用来访");//Check Ticketif(GP.CheckTicket(ref message,GP.ReadConfig("Ticket1.json"))==true){Console.WriteLine("检票完成");var data = new string(Encoding.UTF8.GetChars(message, 10, bytesRead-10));Console.WriteLine(data);using (var httpClient = new HttpClient()){// 注意:这里需要处理完整的HTTP请求,包括头部和正文  // 这里仅作为示例,我们实际上并没有发送整个请求  var response = await httpClient.GetAsync(data);var responseContent = await response.Content.ReadAsStringAsync();Console.WriteLine(responseContent);// 将响应写回客户端  var responseBytes = Encoding.UTF8.GetBytes(responseContent);await clientStream.WriteAsync(responseBytes, 0, responseBytes.Length);Console.WriteLine("Send {0} Bytes.", responseBytes.Length);}}goto End;}}catch (Exception ex){Console.WriteLine($"{ex.Message}");}// 将接收到的数据回显给客户端  ASCIIEncoding encoder = new ASCIIEncoding();string messageString = encoder.GetString(message, 0, bytesRead);Console.WriteLine("Received from client: " + messageString);byte[] buffer = encoder.GetBytes(messageString);// 发送回显数据给客户端  clientStream.Write(buffer, 0, buffer.Length);clientStream.Flush();End://    //查看来访IP信息//    GuestIP.ReadLastGuestIP();;}tcpClient.Close();}}internal class Program{static void Main(string[] args){const int port = 8422;TcpServer server = new TcpServer("127.0.0.1", port);Console.WriteLine($"TCP Server listening on port {port}...");// 阻止主线程结束,直到用户手动停止  Console.ReadLine();}}
}
Ticket1.json 文件内容:
{"TicketNo":1,"BeginDateTime": "20240728T20:30:30","EndDateTime": "20240731T20:30:30"
}

GrassWebProxyV2:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using Newtonsoft.Json;
using System.Net;
using System.Net.Http;namespace GrassWebProxyV2
{public class Ticket{public ulong TicketNo { get; set; }public string BeginDateTime { get; set; }public string EndDateTime { get; set; }}public class GP{public static bool CheckFlag(ref byte[] msg){//"G" 71 0x47//"P" 80 0x50if (msg[0] == 0x47 && msg[1] == 0x50){Console.WriteLine("CheckFlag OK");return true;}return false;}static public Ticket ReadConfig(string cfg = "Ticket1.json"){// 读取文件内容  string jsonContent = File.ReadAllText(cfg);// 反序列化JSON字符串到对象  Ticket ticket = JsonConvert.DeserializeObject<Ticket>(jsonContent);// 输出结果  Console.WriteLine($"{ticket.TicketNo}\r\n{ticket.BeginDateTime}---{ticket.EndDateTime}");return ticket;}static public bool CheckTicket(ref byte[] msg, Ticket counterfoil){/*ulong ticket = (ulong)((msg[2] << 56) | (msg[3] << 48) | (msg[4] << 40)| (msg[5] << 32) | (msg[6] << 24) | (msg[7] << 16) | (msg[8] << 8) | msg[9]);*/ulong ticket = BitConverter.ToUInt64(msg, 2); // 从索引2开始读取8个字节//Console.WriteLine(ticket.ToString("X"));if (counterfoil.TicketNo == ticket){return true;}return false;}static public bool CheckFlagAdTicket(ref byte[] msg, Ticket counterfoil){//"G" 71 0x47//"P" 80 0x50ulong ticket = BitConverter.ToUInt64(msg, 2); // 从索引2开始读取8个字节if (msg[0] == 0x47 && msg[1] == 0x50 && counterfoil.TicketNo == ticket){return true;}return false;}}class SimpleWebProxy{private HttpListener listener;public SimpleWebProxy(int port){// 初始化HttpListener,监听所有传入HTTP请求  listener = new HttpListener();listener.Prefixes.Add($"http://+:{port}/");listener.Start();Console.WriteLine($"Grass Web proxy listening on port {port}...");// 开始异步处理请求  Task.Run(() => ListenForRequests());}private async Task ListenForRequests(){while (true){// 等待并获取下一个客户端连接  HttpListenerContext context = await listener.GetContextAsync();HttpListenerRequest request = context.Request;假设Ticket存储在HTTP头中,名为"X-Proxy-Ticket"  string ticketHeader = request.Headers["X-Proxy-Ticket"];// 假设您有一个方法CheckTicket(string ticket)来验证ticket  // return CheckTicket(ticketHeader); // 这里应该是您的验证逻辑  // 为了示例,我们直接返回true或false(这里总是返回false以模拟验证失败)// 使用UTF8编码将字符串转换为byte[]  byte[] ticketBytes = Encoding.UTF8.GetBytes(ticketHeader);var counterfoil = GP.ReadConfig("Ticket1.json");if(GP.CheckFlagAdTicket(ref ticketBytes, counterfoil)==true){// 获取请求的URL(不包含查询字符串)  string url = request.Url.Scheme + "://" + request.Url.Host + ":" + request.Url.Port + request.Url.AbsolutePath;Console.WriteLine(url);// 创建一个WebRequest到目标URL  HttpWebRequest proxyRequest = (HttpWebRequest)WebRequest.Create(url);// 复制请求方法(如GET、POST)  proxyRequest.Method = request.HttpMethod;// 如果需要,可以添加更多的请求头(这里未添加)  // 发送请求到目标服务器并获取响应  using (HttpWebResponse proxyResponse = (HttpWebResponse)await proxyRequest.GetResponseAsync()){// 将响应转发给客户端  using (Stream responseStream = proxyResponse.GetResponseStream())using (Stream outputStream = context.Response.OutputStream){// 设置响应的HTTP状态码和状态描述  context.Response.StatusCode = (int)proxyResponse.StatusCode;context.Response.StatusDescription = proxyResponse.StatusDescription;// 遍历所有响应头并复制到响应中  foreach (string headerKey in proxyResponse.Headers.AllKeys){if (headerKey != "Transfer-Encoding" &&!(context.Response.Headers.AllKeys.Contains(headerKey))){context.Response.AddHeader(headerKey, proxyResponse.Headers[headerKey]);}}// 读取响应流并将其写入客户端的输出流  byte[] buffer = new byte[4096];int bytesRead;while ((bytesRead = await responseStream.ReadAsync(buffer, 0, buffer.Length)) > 0){await outputStream.WriteAsync(buffer, 0, bytesRead);}}}}else{// 票据验证失败,可以发送错误响应给客户端  context.Response.StatusCode = (int)HttpStatusCode.Unauthorized;context.Response.Close();}}}}internal class Program{static void Main(string[] args){new SimpleWebProxy(8422);// 防止主线程退出  Console.WriteLine("Press Enter to exit...");Console.ReadLine();}}
}

GrassWebProxyV4:

// See https://aka.ms/new-console-template for more information
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Sockets;
using System.Net;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.IO;
using System.Net.Http;
using System.Runtime.InteropServices.ComTypes;
using System.IO.Compression;
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
using System.Runtime.Serialization;namespace GrassWebProxy
{public class CustomDateTimeConverter : IsoDateTimeConverter{public CustomDateTimeConverter(){DateTimeFormat = "yyyyMMdd'T'HH:mm:ss";}}public class Ticket{public ulong TicketNo { get; set; }[JsonConverter(typeof(CustomDateTimeConverter))]public DateTime BeginDateTime { get; set; }[JsonConverter(typeof(CustomDateTimeConverter))]public DateTime EndDateTime { get; set; }}public class GP{public static bool CheckFlag(ref byte[] msg){//"G" 71 0x47//"P" 80 0x50if (msg[0] == 0x47 && msg[1] == 0x50){Console.WriteLine("CheckFlag OK");return true;}return false;}static public Ticket ReadConfig(string cfg = "Ticket1.json"){// 读取文件内容  string jsonContent = File.ReadAllText(cfg);// 反序列化JSON字符串到对象  Ticket ticket = JsonConvert.DeserializeObject<Ticket>(jsonContent);// 输出结果  Console.WriteLine($"{ticket.TicketNo}\r\n{ticket.BeginDateTime}---{ticket.EndDateTime}");return ticket;}static public bool CheckTicket(ref byte[] msg, Ticket counterfoil){ulong ticket = (ulong)((msg[2] << 56) | (msg[3] << 48) | (msg[4] << 40)| (msg[5] << 32) | (msg[6] << 24) | (msg[7] << 16) | (msg[8] << 8) | msg[9]);Console.WriteLine(ticket.ToString("X"));if (counterfoil.TicketNo == ticket){return true;}return false;}public static byte[] Compress(byte[] input){using (var memoryStream = new MemoryStream()){using (var gzipStream = new GZipStream(memoryStream, CompressionMode.Compress, true)){gzipStream.Write(input, 0, input.Length);}// 确保所有数据都被写入并压缩  return memoryStream.ToArray();}}public static byte[] DecompressGzip(byte[] gzip, int prebytes = 4096){using (var ms = new MemoryStream(gzip)){using (var gzipStream = new GZipStream(ms, CompressionMode.Decompress)){var buffer = new byte[prebytes];using (var memoryStreamOut = new MemoryStream()){int read;while ((read = gzipStream.Read(buffer, 0, buffer.Length)) > 0){memoryStreamOut.Write(buffer, 0, read);}return memoryStreamOut.ToArray();}}}}}class TcpServer{private TcpListener tcpListener;private Thread listenThread;public TcpServer(string ipAddress, int port){this.tcpListener = new TcpListener(IPAddress.Parse(ipAddress), port);this.listenThread = new Thread(new ThreadStart(ListenForClients));this.listenThread.Start();}private void ListenForClients(){this.tcpListener.Start();while (true){// 阻塞直到客户端连接  TcpClient client = this.tcpListener.AcceptTcpClient();// 创建一个新的线程来处理客户端通信  Thread clientThread = new Thread(new ParameterizedThreadStart(HandleClientComm));clientThread.Start(client);}}/// <summary>/// 注意接受缓存只有4096字节。/// </summary>/// <param name="client"></param>private async void HandleClientComm(object client){TcpClient tcpClient = (TcpClient)client;NetworkStream clientStream = tcpClient.GetStream();//GuestIP.RecordIpToDatabase(tcpClient);byte[] message = new byte[8192];int bytesRead;while (true){bytesRead = 0;try{// 阻塞直到客户端发送数据  bytesRead = clientStream.Read(message, 0, message.Length);if (bytesRead == 0){// 客户端关闭了连接  break;}Console.WriteLine($"Read Bytes:{bytesRead}");}catch{// 客户端断开了连接  break;}try{//Checkif (GP.CheckFlag(ref message) == true && bytesRead >= 10){Console.WriteLine("GrassWebProxy应用来访");//Check Ticketif (GP.CheckTicket(ref message, GP.ReadConfig("Ticket1.json")) == true){Console.WriteLine("检票完成");var data = new string(Encoding.UTF8.GetChars(message, 10, bytesRead - 10));Console.WriteLine(data);using (var httpClient = new HttpClient()){// 注意:这里需要处理完整的HTTP请求,包括头部和正文  // 这里仅作为示例,我们实际上并没有发送整个请求  var response = await httpClient.GetAsync(data);var responseContent = await response.Content.ReadAsStringAsync();Console.WriteLine(responseContent);// 将响应写回客户端  //var responseBytes = Encoding.UTF8.GetBytes(responseContent);var rsbuf = await response.Content.ReadAsByteArrayAsync();Console.WriteLine(rsbuf.Length);var gzipbuf = GP.Compress(rsbuf);Console.WriteLine(gzipbuf.Length);await clientStream.WriteAsync(gzipbuf, 0, gzipbuf.Length);Console.WriteLine("Send {0} Bytes.", gzipbuf.Length);clientStream.Flush();Console.WriteLine("END");tcpClient.Close();}}goto End;}}catch (Exception ex){Console.WriteLine($"{ex.Message}");}// 将接收到的数据回显给客户端  ASCIIEncoding encoder = new ASCIIEncoding();string messageString = encoder.GetString(message, 0, bytesRead);Console.WriteLine("Received from client: " + messageString);byte[] buffer = encoder.GetBytes(messageString);// 发送回显数据给客户端  clientStream.Write(buffer, 0, buffer.Length);clientStream.Flush();Console.WriteLine("END");tcpClient.Close();End://    //查看来访IP信息//    GuestIP.ReadLastGuestIP();;}}}internal class Program{static void Main(string[] args){const int port = 8422;TcpServer server = new TcpServer("127.0.0.1", port);Console.WriteLine($"TCP Server listening on port {port}...");// 阻止主线程结束,直到用户手动停止  Console.ReadLine();}}
}

GrassWebProxyClient:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using Newtonsoft.Json;
using System.Net.Http;
using System.Net;
using System.Net.Sockets;namespace GrassWebProxyClient
{public class IPport{public string IP { get; set; }public int Port { get; set; }}public class Ticket{public ulong TicketNo { get; set; }public string BeginDateTime { get; set; }public string EndDateTime { get; set; }}internal class Program{static void Main(string[] args){try{string jsonFilePath = "ipport.json"; // 替换为你的JSON文件路径  // 读取文件内容  string jsonContent = File.ReadAllText(jsonFilePath);// 反序列化JSON字符串到对象  IPport ipaddr = JsonConvert.DeserializeObject<IPport>(jsonContent);// 输出结果  Console.WriteLine($"{ipaddr.IP}:{ipaddr.Port}");// 创建一个TcpClient实例并连接到服务器  TcpClient client = new TcpClient($"{ipaddr.IP}", ipaddr.Port);// 获取一个NetworkStream对象以进行读写  NetworkStream stream = client.GetStream();jsonFilePath = "Ticket1.json";// 读取文件内容  jsonContent = File.ReadAllText(jsonFilePath);// 反序列化JSON字符串到对象  Ticket ticket = JsonConvert.DeserializeObject<Ticket>(jsonContent);// 输出结果  Console.WriteLine($"{ticket.TicketNo}\r\n{ticket.BeginDateTime}---{ticket.EndDateTime}");//组装byte[] data = { 0x47, 0x50, 0x01, 0xF2, 0x00, 0x00, 0x00, 0x01,0x01,0x01 };for (int i=2,j=7;i<data.Length;i++,j--){data[i] = (byte)(ticket.TicketNo>>(j*8));//Console.WriteLine(data[i]);}// 发送消息到服务器  stream.Write(data, 0, data.Length);// 发送消息到服务器// 将消息转换为字节数组  string message = "http://www.cjors.cn/";byte[] requestdata = Encoding.UTF8.GetBytes(message);// 将 data 和 requestdata 合并到 buffer 中  byte[] buffer = new byte[data.Length + requestdata.Length];Buffer.BlockCopy(data, 0, buffer, 0, data.Length);Buffer.BlockCopy(requestdata, 0, buffer, data.Length, requestdata.Length);stream.Write(requestdata, 0, requestdata.Length);// 读取服务器的响应  byte[] buf = new byte[8192];int bytesRead = stream.Read(buf, 0, buf.Length);// 将接收到的字节转换为字符串  string responseData = Encoding.UTF8.GetString(buf, 0, bytesRead);Console.WriteLine("Received from server: " + responseData);Console.WriteLine("ReceivedBytes:{0}", bytesRead);//将Json写入文件File.WriteAllText("response.html", responseData);// 关闭连接  client.Close();}catch (Exception e){Console.WriteLine("Error: " + e.Message);}// 等待用户按键,以便在控制台中查看结果  Console.WriteLine("Press Enter to continue...");Console.ReadLine();}}
}

GrassWebProxyClientV2:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.Net;
using System.Net.Sockets;
using Newtonsoft.Json;
using System.Security.Policy;namespace GrassWebProxyClientV2
{public class IPport{public string IP { get; set; }public int Port { get; set; }}public class CpolarInfo{public int total { get; set; }public item[] items { get; set; }}public class item{public string name { get; set; }public string create_datetime { get; set; }public string pubulic_url { get; set; }}public class Ticket{public ulong TicketNo { get; set; }public string BeginDateTime { get; set; }public string EndDateTime { get; set; }}internal class Program{static void GetCploarInfo(){try{string jsonFilePath = "ipport.json"; // 替换为你的JSON文件路径  // 读取文件内容  string jsonContent = File.ReadAllText(jsonFilePath);// 反序列化JSON字符串到对象  IPport ipaddr = JsonConvert.DeserializeObject<IPport>(jsonContent);// 输出结果  Console.WriteLine($"{ipaddr.IP}:{ipaddr.Port}");// 创建一个TcpClient实例并连接到服务器  TcpClient client = new TcpClient($"{ipaddr.IP}", ipaddr.Port);// 获取一个NetworkStream对象以进行读写  NetworkStream stream = client.GetStream();// 将消息转换为字节数组  //string message = "Hello from the client!";//byte[] data = Encoding.ASCII.GetBytes(message);byte[] data = { 0x4E, 0x74, 0x01, 0xF2, 0x00, 0x00, 0x00, 0x01 };// 发送消息到服务器  stream.Write(data, 0, data.Length);// 读取服务器的响应  byte[] buffer = new byte[4096];int bytesRead = stream.Read(buffer, 0, buffer.Length);// 将接收到的字节转换为字符串  string responseData = Encoding.ASCII.GetString(buffer, 0, bytesRead);Console.WriteLine("Received from server: " + responseData);Console.WriteLine("ReceivedBytes:{0}", bytesRead);// 关闭连接  client.Close();//将Json写入文件File.WriteAllText("cpolarinfo.json", responseData);}catch (Exception e){Console.WriteLine("Error: " + e.Message);}}static void UseWebProxy(string webProxyUrl,string ip,int port){try{// 创建一个TcpClient实例并连接到服务器  TcpClient client = new TcpClient(ip, port);// 获取一个NetworkStream对象以进行读写  NetworkStream stream = client.GetStream();string jsonFilePath = "Ticket1.json";// 读取文件内容  string jsonContent = File.ReadAllText(jsonFilePath);// 反序列化JSON字符串到对象  Ticket ticket = JsonConvert.DeserializeObject<Ticket>(jsonContent);// 输出结果  Console.WriteLine($"{ticket.TicketNo}\r\n{ticket.BeginDateTime}---{ticket.EndDateTime}");//组装byte[] data = { 0x47, 0x50, 0x01, 0xF2, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01 };for (int i = 2, j = 7; i < data.Length; i++, j--){data[i] = (byte)(ticket.TicketNo >> (j * 8));//Console.WriteLine(data[i]);}// 将消息转换为字节数组  // 将 data 和 requestdata 合并到 buffer 中  byte[] requestdata = Encoding.UTF8.GetBytes(webProxyUrl);byte[] buf = new byte[data.Length + requestdata.Length];Buffer.BlockCopy(data, 0, buf, 0, data.Length);Buffer.BlockCopy(requestdata, 0, buf, data.Length, requestdata.Length);// 发送消息到服务器stream.Write(buf, 0, buf.Length);// 读取服务器的响应  byte[] buffer = new byte[81920];//int bytesRead = stream.Read(buffer, 0, buffer.Length);int totalBytesRead = 0;int bytesRead = 0;string responseData = string.Empty;while ((bytesRead = stream.Read(buffer, totalBytesRead, buffer.Length - totalBytesRead)) > 0){// 将接收到的字节转换为字符串  responseData = Encoding.UTF8.GetString(buffer, 0, bytesRead);Console.WriteLine("Received from server: " + responseData);Console.WriteLine("ReceivedBytes:{0}", bytesRead);totalBytesRead += bytesRead;// 可以在这里处理已经读取的数据(例如,写入文件或进行其他处理)  // 但请注意,如果处理逻辑复杂,最好先将数据复制到另一个缓冲区中  }// 现在 totalBytesRead 包含了从流中读取的总字节数Console.WriteLine("TotalReceivedBytes:{0}", totalBytesRead);//将Json写入文件File.WriteAllText("response.html", responseData);// 关闭连接  client.Close();}catch (Exception e){Console.WriteLine("Error: " + e.Message);}
}static void Main(string[] args){Console.WriteLine("请求Cploar动态域名和端口信息......");GetCploarInfo();string jsonContent=File.ReadAllText("cpolarinfo.json");Console.WriteLine(jsonContent);CpolarInfo cpinfo = JsonConvert.DeserializeObject<CpolarInfo>(jsonContent);Console.WriteLine($"{cpinfo.total}");for (int i = 0;i<cpinfo.total;i++){Console.WriteLine($"{cpinfo.items[i].name}\r\n{cpinfo.items[i].create_datetime}\r\n{cpinfo.items[i].pubulic_url}");}string host = string.Empty;for (int i = 0; i < cpinfo.total; i++){if (cpinfo.items[i].name== "GrassWebProxy"){host = cpinfo.items[i].pubulic_url;}}Console.WriteLine(host);// 使用Uri类来解析URL(这是更推荐的方法,因为它更健壮且能处理各种URL格式)  Uri uri = new Uri(host);// 直接从Uri对象中获取主机名  string hostname = uri.Host;int port = uri.Port;Console.WriteLine($"{hostname}:{port}"); // 输出: cpolard.26.tcp.cpolar.top  UseWebProxy("https://www.speedtest.net/", hostname, port);}}
}

GrassWebProxyClientV3:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using Newtonsoft.Json;namespace GrassWebProxyV3
{public class IPport{public string IP { get; set; }public int Port { get; set; }}public class CpolarInfo{public int total { get; set; }public item[] items { get; set; }}public class item{public string name { get; set; }public string create_datetime { get; set; }public string pubulic_url { get; set; }}public class Ticket{public ulong TicketNo { get; set; }public string BeginDateTime { get; set; }public string EndDateTime { get; set; }}internal class Program{static string GetCploarInfo(){try{string jsonFilePath = "ipport.json"; // 替换为你的JSON文件路径  // 读取文件内容  string jsonContent = File.ReadAllText(jsonFilePath);// 反序列化JSON字符串到对象  IPport ipaddr = JsonConvert.DeserializeObject<IPport>(jsonContent);// 输出结果  Console.WriteLine($"{ipaddr.IP}:{ipaddr.Port}");// 创建一个TcpClient实例并连接到服务器  TcpClient client = new TcpClient($"{ipaddr.IP}", ipaddr.Port);// 获取一个NetworkStream对象以进行读写  NetworkStream stream = client.GetStream();// 将消息转换为字节数组  //string message = "Hello from the client!";//byte[] data = Encoding.ASCII.GetBytes(message);byte[] data = { 0x4E, 0x74, 0x01, 0xF2, 0x00, 0x00, 0x00, 0x01 };// 发送消息到服务器  stream.Write(data, 0, data.Length);// 读取服务器的响应  byte[] buffer = new byte[4096];int bytesRead = stream.Read(buffer, 0, buffer.Length);// 将接收到的字节转换为字符串  string responseData = Encoding.ASCII.GetString(buffer, 0, bytesRead);Console.WriteLine("Received from server: " + responseData);Console.WriteLine("ReceivedBytes:{0}", bytesRead);// 关闭连接  client.Close();//将Json写入文件File.WriteAllText("cpolarinfo.json", responseData);return responseData;}catch (Exception e){Console.WriteLine("Error: " + e.Message);}return string.Empty;}static void UseWebProxy(string webProxyUrl, string ip, int port){try{string jsonFilePath = "Ticket1.json";// 读取文件内容  string jsonContent = File.ReadAllText(jsonFilePath);// 反序列化JSON字符串到对象  Ticket ticket = JsonConvert.DeserializeObject<Ticket>(jsonContent);// 输出结果  Console.WriteLine($"{ticket.TicketNo}\r\n{ticket.BeginDateTime}---{ticket.EndDateTime}");//组装byte[] data = { 0x47, 0x50, 0x01, 0xF2, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01 };for (int i = 2, j = 7; i < data.Length; i++, j--){data[i] = (byte)(ticket.TicketNo >> (j * 8));//Console.WriteLine(data[i]);}// 将消息转换为字节数组  // 将 data 和 requestdata 合并到 buffer 中  byte[] requestdata = Encoding.UTF8.GetBytes(webProxyUrl);byte[] buf = new byte[data.Length + requestdata.Length];Buffer.BlockCopy(data, 0, buf, 0, data.Length);Buffer.BlockCopy(requestdata, 0, buf, data.Length, requestdata.Length);// 创建一个TcpClient实例并连接到服务器  TcpClient client = new TcpClient(ip, port);// 获取一个NetworkStream对象以进行读写  NetworkStream stream = client.GetStream();// 发送消息到服务器stream.Write(buf, 0, buf.Length);// 读取服务器的响应  byte[] buffer = new byte[81920];//int bytesRead = stream.Read(buffer, 0, buffer.Length);int totalBytesRead = 0;int bytesRead = 0;string responseData = string.Empty;while ((bytesRead = stream.Read(buffer, totalBytesRead, buffer.Length - totalBytesRead)) > 0){// 将接收到的字节转换为字符串  responseData = Encoding.UTF8.GetString(buffer, 0, bytesRead);Console.WriteLine("Received from server: " + responseData);Console.WriteLine("ReceivedBytes:{0}", bytesRead);totalBytesRead += bytesRead;// 可以在这里处理已经读取的数据(例如,写入文件或进行其他处理)  // 但请注意,如果处理逻辑复杂,最好先将数据复制到另一个缓冲区中  }// 现在 totalBytesRead 包含了从流中读取的总字节数Console.WriteLine("TotalReceivedBytes:{0}", totalBytesRead);// 关闭连接  client.Close();//将Json写入文件File.WriteAllText("response.html", responseData);}catch (Exception e){Console.WriteLine("Error: " + e.Message);}}static void Main(string[] args){Console.WriteLine("请求Cploar动态域名和端口信息......");string jsonContent = GetCploarInfo();CpolarInfo cpinfo = new CpolarInfo();if (jsonContent==string.Empty){jsonContent = File.ReadAllText("cpolarinfo.json");}else{//Console.WriteLine(jsonContent);cpinfo = JsonConvert.DeserializeObject<CpolarInfo>(jsonContent);Console.WriteLine($"{cpinfo.total}");for (int i = 0; i < cpinfo.total; i++){Console.WriteLine($"{cpinfo.items[i].name}\r\n{cpinfo.items[i].create_datetime}\r\n{cpinfo.items[i].pubulic_url}");}}string host = string.Empty;for (int i = 0; i < cpinfo.total; i++){if (cpinfo.items[i].name == "GrassWebProxy"){host = cpinfo.items[i].pubulic_url;}}Console.WriteLine(host);// 使用Uri类来解析URL(这是更推荐的方法,因为它更健壮且能处理各种URL格式)  Uri uri = new Uri(host);// 直接从Uri对象中获取主机名  string hostname = uri.Host;int port = uri.Port;Console.WriteLine($"{hostname}:{port}"); // 输出: cpolard.26.tcp.cpolar.top  UseWebProxy("https://www.speedtest.net/", hostname, port);//UseWebProxy("https://29bf2803.r15.cpolar.top/html/Welcome.html", hostname, port);}}
}

GrassWebProxyClientV4:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using Newtonsoft.Json;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Security.Policy;
using System.Net;
using System.Net.Sockets;namespace GrassWebProxyClientV4
{public class IPport{public string IP { get; set; }public int Port { get; set; }}public class CpolarInfo{public int total { get; set; }public item[] items { get; set; }}public class item{public string name { get; set; }public string create_datetime { get; set; }public string pubulic_url { get; set; }}public class Ticket{public ulong TicketNo { get; set; }public string BeginDateTime { get; set; }public string EndDateTime { get; set; }}public class GP{public static bool CheckFlag(ref byte[] msg){//"G" 71 0x47//"P" 80 0x50if (msg[0] == 0x47 && msg[1] == 0x50){Console.WriteLine("CheckFlag OK");return true;}return false;}static public Ticket ReadConfig(string cfg = "Ticket1.json"){// 读取文件内容  string jsonContent = File.ReadAllText(cfg);// 反序列化JSON字符串到对象  Ticket ticket = JsonConvert.DeserializeObject<Ticket>(jsonContent);// 输出结果  Console.WriteLine($"{ticket.TicketNo}\r\n{ticket.BeginDateTime}---{ticket.EndDateTime}");return ticket;}static public bool CheckTicket(ref byte[] msg, Ticket counterfoil){/*ulong ticket = (ulong)((msg[2] << 56) | (msg[3] << 48) | (msg[4] << 40)| (msg[5] << 32) | (msg[6] << 24) | (msg[7] << 16) | (msg[8] << 8) | msg[9]);*/ulong ticket = BitConverter.ToUInt64(msg, 2); // 从索引2开始读取8个字节//Console.WriteLine(ticket.ToString("X"));if (counterfoil.TicketNo == ticket){return true;}return false;}static public bool CheckFlagAdTicket(ref byte[] msg, Ticket counterfoil){//"G" 71 0x47//"P" 80 0x50ulong ticket = BitConverter.ToUInt64(msg, 2); // 从索引2开始读取8个字节if (msg[0] == 0x47 && msg[1] == 0x50 && counterfoil.TicketNo == ticket){return true;}return false;}}public class DynamicCploar{public static Uri GetGrassWebProxyHost(string notifyServer = "ipport.json"){try{string jsonFilePath = "ipport.json"; // 替换为你的JSON文件路径  // 读取文件内容  string jsonContent = File.ReadAllText(jsonFilePath);// 反序列化JSON字符串到对象  IPport ipaddr = JsonConvert.DeserializeObject<IPport>(jsonContent);// 输出结果  Console.WriteLine($"Notify Server: {ipaddr.IP}:{ipaddr.Port}");// 创建一个TcpClient实例并连接到服务器  TcpClient client = new TcpClient($"{ipaddr.IP}", ipaddr.Port);// 获取一个NetworkStream对象以进行读写  NetworkStream stream = client.GetStream();// 将消息转换为字节数组  //string message = "Hello from the client!";//byte[] data = Encoding.ASCII.GetBytes(message);byte[] data = { 0x4E, 0x74, 0x01, 0xF2, 0x00, 0x00, 0x00, 0x01 };// 发送消息到服务器  stream.Write(data, 0, data.Length);// 读取服务器的响应  byte[] buffer = new byte[1024];int bytesRead = stream.Read(buffer, 0, buffer.Length);// 将接收到的字节转换为字符串  string responseData = Encoding.ASCII.GetString(buffer, 0, bytesRead);//Console.WriteLine("Received from server: " + responseData);//Console.WriteLine("ReceivedBytes:{0}", bytesRead);// 关闭连接  client.Close();//将Json写入文件File.WriteAllText("cpolarinfo.json", responseData);CpolarInfo cpinfo = new CpolarInfo();if (responseData == string.Empty){responseData = File.ReadAllText("cpolarinfo.json");}else{//Console.WriteLine(responseData);cpinfo = JsonConvert.DeserializeObject<CpolarInfo>(responseData);//Console.WriteLine($"{cpinfo.total}");//for (int i = 0; i < cpinfo.total; i++)//{//    Console.WriteLine($"{cpinfo.items[i].name}\r\n{cpinfo.items[i].create_datetime}\r\n{cpinfo.items[i].pubulic_url}");//}}string host = string.Empty;for (int i = 0; i < cpinfo.total; i++){if (cpinfo.items[i].name == "GrassWebProxy"){host = cpinfo.items[i].pubulic_url;}}Console.WriteLine(host);// 使用Uri类来解析URL(这是更推荐的方法,因为它更健壮且能处理各种URL格式)  Uri uri = new Uri(host);return uri;}catch (Exception e){Console.WriteLine("Error: " + e.Message);}return null;}}internal class Program{public static async Task Main(string[] args){// 代理服务器信息  var host = DynamicCploar.GetGrassWebProxyHost("ipport.json");string proxyAddress = host.Host;int proxyPort = host.Port; // 代理服务器的端口  // 创建HttpClientHandler并设置代理  var handler = new HttpClientHandler{Proxy = new WebProxy(proxyAddress, proxyPort),UseProxy = true, // 默认情况下UseProxy是true,但明确设置可以避免混淆  // 如果代理服务器需要认证,可以添加以下两行(替换username和password)  // Proxy = new WebProxy(proxyAddress, proxyPort)  // {  //     Credentials = new NetworkCredential("username", "password")  // },  };using (HttpClient client = new HttpClient(handler)){string url = "https://www.iciba.com/";//加Headers["X-Proxy-Ticket"]var ticket = GP.ReadConfig("Ticket1.json");//"G" 71 0x47//"P" 80 0x50byte[] tickBytes = new byte[10];tickBytes[0] = 0x47;tickBytes[1] = 0x50;Buffer.BlockCopy(BitConverter.GetBytes(ticket.TicketNo), 0, tickBytes, 2, 8);string ticketHeader = Encoding.UTF8.GetString(tickBytes);// 设置请求头  client.DefaultRequestHeaders.Add("X-Proxy-Ticket", ticketHeader);HttpResponseMessage response = await client.GetAsync(url);response.EnsureSuccessStatusCode(); // 抛出异常如果状态码表示错误  string responseBody = await response.Content.ReadAsStringAsync();Console.WriteLine(responseBody);}}}
}

GrassWebProxyClientV5:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.IO.Compression;
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;namespace GrassWebProxyClientV5
{public class IPport{public string IP { get; set; }public int Port { get; set; }}public class CpolarInfo{public int total { get; set; }public item[] items { get; set; }}public class item{public string name { get; set; }public string create_datetime { get; set; }public string pubulic_url { get; set; }}public class CustomDateTimeConverter : IsoDateTimeConverter{public CustomDateTimeConverter(){DateTimeFormat = "yyyyMMdd'T'HH:mm:ss";}}public class Ticket{public ulong TicketNo { get; set; }[JsonConverter(typeof(CustomDateTimeConverter))]public DateTime BeginDateTime { get; set; }[JsonConverter(typeof(CustomDateTimeConverter))]public DateTime EndDateTime { get; set; }}public class GP{public static bool CheckFlag(ref byte[] msg){//"G" 71 0x47//"P" 80 0x50if (msg[0] == 0x47 && msg[1] == 0x50){Console.WriteLine("CheckFlag OK");return true;}return false;}static public Ticket ReadConfig(string cfg = "Ticket1.json"){// 读取文件内容  string jsonContent = File.ReadAllText(cfg);// 反序列化JSON字符串到对象  Ticket ticket = JsonConvert.DeserializeObject<Ticket>(jsonContent);// 输出结果  Console.WriteLine($"{ticket.TicketNo}\r\n{ticket.BeginDateTime}---{ticket.EndDateTime}");return ticket;}static public bool CheckTicket(ref byte[] msg, Ticket counterfoil){/*ulong ticket = (ulong)((msg[2] << 56) | (msg[3] << 48) | (msg[4] << 40)| (msg[5] << 32) | (msg[6] << 24) | (msg[7] << 16) | (msg[8] << 8) | msg[9]);*/ulong ticket = BitConverter.ToUInt64(msg, 2); // 从索引2开始读取8个字节//Console.WriteLine(ticket.ToString("X"));if (counterfoil.TicketNo == ticket){return true;}return false;}static public bool CheckFlagAdTicket(ref byte[] msg, Ticket counterfoil){//"G" 71 0x47//"P" 80 0x50ulong ticket = BitConverter.ToUInt64(msg, 2); // 从索引2开始读取8个字节if (msg[0] == 0x47 && msg[1] == 0x50 && counterfoil.TicketNo == ticket){return true;}return false;}public static byte[] Compress(byte[] input){using (var memoryStream = new MemoryStream()){using (var gzipStream = new GZipStream(memoryStream, CompressionMode.Compress, true)){gzipStream.Write(input, 0, input.Length);}// 确保所有数据都被写入并压缩  return memoryStream.ToArray();}}public static byte[] DecompressGzip(byte[] gzip, int prebytes = 4096){using (var ms = new MemoryStream(gzip)){using (var gzipStream = new GZipStream(ms, CompressionMode.Decompress)){var buffer = new byte[prebytes];using (var memoryStreamOut = new MemoryStream()){int read;while ((read = gzipStream.Read(buffer, 0, buffer.Length)) > 0){memoryStreamOut.Write(buffer, 0, read);}return memoryStreamOut.ToArray();}}}}}public class DynamicCploar{public static Uri GetGrassWebProxyHost(string notifyServer = "ipport.json"){try{// 读取文件内容  string jsonContent = File.ReadAllText(notifyServer);// 反序列化JSON字符串到对象  IPport ipaddr = JsonConvert.DeserializeObject<IPport>(jsonContent);// 输出结果  Console.WriteLine($"Notify Server: {ipaddr.IP}:{ipaddr.Port}");// 创建一个TcpClient实例并连接到服务器  TcpClient client = new TcpClient($"{ipaddr.IP}", ipaddr.Port);// 获取一个NetworkStream对象以进行读写  NetworkStream stream = client.GetStream();// 将消息转换为字节数组  //string message = "Hello from the client!";//byte[] data = Encoding.ASCII.GetBytes(message);byte[] data = { 0x4E, 0x74, 0x01, 0xF2, 0x00, 0x00, 0x00, 0x01 };// 发送消息到服务器  stream.Write(data, 0, data.Length);// 读取服务器的响应  byte[] buffer = new byte[1024];int bytesRead = stream.Read(buffer, 0, buffer.Length);// 将接收到的字节转换为字符串  string responseData = Encoding.ASCII.GetString(buffer, 0, bytesRead);//Console.WriteLine("Received from server: " + responseData);//Console.WriteLine("ReceivedBytes:{0}", bytesRead);// 关闭连接  client.Close();//将Json写入文件File.WriteAllText("cpolarinfo.json", responseData);CpolarInfo cpinfo = new CpolarInfo();if (responseData == string.Empty){responseData = File.ReadAllText("cpolarinfo.json");}else{//Console.WriteLine(responseData);cpinfo = JsonConvert.DeserializeObject<CpolarInfo>(responseData);//Console.WriteLine($"{cpinfo.total}");//for (int i = 0; i < cpinfo.total; i++)//{//    Console.WriteLine($"{cpinfo.items[i].name}\r\n{cpinfo.items[i].create_datetime}\r\n{cpinfo.items[i].pubulic_url}");//}}string host = string.Empty;for (int i = 0; i < cpinfo.total; i++){if (cpinfo.items[i].name == "GrassWebProxy"){host = cpinfo.items[i].pubulic_url;}}Console.WriteLine(host);// 使用Uri类来解析URL(这是更推荐的方法,因为它更健壮且能处理各种URL格式)  Uri uri = new Uri(host);return uri;}catch (Exception e){Console.WriteLine("Error: " + e.Message);}return null;}}internal class Program{static void UseWebProxy(string webProxyUrl, string ip, int port){try{string jsonFilePath = "Ticket1.json";// 读取文件内容  string jsonContent = File.ReadAllText(jsonFilePath);// 反序列化JSON字符串到对象  Ticket ticket = JsonConvert.DeserializeObject<Ticket>(jsonContent);// 输出结果  Console.WriteLine($"{ticket.TicketNo},{ticket.BeginDateTime.ToString("yyyyMMdd'T'HH:mm:ss")}---{ticket.EndDateTime.ToString("yyyyMMdd'T'HH:mm:ss")}");//组装byte[] data = { 0x47, 0x50, 0x01, 0xF2, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01 };for (int i = 2, j = 7; i < data.Length; i++, j--){data[i] = (byte)(ticket.TicketNo >> (j * 8));//Console.WriteLine(data[i]);}// 将消息转换为字节数组  // 将 data 和 requestdata 合并到 buffer 中  byte[] requestdata = Encoding.UTF8.GetBytes(webProxyUrl);byte[] buf = new byte[data.Length + requestdata.Length];Buffer.BlockCopy(data, 0, buf, 0, data.Length);Buffer.BlockCopy(requestdata, 0, buf, data.Length, requestdata.Length);// 创建一个TcpClient实例并连接到服务器  TcpClient client = new TcpClient(ip, port);// 获取一个NetworkStream对象以进行读写  NetworkStream stream = client.GetStream();// 发送消息到服务器stream.Write(buf, 0, buf.Length);// 读取服务器的响应  byte[] buffer = new byte[81920];int totalBytesRead = 0;int bytesRead = 0;string responseData = string.Empty;while ((bytesRead = stream.Read(buffer, totalBytesRead, buffer.Length - totalBytesRead)) > 0){Console.WriteLine("ReceivedBytes:{0}", bytesRead);totalBytesRead += bytesRead;}// 关闭连接  client.Close();//解压var tmp = GP.DecompressGzip(buffer,totalBytesRead);// 将接收到的字节转换为字符串  responseData = Encoding.UTF8.GetString(tmp, 0, tmp.Length);// 现在 totalBytesRead 包含了从流中读取的总字节数Console.WriteLine("TotalReceivedBytes:{0}", totalBytesRead);Console.WriteLine("Received from server:\r\n" + responseData);//将Json写入文件File.WriteAllText("response.html", responseData);}catch (Exception e){Console.WriteLine("Error: " + e.Message);}}static void Main(string[] args){// 代理服务器信息  var host = DynamicCploar.GetGrassWebProxyHost("ipport.json");//string proxyAddress = host.Host;//int proxyPort = host.Port; // 代理服务器的端口  // 创建HttpClientHandler并设置代理  UseWebProxy("https://www.baidu.com/",host.Host,host.Port);string url="https://access-hsk.oray.com/loading?r=https%253A%252F%252Fu1506257x0%252Egoho%252Eco%253A443%252Fhtml%252Fopendata%252Ehtml&i=aHR0cHM6Ly91MTUwNjI1N3gwLmdvaG8uY286NDQzLDE0LjE1MS44MS43Mg%253D%253D&p=2979654771&k=aHV4eWNjXzE0LjE1MS44MS43Ml9FZGdlXzEyNyUyRTAlMkUwJTJFMF9XaW5kb3dzX1dpbmRvd3MlMjAxMA%3D%3D";UseWebProxy(url, host.Host, host.Port);url = "http://www.cjors.cn/";UseWebProxy(url, host.Host, host.Port);}}
}

相关文章:

GrassWebProxy

GrassWebProxy第一版&#xff1a; using System; using System.Collections.Generic; using System.Linq; using System.Net.Sockets; using System.Net; using System.Text; using System.Threading; using System.Threading.Tasks; using System.IO; using Newtonsoft.Json;…...

6.Python函数:函数定义、函数的类型、函数参数、函数返回值、函数嵌套、局部变量、全局变量、递归函数、匿名函数

1. 函数定义 Python函数通过def关键字定义。一个函数通常包括函数名、参数列表和函数体。 def greet(name):return f"Hello, {name}!"2. 函数的类型 Python中的函数主要有以下几种类型&#xff1a; 普通函数&#xff1a;具有明确的输入参数和返回值。递归函数&am…...

青少年编程与数学 02-008 Pyhon语言编程基础 22课题、类的定义和使用

青少年编程与数学 02-008 Pyhon语言编程基础 22课题、类的定义和使用 一、类类的定义和使用示例 二、定义1. 类定义语法2. 属性和方法3. 构造器和初始化4. 实例化5. 类变量和实例变量6. 类方法和静态方法7. 继承8. 多态总结 三、使用1. 创建类的实例2. 访问属性3. 调用方法4. 修…...

CosyVoice /F5-TTS /GPT-SoVITS /Fish-Speech 开源语音克隆与文本转语音(TTS)项目的对比整理

四个主流开源语音克隆与文本转语音&#xff08;TTS&#xff09;项目的对比整理&#xff0c;基于公开资料与实测反馈总结&#xff1a; 项目CosyVoice F5-TTS GPT-SoVITS Fish-Speech 核心技术双向流式语音合成&#xff0c;支持离线与流式一体化建模基于流匹配的ConvNeXt文本表示…...

MySQL基于binlog和gtid主从搭建方案

MySQL基于binlog和gtid主从搭建方案 一.主库配置 1.1 确认 binlog 是否开启 SHOW VARIABLES LIKE %log_bin%; 1.2 创建日志目录并设置权限 mkdir -p /opt/mysql/log_bin chown -R mysql:mysql /usr/local/mysql chmod -R 755 /usr/local/mysql 1.3 修改 my.cnf 配置文件 …...

5 计算机网络

5 计算机网络 5.1 OSI/RM七层模型 5.2 TCP/IP协议簇 5.2.1:常见协议基础 一、 TCP是可靠的&#xff0c;效率低的&#xff1b; 1.HTTP协议端口默认80&#xff0c;HTTPSSL之后成为HTTPS协议默认端口443。 2.对于0~1023一般是默认的公共端口不需要注册&#xff0c;1024以后的则需…...

Vim跳转文件及文件行结束符EOL

跳转文件 gf 从当前窗口打开那个文件的内容&#xff0c;操作方式&#xff1a;让光标停在文件名上&#xff0c;输入gf。 Ctrlo 从打开的文件返回之前的窗口 Ctrlwf 可以在分割的窗口打开跳转的文件&#xff0c;不过在我的实验不是次次都成功。 统一行尾格式 文本文件里存放的…...

智能理解 PPT 内容,快速生成讲解视频

当我们想根据一版 PPT 制作出相对应的解锁视频时&#xff0c;从撰写解锁词&#xff0c;录制音频到剪辑视频&#xff0c;每一个环节都需要投入大量的时间和精力&#xff0c;本方案将依托于阿里云函数计算 FC 和百炼模型服务&#xff0c;实现从 PPT 到视频的全自动转换&#xff0…...

【鸿蒙开发】第二十四章 AI - Core Speech Kit(基础语音服务)

目录 1 简介 1.1 场景介绍 1.2 约束与限制 2 文本转语音 2.1 场景介绍 2.2 约束与限制 2.3 开发步骤 2.4 设置播报策略 2.4.1 设置单词播报方式 2.4.2 设置数字播报策略 2.4.3 插入静音停顿 2.4.4 指定汉字发音 2.5 开发实例 3 语音识别 3.1 场景介绍 3.2 约束…...

Java/Kotlin双语革命性ORM框架Jimmer(一)——介绍与简单使用

概览 Jimmer是一个Java/Kotlin双语框架 包含一个革命性的ORM 以此ORM为基础打造了一套综合性方案解决方案&#xff0c;包括 DTO语言 更全面更强大的缓存机制&#xff0c;以及高度自动化的缓存一致性 更强大客户端文档和代码生成能力&#xff0c;包括Jimmer独创的远程异常 …...

番外02:前端八股文面试题-CSS篇

一&#xff1a;CSS基础 1&#xff1a;CSS选择器及其优先级 2&#xff1a;display的属性值及其作用 属性值作用none元素不显示&#xff0c;并且会从文档流中移除block块类型&#xff0c;默认元素为父元素宽度&#xff0c;可设置宽高&#xff0c;换行显示inline行内元素类型&a…...

Redis Copilot:基于Redis为AI打造的副驾工具

我们最近发布了Redis Copilot&#xff0c;以帮助开发者更快地使用Redis构建应用。我们的使命是使应用程序快速运行&#xff0c;并简化构建过程。为此&#xff0c;Redis Copilot作为您的AI助手&#xff0c;能够让您更迅速地完成与Redis相关的任务。您今天就可以在Redis Insight中…...

JavaScript遍历对象的7种方式

注&#xff1a;纯手打&#xff0c;如有错误欢迎评论区交流&#xff01; 转载请注明出处&#xff1a;https://blog.csdn.net/testleaf/article/details/145523427 编写此文是为了更好地学习前端知识&#xff0c;如果损害了有关人的利益&#xff0c;请联系删除&#xff01; 本文章…...

如何避免NACK重传风暴

策略 1&#xff0c;10 次 NACK 模块对同一包号的最大请求次数&#xff0c;超过这个最大次数限制&#xff0c;会把该包号移出 nack_list&#xff0c;放弃对该包的重传请求。 策略 2&#xff0c;20 毫秒 NACK 模块每隔 20 毫秒批量处理 nack_list&#xff0c;获取一批请求包号…...

并发工具CountDownLatch、CyclicBarrier、Semaphore

文章目录 学习链接CountDownLatchCountDownLatch类的作用类的主要方法介绍图解await和countDown方法两个典型用法注意点总结示例CountDownLatchDemo1CountDownLatchDemo2CountDownLatchDemo1And2 CyclicBarrierCyclicBarrier循环栅栏CyclicBarrier和CountDownLatch的区别示例Cy…...

十二. Redis 集群操作配置(超详细配图,配截图详细说明)

十二. Redis 集群操作配置(超详细配图&#xff0c;配截图详细说明) 文章目录 十二. Redis 集群操作配置(超详细配图&#xff0c;配截图详细说明)1. 为什么需要集群-高可用性2. 集群概述(及其搭建)3. Redis 集群的使用4. Redis 集群故障恢复5. Redis 集群的 Jedis 开发(使用Java…...

网络工程师 (26)TCP/IP体系结构

一、层次 四层&#xff1a; 网络接口层&#xff1a;TCP/IP协议的最底层&#xff0c;负责网络层与硬件设备间的联系。该层协议非常多&#xff0c;包括逻辑链路和媒体访问控制&#xff0c;负责与物理传输的连接媒介打交道&#xff0c;主要功能是接收数据报&#xff0c;并把接收到…...

TensorFlow域对抗训练DANN神经网络分析MNIST与Blobs数据集梯度反转层提升目标域适应能力可视化...

全文链接&#xff1a;https://tecdat.cn/?p39656 本文围绕基于TensorFlow实现的神经网络对抗训练域适应方法展开研究。详细介绍了梯度反转层的原理与实现&#xff0c;通过MNIST和Blobs等数据集进行实验&#xff0c;对比了不同训练方式&#xff08;仅源域训练、域对抗训练等&am…...

保姆级教程--DeepSeek部署

以DeepSeek-R1或其他类似模型为例&#xff0c;涵盖环境配置、代码部署和运行测试的全流程&#xff1a; 准备工作 1. 注册 Cloud Studio - 访问 [Cloud Studio 官网](https://cloudstudio.net/)&#xff0c;使用腾讯云账号登录。 - 完成实名认证&#xff08;如需长期使用…...

机器学习之心的创作纪念日

机缘 今天&#xff0c;是我成为创作者的第1460天。 在这段时间里&#xff0c;获得了很大的成长。 虽然日常忙碌但还在坚持创作、初心还在。 日常 创作已经成为我生活的一部分&#xff0c;尤其是在我的工作中&#xff0c;创作是不可或缺的&#xff0c;创作都是核心能力之一。…...

VeryReport和FastReport两款报表软件深度分析对比

在当今数据驱动的商业环境中&#xff0c;报表软件已经成为企业管理和数据分析的重要工具。无论是中小型企业还是大型企业&#xff0c;都需要依赖高效的报表工具来快速生成、分析和展示数据。市面上有许多报表工具&#xff0c;其中VeryReport和FastReport是两款备受关注的报表软…...

libtorch的c++,加载*.pth

一、转换模型为TorchScript 前提&#xff1a;python只保存了参数&#xff0c;没存结构 要在C中使用libtorch&#xff08;PyTorch的C接口&#xff09;&#xff0c;读取和加载通过torch.save保存的模型&#xff08; torch.save(pdn.state_dict()这种方式&#xff0c;只保存了…...

去除 RequestTemplate 对象中的指定请求头

目录 目标实现获取 RequestTemplate 对象去除请求头 目标 去除 RequestTemplate 对象中的指定请求头&#xff0c;如 Authorization 等。 实现 获取 RequestTemplate 对象 获取 RequestTemplate 对象的方式有很多种&#xff0c;如 通过 feign 虚拟客户端配置器&#xff1a; …...

b s架构 网络安全 网络安全架构分析

目录 文章目录 目录网络安全逻辑架构 微分段&#xff08;Micro-segmentation&#xff09;防火墙即服务&#xff08;Firewall asa Service &#xff0c;FWaaS&#xff09;安全网络网关&#xff08;Secure web gateway&#xff09;净化域名系统&#xff08;Sanitized Domain Na…...

【DeepSeek论文精读】2. DeepSeek LLM:以长期主义扩展开源语言模型

欢迎关注[【AIGC论文精读】](https://blog.csdn.net/youcans/category_12321605.html&#xff09;原创作品 【DeepSeek论文精读】1. 从 DeepSeek LLM 到 DeepSeek R1 【DeepSeek论文精读】2. DeepSeek LLM&#xff1a;以长期主义扩展开源语言模型 【DeepSeek论文精读】3. DeepS…...

Spring Boot和SpringMVC的关系

Spring Boot和SpringMVC都是Spring框架的一部分&#xff0c;但它们的作用和使用方式有所不同。为了更好地理解它们的关系&#xff0c;我们可以从以下几个方面进行详细说明&#xff1a; 1. SpringBoot的作用 SpringBoot是一个开源框架&#xff0c;它的目的是简化Spring应用程序…...

java基础4(黑马)

一、方法 1.定义 方法&#xff1a;是一种语法结构&#xff0c;它可以把一段代码封装成一个功能&#xff0c;以便重复使用。 方法的完整格式&#xff1a; package cn.chang.define;public class MethodDemo1 {public static void main(String[] args) {// 目标&#xff1a;掌…...

nodejs - vue 视频切片上传,本地正常,线上环境导致磁盘爆满bug

nodejs 视频切片上传&#xff0c;本地正常&#xff0c;线上环境导致磁盘爆满bug 原因&#xff1a; 然后在每隔一分钟执行du -sh ls &#xff0c;发现文件变得越来越大&#xff0c;即文件下的mp4文件越来越大 最后导致磁盘直接爆满 排查原因 1、尝试将m3u8文件夹下的所有视…...

注意力机制(Attention Mechanism)和Transformer模型的区别与联系

注意力机制(Attention Mechanism) 和 Transformer 模型 是深度学习领域中的两个重要概念,虽然它们紧密相关,但有着明显的区别。下面我们将从 定义、作用、结构 和 应用 等多个维度来分析这两者的区别与联系。 1. 定义 注意力机制(Attention Mechanism): 注意力机制是一…...

C++,设计模式,【单例模式】

文章目录 一、模式定义与核心价值二、模式结构解析三、关键实现技术演进1. 基础版(非线程安全)2. 线程安全版(双重检查锁)3. 现代C++实现(C++11起)四、实战案例:全局日志管理器五、模式优缺点深度分析✅ 核心优势⚠️ 潜在缺陷六、典型应用场景七、高级实现技巧1. 模板化…...