WebExtension.cs 7.3 KB

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