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

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;…...

DeepSeek API 调用 - Spring Boot 实现

DeepSeek API 调用 - Spring Boot 实现 1. 项目依赖 在 pom.xml 中添加以下依赖&#xff1a; <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-webflux</artifactId></depe…...

【DeepSeek】Deepseek辅组编程-通过卫星轨道计算终端距离、相对速度和多普勒频移

引言 笔者在前面的文章中&#xff0c;介绍了基于卫星轨道参数如何计算终端和卫星的距离&#xff0c;相对速度和多普勒频移。 【一文读懂】卫星轨道的轨道参数&#xff08;六根数&#xff09;和位置速度矢量转换及其在终端距离、相对速度和多普勒频移计算中的应用 Matlab程序 …...

【kafka实战】05 Kafka消费者消费消息过程源码剖析

1. 概述 Kafka消费者&#xff08;Consumer&#xff09;是Kafka系统中负责从Kafka集群中拉取消息的客户端组件。消费者消费消息的过程涉及多个步骤&#xff0c;包括消费者组的协调、分区分配、消息拉取、消息处理等。本文将深入剖析Kafka消费者消费消息的源码&#xff0c;并结合…...

[EAI-033] SFT 记忆,RL 泛化,LLM和VLM的消融研究

Paper Card 论文标题&#xff1a;SFT Memorizes, RL Generalizes: A Comparative Study of Foundation Model Post-training 论文作者&#xff1a;Tianzhe Chu, Yuexiang Zhai, Jihan Yang, Shengbang Tong, Saining Xie, Dale Schuurmans, Quoc V. Le, Sergey Levine, Yi Ma 论…...

算法与数据结构(字符串相乘)

题目 思路 这道题我们可以使用竖式乘法&#xff0c;从右往左遍历每个乘数&#xff0c;将其相乘&#xff0c;并且把乘完的数记录在nums数组中&#xff0c;然后再进行进位运算&#xff0c;将同一列的数进行相加&#xff0c;进位。 解题过程 首先求出两个数组的长度&#xff0c;…...

DeepSeek从入门到精通:全面掌握AI大模型的核心能力

文章目录 一、DeepSeek是什么&#xff1f;性能对齐OpenAI-o1正式版 二、Deepseek可以做什么&#xff1f;能力图谱文本生成自然语言理解与分析编程与代码相关常规绘图 三、如何使用DeepSeek&#xff1f;四、DeepSeek从入门到精通推理模型推理大模型非推理大模型 快思慢想&#x…...

【Pytorch函数】PyTorch随机数生成全解析 | torch.rand()家族函数使用指南

&#x1f31f; PyTorch随机数生成全解析 | torch.rand()家族函数使用指南 &#x1f31f; &#x1f4cc; 一、核心函数参数详解 PyTorch提供多种随机数生成函数&#xff08;注意&#xff1a;无直接torch.random()函数&#xff09;&#xff0c;以下是常用函数及参数&#xff1a;…...

vue print 打印

vue 点击打印页面部分内容&#xff0c;或者打印弹窗内的内容 打印页面部分内容 <template><div><div id"print"><div class"info"><div class"bx_title">费用报销单<span class"code">NO.<s…...

【异常解决】在idea中提示 hutool 提示 HttpResponse used withoud try-with-resources statement

博主介绍&#xff1a;✌全网粉丝22W&#xff0c;CSDN博客专家、Java领域优质创作者&#xff0c;掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围&#xff1a;SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...

【Uniapp-Vue3】UniCloud云数据库获取指定字段的数据

使用where方法可以获取指定的字段&#xff1a; let db uniCloud.database(); db.collection("数据表").where({字段名1:数据, 字段名2:数据}).get({getOne:true}) 如果我们不在get中添加{getOne:true}&#xff0c;在只获取到一个数据res.result.data将会是一个数组&…...

信息科技伦理与道德3-2:智能决策

2.2 智能推荐 推荐算法介绍 推荐系统&#xff1a;猜你喜欢 https://blog.csdn.net/search_129_hr/article/details/120468187 推荐系统–矩阵分解 https://blog.csdn.net/search_129_hr/article/details/121598087 案例一&#xff1a;YouTube推荐算法向儿童推荐不适宜视频 …...

openssl使用

openssl使用 提取密钥对 数字证书pfx包含公钥和私钥&#xff0c;而cer证书只包含公钥。提取需输入证书保护密码 openssl pkcs12 -in xxx.pfx -nocerts -nodes -out pare.key提取私钥 openssl rsa -in pare.key -out pri.key提取公钥 openssl rsa -in pare.key -pubout -ou…...

Visual Studio 2022 中使用 Google Test

要在 Visual Studio 2022 中使用 Google Test (gtest)&#xff0c;可以按照以下步骤进行&#xff1a; 安装 Google Test&#xff1a;确保你已经安装了 Google Test。如果没有安装&#xff0c;可以通过 Visual Studio Installer 安装。在安装程序中&#xff0c;找到并选择 Googl…...

SpringBoot3 + Jedis5 + Redis集群 如何通过scan方法分页获取所有keys

背景: 由于需要升级老项目代码&#xff0c;从SpringBoot1.5.x 升级到 SpringBoot3.3.x&#xff0c;框架中引用的Jedis自动升级到了 5.x&#xff1b;正好代码中有需要获取Redis集群的所有keys的需求存在&#xff1b;代码就不适用了&#xff0c;修改如下&#xff1a; POM 由于…...

WGCLOUD监控系统部署教程

官网地址&#xff1a;下载WGCLOUD安装包 - WGCLOUD官网 第一步、环境配置 #安装jdk 1、安装 EPEL 仓库&#xff1a; sudo yum install -y epel-release 2、安装 OpenJDK 11&#xff1a; sudo yum install java-11-openjdk-devel 3、如果成功&#xff0c;你可以通过运行 java …...

