WebExtension.cs 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. using Masuit.Tools.Core.Config;
  2. using Masuit.Tools.Models;
  3. using Microsoft.AspNetCore.Http;
  4. using Newtonsoft.Json;
  5. using System;
  6. using System.Collections.Generic;
  7. using System.Linq;
  8. using System.Linq.Expressions;
  9. using System.Net.Http;
  10. using System.Threading;
  11. using System.Threading.Tasks;
  12. namespace Masuit.Tools.Core.Net
  13. {
  14. /// <summary>
  15. /// Web操作扩展
  16. /// </summary>
  17. public static class WebExtension
  18. {
  19. #region 获取客户端IP地址信息
  20. /// <summary>
  21. /// 根据IP地址获取详细地理信息
  22. /// </summary>
  23. /// <param name="ip"></param>
  24. /// <returns></returns>
  25. public static async Task<Tuple<string, List<string>>> GetIPAddressInfo(this string ip)
  26. {
  27. var address = await GetPhysicsAddressInfo(ip);
  28. if (address?.Status == 0)
  29. {
  30. string detail = $"{address.AddressResult.FormattedAddress} {address.AddressResult.AddressComponent.Direction}{address.AddressResult.AddressComponent.Distance ?? "0"}米";
  31. var pois = address.AddressResult.Pois.Select(p => $"{p.AddressDetail}{p.Name} {p.Direction}{p.Distance ?? "0"}米").ToList();
  32. return new Tuple<string, List<string>>(detail, pois);
  33. }
  34. return new Tuple<string, List<string>>("IP地址不正确", new List<string>());
  35. }
  36. private static readonly HttpClient HttpClient = new HttpClient();
  37. private static readonly CancellationTokenSource _cts = new CancellationTokenSource(TimeSpan.FromSeconds(10));
  38. /// <summary>
  39. /// 根据IP地址获取详细地理信息对象
  40. /// </summary>
  41. /// <param name="ip"></param>
  42. /// <returns></returns>
  43. public static async Task<PhysicsAddress> GetPhysicsAddressInfo(this string ip)
  44. {
  45. if (!ip.MatchInetAddress())
  46. {
  47. return null;
  48. }
  49. var ak = ConfigHelper.GetConfigOrDefault("BaiduAK", null) ?? throw new Exception("未配置BaiduAK,请先在您的应用程序appsettings.json中下添加BaiduAK配置节(注意大小写);或手动在程序入口处调用IConfiguration的AddToMasuitTools方法");
  50. HttpClient.DefaultRequestHeaders.Referrer = new Uri("http://lbsyun.baidu.com/jsdemo.htm");
  51. var ipAddress = await HttpClient.GetAsync($"http://api.map.baidu.com/location/ip?ak={ak}&ip={ip}&coor=bd09ll", _cts.Token).ContinueWith(t =>
  52. {
  53. if (t.IsCanceled || t.IsFaulted)
  54. {
  55. return null;
  56. }
  57. if (t.Result.IsSuccessStatusCode)
  58. {
  59. using var content = t.Result.Content;
  60. return JsonConvert.DeserializeObject<BaiduIP>(content.ReadAsStringAsync().Result);
  61. }
  62. return null;
  63. });
  64. if (ipAddress?.Status == 0)
  65. {
  66. var point = ipAddress.AddressInfo.LatiLongitude;
  67. var result = await HttpClient.GetAsync($"http://api.map.baidu.com/geocoder/v2/?location={point.Y},{point.X}&output=json&pois=1&radius=1000&latest_admin=1&coordtype=bd09ll&ak={ak}", _cts.Token).ContinueWith(t =>
  68. {
  69. if (t.IsCanceled || t.IsFaulted)
  70. {
  71. return null;
  72. }
  73. if (t.Result.IsSuccessStatusCode)
  74. {
  75. using var content = t.Result.Content;
  76. return JsonConvert.DeserializeObject<PhysicsAddress>(content.ReadAsStringAsync().Result);
  77. }
  78. return null;
  79. });
  80. if (result?.Status == 0)
  81. {
  82. return result;
  83. }
  84. }
  85. else
  86. {
  87. var taobaoIp = await HttpClient.GetAsync($"http://ip.taobao.com/service/getIpInfo.php?ip={ip}", _cts.Token).ContinueWith(t =>
  88. {
  89. if (t.IsCanceled || t.IsFaulted)
  90. {
  91. return null;
  92. }
  93. if (t.Result.IsSuccessStatusCode)
  94. {
  95. using var content = t.Result.Content;
  96. return JsonConvert.DeserializeObject<TaobaoIP>(content.ReadAsStringAsync().Result);
  97. }
  98. return null;
  99. });
  100. if (taobaoIp?.Code == 0)
  101. {
  102. return new PhysicsAddress()
  103. {
  104. Status = 0,
  105. AddressResult = new AddressResult()
  106. {
  107. FormattedAddress = taobaoIp.IpData.Country + taobaoIp.IpData.Region + taobaoIp.IpData.City,
  108. AddressComponent = new AddressComponent()
  109. {
  110. Province = taobaoIp.IpData.Region
  111. },
  112. Pois = new List<Pois>()
  113. }
  114. };
  115. }
  116. }
  117. return null;
  118. }
  119. /// <summary>
  120. /// 根据IP地址获取ISP
  121. /// </summary>
  122. /// <param name="ip"></param>
  123. /// <returns></returns>
  124. public static string GetISP(this string ip)
  125. {
  126. if (!ip.MatchInetAddress())
  127. {
  128. return $"{ip}不是一个合法的IP";
  129. }
  130. var task = HttpClient.GetAsync($"http://ip.taobao.com/service/getIpInfo.php?ip={ip}", _cts.Token).ContinueWith(t =>
  131. {
  132. if (t.IsCanceled || t.IsFaulted)
  133. {
  134. return $"未能找到{ip}的ISP信息";
  135. }
  136. if (t.Result.IsSuccessStatusCode)
  137. {
  138. using var content = t.Result.Content;
  139. var taobaoIp = JsonConvert.DeserializeObject<TaobaoIP>(content.ReadAsStringAsync().Result);
  140. if (taobaoIp.Code == 0)
  141. {
  142. return taobaoIp.IpData.Isp;
  143. }
  144. }
  145. return $"未能找到{ip}的ISP信息";
  146. });
  147. return task.Result;
  148. }
  149. #endregion 获取客户端IP地址信息
  150. /// <summary>
  151. /// 写Session
  152. /// </summary>
  153. /// <param name="session"></param>
  154. /// <param name="key">键</param>
  155. /// <param name="value">值</param>
  156. public static void Set(this ISession session, string key, object value)
  157. {
  158. session.SetString(key, value.ToJsonString());
  159. }
  160. /// <summary>
  161. /// 获取Session
  162. /// </summary>
  163. /// <typeparam name="T">对象</typeparam>
  164. /// <param name="session"></param>
  165. /// <param name="key">键</param>
  166. /// <returns>对象</returns>
  167. public static T Get<T>(this ISession session, string key)
  168. {
  169. string value = session.GetString(key);
  170. if (string.IsNullOrEmpty(value))
  171. {
  172. return typeof(T).Namespace switch
  173. {
  174. "System.Collections.Generic" => (T)(Expression.Lambda(Expression.New(typeof(T))).Compile().DynamicInvoke()),
  175. _ => default
  176. };
  177. }
  178. return JsonConvert.DeserializeObject<T>(value);
  179. }
  180. }
  181. }