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);}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/69323.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Websocket从原理到实战

引言 WebSocket 是一种在单个 TCP 连接上进行全双工通信的网络协议&#xff0c;它使得客户端和服务器之间能够进行实时、双向的通信&#xff0c;既然是通信协议一定要从发展历史到协议内容到应用场景最后到实战全方位了解 发展历史 WebSocket 最初是为了解决 HTTP 协议在实时…

[LeetCode]day16 242.有效的字母异位词

242. 有效的字母异位词 - 力扣&#xff08;LeetCode&#xff09; 题目描述 给定两个字符串 s 和 t &#xff0c;编写一个函数来判断 t 是否是 s 的 字母异位词 示例 1: 输入: s "anagram", t "nagaram" 输出: true示例 2: 输入: s "rat"…

计算机考研复试上机02

目录 3、排序 1)排序(华中科技大学复试上机题) 2)成绩排序(清华大学复试上机题) 3)特殊排序(华中科技大学复试上机题) 4)整数奇偶排序(北京大学复试上机题) 5)小白鼠排队(北京大学复试上机题) 4、查找 1)找 x(哈尔滨工业大学复试上机题) 2)查找(北…

UnityShader学习笔记——动态效果

——内容源自唐老狮的shader课程 目录 1.原理 2.Shader中内置的时间变量 3.Shader中经常会改变的数据 4.纹理动画 4.1.背景滚动 4.1.1.补充知识 4.1.2.基本原理 4.2.帧动画 4.2.1.基本原理 5.流动的2D河流 5.1.基本原理 5.2.关键步骤 5.3.补充知识 6.广告牌效果 …

MySQL万能备份脚本

此脚本适用于 MySQL 各个生命周期的版本 #!/bin/bash # mybackup.sh# 备份保留天数&#xff0c;建议保留三天 days7 # 备份时间 time$(date %Y%m%d%H%M%S) # 备份保存路径 backup_dir/opt/backup # 备份工具 toolmysqldump # 端口 port"3306" # 是否采用 --all-data…

【Redis keys命令有什么问题?】

Redis keys命令有什么问题? 性能问题实际使用中的限制替代方案示例讲解Redis keys命令的问题示例替代方案:使用SCAN命令Java代码示例性能问题 时间复杂度:keys命令的时间复杂度是O(n),其中n是Redis中键的总数。这意味着,当Redis中存储的键数量非常大时,执行keys命令会遍历…

Python用langchain、OpenAI大语言模型LLM情感分析苹果股票新闻数据及提示工程优化应用...

全文链接&#xff1a;https://tecdat.cn/?p39614 本文主要探讨了如何利用大语言模型&#xff08;LLMs&#xff09;进行股票分析。通过使用提供的股票市场和金融新闻获取数据&#xff0c;结合Python中的相关库&#xff0c;如Pandas、langchain等&#xff0c;实现对股票新闻的情…

第19章 Future设计模式(Java高并发编程详解:多线程与系统设计)

1.先给你一张凭据 假设有个任务需要执行比较长的的时间&#xff0c;通常需要等待任务执行结束或者出错才能返回结果&#xff0c; 在此期间调用者只能陷入阻塞苦苦等待&#xff0c; 对此&#xff0c; Future设计模式提供了一种凭据式的解决方案。在我们日常生活中&#xff0c;关…

v-for 为什么加 key?不加 key 会怎么样?

在 Vue.js 中,v-for 指令用于渲染列表。当使用 v-for 渲染列表时,通常推荐为每个项目提供一个唯一的 key 属性。以下是为什么要加 key 以及不加 key 会发生什么的详细说明: 为什么要加 key 提高性能: Vue.js 在渲染列表时,会根据 key 来追踪每个节点的身份。当节点的 key…

[Android] 全球网测-版本号4.3.8

[Android] 全球网测 链接&#xff1a;https://pan.xunlei.com/s/VOIV5G3_UOFWnGuMQ_GlIW2OA1?pwdfrpe# 应用介绍 "全球网测"是由中国信通院产业与规划研究所自主研发的一款拥有宽带测速、上网体验和网络诊断等功能的综合测速软件。APP突出六大亮点优势&#xff1a…

判断您的Mac当前使用的是Zsh还是Bash:echo $SHELL、echo $0

要判断您的Mac当前使用的是Zsh还是Bash&#xff0c;可以使用以下方法&#xff1a; 查看默认Shell: 打开“终端”应用程序&#xff0c;然后输入以下命令&#xff1a; echo $SHELL这将显示当前默认使用的Shell。例如&#xff0c;如果输出是/bin/zsh&#xff0c;则说明您使用的是Z…

MySQL的存储引擎对比(InnoDB和MyISAM)

InnoDB 特点&#xff1a; 事务支持&#xff1a;InnoDB 是 MySQL 默认的事务型存储引擎&#xff0c;支持 ACID&#xff08;原子性、一致性、隔离性、持久性&#xff09;事务。行级锁定&#xff1a;支持行级锁&#xff0c;能够并发执行查询和更新操作&#xff0c;提升多用户环境…

MYSQL第四次

目录 题目分析 代码实现 一、修改 Student 表中年龄&#xff08;sage&#xff09;字段属性&#xff0c;数据类型由 int 改变为 smallint 二、为 Course 表中 Cno 字段设置索引&#xff0c;并查看索引 三、为 SC 表建立按学号&#xff08;sno&#xff09;和课程号&#xff…

maven如何分析指定jar包的依赖路径

在Maven项目中&#xff0c;分析指定JAR包的依赖路径是非常有用的&#xff0c;尤其是在解决依赖冲突时。Maven提供了一个命令行工具来帮助查看特定依赖的传递性依赖&#xff08;即依赖路径&#xff09;。以下是具体步骤&#xff1a; 使用 mvn dependency:tree 命令 打开命令行或…

MATLAB | 基于Theil-Sen斜率和Mann-Kendall检验的栅格数据趋势分析

最近看到一些博主分享关于 SenMK 检验的代码&#xff0c;对于新手来说可能有点复杂。我们编写了一段 MATLAB 代码&#xff0c;能够一次性解决这些问题&#xff0c;简化操作流程。我们还准备了几个关于趋势检验的空间分布图&#xff0c;供大家参考。 一、Sens Slope和Mann-Kenda…

72.在 Vue3 中使用 OpenLayers 进行 Drag-and-Drop 拖拽文件解析并显示图形

在 WebGIS 相关的开发中&#xff0c;我们经常需要加载各种地理数据文件&#xff0c;如 GeoJSON、KML、GPX 等。而 OpenLayers 提供了 DragAndDrop 交互组件&#xff0c;使得我们可以通过拖拽方式加载这些文件&#xff0c;并将其中的地理要素渲染到地图上。 本文将详细介绍如何…

VM虚拟机安装群晖系统

下载群晖系统 https://download.csdn.net/download/hmxm6/90351935 安装群晖连接软件 synology-assistant-6.2-24922(在上面的压缩包里面) 准备好VM虚拟机 创建群晖虚拟机 打开下载下来的虚拟机 添加硬盘 选择类型 创建新的磁盘 指定容量 指定存储文件 完成硬盘添加…

瞬态分析中的时域分析与频域分析:原理、对比与应用指南

目录 一、核心概念区分 二、时域分析&#xff1a;时间维度直接求解 1. 基本原理 2. 关键特点 3. 典型算法 4. 应用案例 三、频域分析&#xff1a;频率维度的等效映射 1. 基本原理 2. 关键特点 3. 典型方法 4. 应用案例 四、对比与选择依据 1. 方法论对比 2. 工程…

基于LMStudio本地部署DeepSeek R1

DeepSeek R1 DeepSeek R1是由DeepSeek团队开发的一款高性能AI推理模型&#xff0c;其开源版本包括完整的DeepSeek R1 671B权重&#xff0c;以及基于其蒸馏出的多个小型模型。 DeepSeek R1通过蒸馏技术将推理模式迁移到更小的模型中&#xff0c;显著提升了这些模型的推理能力。…

2.攻防世界 ics-06

题目描述处给出提示 进入题目页面如下 发现只有报表中心能进入下一个页面 页面内容&#xff1a; 发现有传参 改变日期也没有变化 更改id数值页面也没有回显 猜测应该有一个特定id对应的页面即为那一处入侵者留下的数据 下面使用burp suite爆破id值 先用burp suite抓包 右键…