协议-WebRTC-HLS

是什么&#xff1f; WebRTC&#xff08;Web Real-Time Communication&#xff09; 实现 Web 浏览器和移动应用程序之间通过互联网直接进行实时通信。允许点对点音频、视频和数据共享&#xff0c;而无需任何插件或其他软件。WebRTC 广泛用于构建视频会议、语音通话、直播、在线游…...

jQuery UI 下载指南

jQuery UI 下载指南 引言 jQuery UI 是一个基于 jQuery 的用户界面和交互库&#xff0c;它提供了一套丰富的交互组件和视觉效果&#xff0c;可以帮助开发者快速构建美观、交互性强的网页应用。本文将为您详细介绍如何下载 jQuery UI&#xff0c;并指导您进行安装和使用。 jQ…...

MySQL系列之数据类型(String)

导览 前言一、字符串类型知多少 1. 类型说明2. 字符和字节的转换 二、字符串类型的异同 1. CHAR & VARCHAR2. BINARY & VARBINARY3. BLOB & TEXT4. ENUM & SET 结语精彩回放 前言 MySQL数据类型第三弹闪亮登场&#xff0c;欢迎关注O。 本篇博主开始谈谈MySQ…...

Kotlin 2.1.0 入门教程(十)if、when

if 表达式 if 是一个表达式&#xff0c;它会返回一个值。 不存在三元运算符&#xff08;condition ? then : else&#xff09;&#xff0c;因为 if 在这种场景下完全可以胜任。 var max aif (a < b) max bif (a > b) {max a } else {max b }max if (a > b) a…...

编程式路由

<script> export default {name: video-Info1,created () {setTimeout(() > {this.$router.push({ name: home })}, 3000)} } </script> 编程式路由&#xff1a;实现 不需要用户点击router-link&#xff0c;由代码实现路由跳转。 应用场景&#xff1a;用户登录…...

openAI官方prompt技巧(一)

1. 使用最新的模型 2. 将指令放在提示词的开头&#xff0c;并使用 ### 或 """ 来分隔指令和上下文&#xff0c;例如 错误示范❌ 将下面的文本总结为一个要点列表&#xff0c;列出最重要的内容。 Summarize the text below as a bullet point list of the most…...

利用 Python 爬虫获取按关键字搜索淘宝商品的完整指南

在电商数据分析和市场研究中&#xff0c;获取商品的详细信息是至关重要的一步。淘宝作为中国最大的电商平台之一&#xff0c;提供了丰富的商品数据。通过 Python 爬虫技术&#xff0c;我们可以高效地获取按关键字搜索的淘宝商品信息。本文将详细介绍如何利用 Python 爬虫技术获…...

LeetCode 0080.删除有序数组中的重复项 II:双指针 - C++/Java5 行版

【LetMeFly】80.删除有序数组中的重复项 II&#xff1a;双指针 - C/Java5 行版 力扣题目链接&#xff1a;https://leetcode.cn/problems/remove-duplicates-from-sorted-array-ii/ 给你一个有序数组 nums &#xff0c;请你 原地 删除重复出现的元素&#xff0c;使得出现次数超…...

【C++高并发服务器WebServer】-15:poll、epoll详解及实现

本文目录 一、poll二、epoll2.1 相对poll和select的优点2.2 epoll的api2.3 epoll的demo实现2.5 epoll的工作模式 一、poll poll是对select的一个改进&#xff0c;我们先来看看select的缺点。 我们来看看poll的实现。 struct pollfd {int fd; /* 委托内核检测的文件描述符 */s…...

MapReduce是什么?

MapReduce 是一种编程模型&#xff0c;最初由 Google 提出&#xff0c;旨在处理大规模数据集。它是分布式计算的一个重要概念&#xff0c;通常用于处理海量数据并进行并行计算。MapReduce的基本思想是将计算任务分解为两个阶段&#xff1a;Map 阶段和 Reduce 阶段。 Map 阶段&a…...

git提交到GitHub问题汇总

1.main->master git默认主分支是maser&#xff0c;如果是按照这个分支名push&#xff0c;GitHub会出现两个branch&#xff0c;与预期不符 解决方案&#xff1a;更改原始主分支名为main git config --global init.defaultBranch main2.git&#xff1a;OpenSSL SSL_read: SS…...

CNN-GRU卷积神经网络门控循环单元多变量多步预测,光伏功率预测(Matlab完整源码和数据)

代码地址&#xff1a;CNN-GRU卷积神经网络门控循环单元多变量多步预测&#xff0c;光伏功率预测&#xff08;Matlab完整源码和数据) CNN-GRU卷积神经网络门控循环单元多变量多步预测&#xff0c;光伏功率预测 一、引言 1.1、研究背景和意义 随着全球能源危机和环境问题的日…...

编译原理面试问答

编译原理面试拷打 1.编译原理的基本概念 编译原理是研究如何将高级程序语言转换为计算机可执行代码的理论与技术&#xff0c;其核心目标是实现高效、正确的代码翻译。 **编译器&#xff1a;**将源代码转化为目标代码&#xff08;机器码、字节码等&#xff09;。一次翻译整个程…...

LIMO:上海交大的工作 “少即是多” LLM 推理

25年2月来自上海交大、SII 和 GAIR 的论文“LIMO: Less is More for Reasoning”。 一个挑战是在大语言模型&#xff08;LLM&#xff09;中的复杂推理。虽然传统观点认为复杂的推理任务需要大量的训练数据&#xff08;通常超过 100,000 个示例&#xff09;&#xff0c;但本文展…...