using AngleSharp; using DnsClient; using Masuit.Tools.Mime; using Masuit.Tools.Core.Validator; using Microsoft.Net.Http.Headers; using System.Net; using TimeZoneConverter; using Configuration = AngleSharp.Configuration; namespace Masuit.MyBlogs.Core.Controllers; /// /// 黑科技 /// [Route("tools")] public sealed class ToolsController(IHttpClientFactory httpClientFactory) : BaseController { private readonly HttpClient _httpClient = httpClientFactory.CreateClient(); /// /// 获取ip地址详细信息 /// /// /// [Route("ip"), Route("ip/{ip?}", Order = 1), ResponseCache(Duration = 600, VaryByQueryKeys = new[] { "ip" })] public async Task GetIpInfo([IsIPAddress] string ip) { ViewBag.IP = ip; if (!IPAddress.TryParse(ip, out var ipAddress)) { ipAddress = ClientIP; ViewBag.IP = ClientIP; } if (ipAddress.IsPrivateIP()) { return Ok("内网IP"); } var loc = ipAddress.GetIPLocation(); var asn = ipAddress.GetIPAsn(); var nslookup = new LookupClient(); using var cts = new CancellationTokenSource(2000); var domain = await nslookup.QueryReverseAsync(ipAddress, cts.Token).ContinueWith(t => t.IsCompletedSuccessfully ? t.Result.Answers.Select(r => r.ToString()).Join("; ") : "无"); var address = new IpInfo { Location = loc.Coodinate, Address = loc.Address, Address2 = loc.Address2, Network = new NetworkInfo { Asn = asn.AutonomousSystemNumber, Router = asn.Network + "", Organization = loc.ISP }, Network2 = loc.Network2, TimeZone = loc.Coodinate.TimeZone + $" UTC{TZConvert.GetTimeZoneInfo(loc.Coodinate.TimeZone ?? "Asia/Shanghai").BaseUtcOffset.Hours:+#;-#;0}", IsProxy = loc.Network.Contains(["cloud", "Compute", "Serv", "Tech", "Solution", "Host", "云", "Datacenter", "Data Center", "Business", "ASN"]) || domain.Length > 1 || await IsProxy(ipAddress, cts.Token), Domain = domain }; if (Request.Method.Equals(HttpMethods.Get) || (Request.Headers[HeaderNames.Accept] + "").StartsWith(ContentType.Json)) { return View(address); } return Json(address); } /// /// 是否是代理ip /// /// /// /// private async Task IsProxy(IPAddress ip, CancellationToken cancellationToken = default) { _httpClient.DefaultRequestHeaders.UserAgent.ParseAdd("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36 Edg/92.0.902.62"); return await _httpClient.GetStringAsync("https://ipinfo.io/" + ip, cancellationToken).ContinueWith(t => { if (t.IsCompletedSuccessfully) { var ctx = BrowsingContext.New(Configuration.Default); var doc = ctx.OpenAsync(res => res.Content(t.Result)).Result; var isAnycast = doc.DocumentElement.QuerySelectorAll(".title").Where(e => e.TextContent.Contains("Anycast")).Select(e => e.Parent).Any(n => n.TextContent.Contains("True")); var isproxy = doc.DocumentElement.QuerySelectorAll("#block-privacy img").Any(e => e.OuterHtml.Contains("right")); return isAnycast || isproxy; } return false; }); } [HttpGet("loan")] public ActionResult Loan() { return View(); } }