crawler.cs 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445
  1. using Microsoft.AspNetCore.Http;
  2. using Microsoft.AspNetCore.Mvc.Controllers;
  3. using Microsoft.AspNetCore.Mvc.Filters;
  4. using System;
  5. using System.Collections.Generic;
  6. using System.Linq;
  7. using System.Text;
  8. using dodohold.core;
  9. using Dataoke;
  10. using System.Text.RegularExpressions;
  11. using Org.BouncyCastle.Ocsp;
  12. using System.Diagnostics;
  13. using TencentCloud.Fmu.V20191213.Models;
  14. using Microsoft.VisualBasic;
  15. using System.Text.Json;
  16. using static System.Runtime.InteropServices.JavaScript.JSType;
  17. using TencentCloud.Cdn.V20180606.Models;
  18. using System.Net;
  19. using TencentCloud.Teo.V20220901.Models;
  20. using MySqlX.XDevAPI;
  21. namespace molilian.core
  22. {
  23. public partial class AlimamaPlus
  24. {
  25. /// <summary>
  26. /// 更新API调用日志(1天一次)
  27. /// </summary>
  28. /// <param name="intervalDay"></param>
  29. public static void DailyLogs(int intervalDay)
  30. {
  31. string sql = @$"
  32. INSERT INTO daily_logs (channel, accountName, log_date, total_count, abandon_count, abandon_percentage, success_count, success_percentage, create_time, last_time)
  33. SELECT
  34. 0 AS channel, 'all' AS accountName,
  35. DATE_SUB(CURDATE(), INTERVAL {intervalDay} DAY) AS log_date,
  36. COUNT(*) AS total_count,
  37. COALESCE(SUM(CASE WHEN message = '放弃转链' THEN 1 ELSE 0 END), 0) AS abandon_count,
  38. COALESCE(CONCAT(ROUND((SUM(CASE WHEN message = '放弃转链' THEN 1 ELSE 0 END) / COUNT(*)) * 100, 2), '%'), 0) AS abandon_percentage,
  39. COALESCE(SUM(CASE WHEN success = 1 THEN 1 ELSE 0 END), 0) AS success_count,
  40. COALESCE(CONCAT(ROUND((SUM(CASE WHEN success = 1 THEN 1 ELSE 0 END) / COUNT(*)) * 100, 2), '%'), 0) AS success_percentage,
  41. NOW() AS create_time,
  42. NOW() AS last_time
  43. FROM tk_logs
  44. WHERE DATE(create_time) = DATE_SUB(CURDATE(), INTERVAL {intervalDay} DAY)
  45. ON DUPLICATE KEY UPDATE
  46. log_date = VALUES(log_date),
  47. total_count = VALUES(total_count),
  48. abandon_count = VALUES(abandon_count),
  49. abandon_percentage = VALUES(abandon_percentage),
  50. success_count = VALUES(success_count),
  51. success_percentage = VALUES(success_percentage),
  52. last_time = NOW();
  53. ";
  54. string sql2 = @$"
  55. INSERT INTO daily_logs (channel, accountName, log_date, total_count, abandon_count, abandon_percentage, success_count, success_percentage, create_time, last_time)
  56. SELECT
  57. channel, accountName, DATE_SUB(CURDATE(), INTERVAL {intervalDay} DAY) AS log_date,
  58. COUNT(*) AS total_count,
  59. COALESCE(SUM(CASE WHEN message = '放弃转链' THEN 1 ELSE 0 END), 0) AS abandon_count,
  60. COALESCE(CONCAT(ROUND((SUM(CASE WHEN message = '放弃转链' THEN 1 ELSE 0 END) / COUNT(*)) * 100, 2), '%'), 0) AS abandon_percentage,
  61. COALESCE(SUM(CASE WHEN success = 1 THEN 1 ELSE 0 END), 0) AS success_count,
  62. COALESCE(CONCAT(ROUND((SUM(CASE WHEN success = 1 THEN 1 ELSE 0 END) / COUNT(*)) * 100, 2), '%'), 0) AS success_percentage,
  63. NOW() AS create_time,
  64. NOW() AS last_time
  65. FROM tk_logs
  66. WHERE DATE(create_time) = DATE_SUB(CURDATE(), INTERVAL {intervalDay} DAY)
  67. GROUP BY channel, accountName
  68. ON DUPLICATE KEY UPDATE
  69. log_date = VALUES(log_date),
  70. total_count = VALUES(total_count),
  71. abandon_count = VALUES(abandon_count),
  72. abandon_percentage = VALUES(abandon_percentage),
  73. success_count = VALUES(success_count),
  74. success_percentage = VALUES(success_percentage),
  75. last_time = NOW();
  76. ";
  77. DBContext.Execute(sql, new { });
  78. DBContext.Execute(sql2, new { });
  79. }
  80. /// <summary>
  81. /// 事实动态接口(5分钟一次)
  82. /// </summary>
  83. /// <param name="date"></param>
  84. public void SaveReportOverview()
  85. {
  86. DateTime date = DateTime.Now;
  87. TkReportDTO result = new TkReportDTO();
  88. try
  89. {
  90. string t = $"{date.Convert2UnixTimestamp(true)}";
  91. string dt = date.ToString("yyyy-MM-dd");
  92. string url = "https://pub.alimama.com/openapi/param2/1/gateway.unionpub/data.lens.report.overview.json?" +
  93. $"t={t}&_tb_token_={_tb_token}&ruleEnum=pub_overview&startDate={dt}&endDate={dt}&fixPeriod=1d";
  94. var client = new WebClientUtility().SetContentType("application/json;charset=utf-8")
  95. .AddHeaders("X-Requested-With", "XMLHttpRequest")
  96. .AddHeaders("Cookie", _cookies);
  97. client.Proxy = _proxy;
  98. if (!string.IsNullOrEmpty(_user_agent)) client.UserAgent = _user_agent;
  99. var response = client.Request(url);
  100. var body = response.Body();
  101. var root = body.Convert2JsonElement();
  102. int resultCode = root.Read<int>("resultCode", 0);
  103. bool success = root.Read("success", false);
  104. if (!success)
  105. {
  106. new LoggerLibrary("report", "error")
  107. .Info(url, body)
  108. .Save();
  109. throw new Exception(body);
  110. }
  111. var data = root.ElementRead("data").ElementRead("data");
  112. result.eff_ord_num = data.Read<int>("eff_ord_num", 0);
  113. result.eff_ord_amt = data.Read<decimal>("eff_ord_amt", 0);
  114. result.eff_tk_disp_tfee = data.Read<decimal>("eff_tk_disp_tfee", 0);
  115. result.uclk_uv_56 = data.Read<int>("uclk_uv_56", 0);
  116. result.uclk_pv_56 = data.Read<int>("uclk_pv_56", 0);
  117. result.uclt_uv_56 = data.Read<int>("uclt_uv_56", 0);
  118. result.ucart_uv_56 = data.Read<int>("ucart_uv_56", 0);
  119. result.dep_ord_num_56 = data.Read<int>("dep_ord_num_56", 0);
  120. result.dep_ord_dep_amt_56 = data.Read<decimal>("dep_ord_dep_amt_56", 0);
  121. result.pay_ord_num_56 = data.Read<int>("pay_ord_num_56", 0);
  122. result.pay_ord_amt_56 = data.Read<decimal>("pay_ord_amt_56", 0);
  123. result.pay_tk_disp_tfee_56 = data.Read<decimal>("pay_tk_disp_tfee_56", 0);
  124. result.pay_ord_uv_56 = data.Read<int>("pay_ord_uv_56", 0);
  125. result.sett_ord_num_56 = data.Read<int>("sett_ord_num_56", 0);
  126. result.sett_ord_amt_56 = data.Read<decimal>("sett_ord_amt_56", 0);
  127. result.sett_tk_disp_tfee_56 = data.Read<decimal>("sett_tk_disp_tfee_56", 0);
  128. result.eff_tk_disp_tfee = data.Read<decimal>("eff_tk_disp_tfee", 0);
  129. result.eff_tk_disp_tfee = data.Read<decimal>("eff_tk_disp_tfee", 0);
  130. result.eff_tk_disp_tfee = data.Read<decimal>("eff_tk_disp_tfee", 0);
  131. result.eff_tk_disp_tfee = data.Read<decimal>("eff_tk_disp_tfee", 0);
  132. result.eff_tk_disp_tfee = data.Read<decimal>("eff_tk_disp_tfee", 0);
  133. result.eff_tk_disp_tfee = data.Read<decimal>("eff_tk_disp_tfee", 0);
  134. DateTime report_date = date.Date;
  135. if (report_date == DateTime.Now.Date)
  136. {
  137. TkPoolCore.SaveIncomeAmt(_accountName, result.eff_tk_disp_tfee);
  138. EachSaveReportOverview(report_date.AddHours(DateTime.Now.Hour), "tk_report_hourtrend", result);
  139. EachSaveReportOverview(report_date, "tk_report", result);
  140. }
  141. }
  142. catch (Exception ex) { }
  143. }
  144. private void EachSaveReportOverview(DateTime report_date, string tableName, TkReportDTO data)
  145. {
  146. var exist = new DBContext.Table(tableName)
  147. .Fields("id,report_date")
  148. .Get<dynamic>("report_date=@report_date AND accountName=@accountName",
  149. new { report_date, accountName = _accountName });
  150. var createArgs = new DBContext.Table(tableName)
  151. .Add("uclk_uv_56", data.uclk_uv_56)
  152. .Add("uclk_pv_56", data.uclk_pv_56)
  153. .Add("uclt_uv_56", data.uclt_uv_56)
  154. .Add("ucart_uv_56", data.ucart_uv_56)
  155. .Add("dep_ord_num_56", data.dep_ord_num_56)
  156. .Add("dep_ord_dep_amt_56", data.dep_ord_dep_amt_56)
  157. .Add("pay_ord_num_56", data.pay_ord_num_56)
  158. .Add("pay_ord_amt_56", data.pay_ord_amt_56)
  159. .Add("pay_tk_disp_tfee_56", data.pay_tk_disp_tfee_56)
  160. .Add("pay_ord_uv_56", data.pay_ord_uv_56)
  161. .Add("sett_ord_num_56", data.sett_ord_num_56)
  162. .Add("sett_ord_amt_56", data.sett_ord_amt_56)
  163. .Add("sett_tk_disp_tfee_56", data.sett_tk_disp_tfee_56)
  164. .Add("eff_ord_num", data.eff_ord_num)
  165. .Add("eff_ord_amt", data.eff_ord_amt)
  166. .Add("eff_tk_disp_tfee", data.eff_tk_disp_tfee);
  167. if (exist == null)
  168. {
  169. createArgs.Add("accountName", _accountName)
  170. .Add("report_date", report_date)
  171. .Add("create_time", DateTime.Now)
  172. .Add("last_time", DateTime.Now)
  173. .Create();
  174. }
  175. else
  176. {
  177. createArgs.Add("last_time", DateTime.Now)
  178. .Where("id=@id", new { exist.id })
  179. .Update();
  180. }
  181. }
  182. /// <summary>
  183. /// 修正点击数
  184. /// </summary>
  185. public void FixReport(DateTime date)
  186. {
  187. TkReportDTO result = new TkReportDTO();
  188. try
  189. {
  190. string t = $"{date.Convert2UnixTimestamp(true)}";
  191. string dt = date.ToString("yyyy-MM-dd");
  192. string url = "https://pub.alimama.com/openapi/param2/1/gateway.unionpub/data.lens.report.overview.json?" +
  193. $"t={t}&_tb_token_={_tb_token}&ruleEnum=pub_overview&startDate={dt}&endDate={dt}&fixPeriod=1d";
  194. var client = new WebClientUtility().SetContentType("application/json;charset=utf-8")
  195. .AddHeaders("X-Requested-With", "XMLHttpRequest")
  196. .AddHeaders("Cookie", _cookies);
  197. client.Proxy = _proxy;
  198. if (!string.IsNullOrEmpty(_user_agent)) client.UserAgent = _user_agent;
  199. var response = client.Request(url);
  200. var body = response.Body();
  201. var root = body.Convert2JsonElement();
  202. int resultCode = root.Read<int>("resultCode", 0);
  203. bool success = root.Read("success", false);
  204. if (!success)
  205. {
  206. new LoggerLibrary("report", "error")
  207. .Info(url, body)
  208. .Save();
  209. throw new Exception(body);
  210. }
  211. var data = root.ElementRead("data").ElementRead("data");
  212. result.fix_uclk_pv_56 = data.Read<int>("uclk_pv_56", 0);
  213. DateTime report_date = date.Date;
  214. var exist = new DBContext.Table("tk_report")
  215. .Fields("id,report_date")
  216. .Get<dynamic>("report_date=@report_date AND accountName=@accountName",
  217. new { report_date, accountName = _accountName });
  218. var createArgs = new DBContext.Table("tk_report")
  219. .Add("fix_uclk_pv_56", result.fix_uclk_pv_56);
  220. if (exist == null)
  221. {
  222. createArgs.Add("accountName", _accountName)
  223. .Add("report_date", report_date)
  224. .Add("create_time", DateTime.Now)
  225. .Add("last_time", DateTime.Now)
  226. .Create();
  227. }
  228. else
  229. {
  230. createArgs.Add("last_time", DateTime.Now)
  231. .Where("id=@id", new { exist.id })
  232. .Update();
  233. }
  234. }
  235. catch (Exception ex) { }
  236. }
  237. /// <summary>
  238. /// 1小时更新一次
  239. /// </summary>
  240. public void SaveReportHourtrend(DateTime date)
  241. {
  242. string t = $"{DateTime.Now.Convert2UnixTimestamp(true)}";
  243. string dt = date.ToString("yyyy-MM-dd");
  244. string url = "https://pub.alimama.com/openapi/param2/1/gateway.unionpub/data.lens.report.hourtrend.dod.json?" +
  245. $"t={t}&_tb_token_={_tb_token}&ruleEnum=pub_homepage&startDate={dt}&endDate={dt}&fixPeriod=realTime";
  246. var client = new WebClientUtility().SetContentType("application/json;charset=utf-8")
  247. .AddHeaders("X-Requested-With", "XMLHttpRequest")
  248. .AddHeaders("Cookie", _cookies);
  249. client.Proxy = _proxy;
  250. if (!string.IsNullOrEmpty(_user_agent)) client.UserAgent = _user_agent;
  251. var response = client.Request(url);
  252. var body = response.Body();
  253. var root = body.Convert2JsonElement();
  254. int resultCode = root.Read<int>("resultCode", 0);
  255. bool success = root.Read("success", false);
  256. if (!success)
  257. {
  258. new LoggerLibrary("report", "error")
  259. .Info(url, body)
  260. .Save();
  261. throw new Exception(body);
  262. }
  263. var data_list = root.ElementRead("data").ElementRead("data");
  264. foreach (var data in data_list.EnumerateArray())
  265. {
  266. string xAxis = data.Read<string>("xAxis");
  267. string _report_date = $"{dt} {xAxis}";
  268. EachSaveReport(_report_date, "tk_report_hourtrend", data);
  269. if ("23:00".Equals(xAxis))
  270. {
  271. EachSaveReport(dt, "tk_report", data);
  272. }
  273. }
  274. }
  275. private void EachSaveReport(string _report_date, string tableName, JsonElement data)
  276. {
  277. _ = DateTime.TryParse(_report_date, out DateTime report_date);
  278. var exist = new DBContext.Table(tableName)
  279. .Fields("id,report_date")
  280. .Get<dynamic>("report_date=@report_date AND accountName=@accountName",
  281. new { report_date, accountName = _accountName });
  282. if (exist == null)
  283. {
  284. new DBContext.Table(tableName)
  285. .Fill(data)
  286. .Loader<int>("uclk_uv_56", 0)
  287. .Loader<int>("uclk_pv_56", 0)
  288. .Loader<int>("uclt_uv_56", 0)
  289. .Loader<int>("ucart_uv_56", 0)
  290. .Loader<int>("dep_ord_num_56", 0)
  291. .Loader<decimal>("dep_ord_dep_amt_56", 0)
  292. .Loader<int>("pay_ord_num_56", 0)
  293. .Loader<decimal>("pay_ord_amt_56", 0)
  294. .Loader<decimal>("pay_tk_disp_tfee_56", 0)
  295. .Loader<int>("pay_ord_uv_56", 0)
  296. .Loader<int>("sett_ord_num_56", 0)
  297. .Loader<decimal>("sett_ord_amt_56", 0)
  298. .Loader<decimal>("sett_tk_disp_tfee_56", 0)
  299. .Add("accountName", _accountName)
  300. .Add("report_date", report_date)
  301. .Add("create_time", DateTime.Now)
  302. .Add("last_time", DateTime.Now)
  303. .Create();
  304. }
  305. else
  306. {
  307. new DBContext.Table(tableName)
  308. .Fill(data)
  309. .Loader<int>("uclk_uv_56", 0)
  310. .Loader<int>("uclk_pv_56", 0)
  311. .Loader<int>("uclt_uv_56", 0)
  312. .Loader<int>("ucart_uv_56", 0)
  313. .Loader<int>("dep_ord_num_56", 0)
  314. .Loader<decimal>("dep_ord_dep_amt_56", 0)
  315. .Loader<int>("pay_ord_num_56", 0)
  316. .Loader<decimal>("pay_ord_amt_56", 0)
  317. .Loader<decimal>("pay_tk_disp_tfee_56", 0)
  318. .Loader<int>("pay_ord_uv_56", 0)
  319. .Loader<int>("sett_ord_num_56", 0)
  320. .Loader<decimal>("sett_ord_amt_56", 0)
  321. .Loader<decimal>("sett_tk_disp_tfee_56", 0)
  322. .Add("last_time", DateTime.Now)
  323. .Where("id=@id", new { exist.id })
  324. .Update();
  325. }
  326. }
  327. /// <summary>
  328. /// 警告消息
  329. /// </summary>
  330. public void GetViolationuWarning()
  331. {
  332. try
  333. {
  334. string url = "https://media.alimama.com/violationu2/warning_instance_page_v2.json?r=mx_208&toPage=1&pageSize=40&params=";
  335. var client = new WebClientUtility().SetContentType("application/json;charset=utf-8")
  336. .AddHeaders("X-Requested-With", "XMLHttpRequest")
  337. .AddHeaders("Cookie", _cookies);
  338. client.Proxy = _proxy;
  339. if (!string.IsNullOrEmpty(_user_agent)) client.UserAgent = _user_agent;
  340. var response = client.Request(url);
  341. var body = response.Body();
  342. var root = body.Convert2JsonElement();
  343. int resultCode = root.Read<int>("resultCode", 0);
  344. int totalCount = root.PathRead<int>("data.totalCount", 0);
  345. bool success = root.Read("success", false);
  346. if (!success)
  347. {
  348. new LoggerLibrary("violationu", "warning_error")
  349. .Info(url, body)
  350. .Save();
  351. throw new Exception(body);
  352. }
  353. if (totalCount == 0) return;
  354. new LoggerLibrary("violationu", "warning").Info(url, body).Save();
  355. var list = root.ElementRead("data").ElementRead("result").EnumerateArray();
  356. foreach (var data in list)
  357. {
  358. var violation_commission = data.PathRead<decimal>("mediaInfo.订单虚假交易违规佣金", 0);
  359. new DBContext.Table("alimama_warning")
  360. .Fill(data)
  361. .Loader<int>("filterRuleId", 0)
  362. .Loader<long>("gmtCreate", 0)
  363. .Loader<long>("id", 0, "ali_id")
  364. .Loader<string>("idStr", string.Empty)
  365. .Loader<int>("mediaDimension", 0)
  366. .Loader<long>("mediaId", 0)
  367. .Loader<int>("mediaInfo.abn_cnt", 0, "abn_cnt")
  368. .Add("violation_commission", violation_commission)
  369. .Loader<int>("mediaInfo.warning_cnt", 0, "warning_cnt")
  370. .Loader<string>("mediaName", string.Empty)
  371. .Loader<long>("memberId", 0)
  372. .Loader<string>("noticeCategory", string.Empty)
  373. .Loader<int>("noticeTemplateId", 0)
  374. .Loader<string>("noticeTemplateName", string.Empty)
  375. .Loader<string>("orderFile", string.Empty)
  376. .Loader<string>("pid", string.Empty)
  377. .Loader<int>("punishRuleId", 0)
  378. .Loader<string>("riskType", string.Empty)
  379. .Loader<string>("roleName", string.Empty)
  380. .Loader<string>("ruleLink", string.Empty)
  381. .Loader<bool>("showOrderDetail", false)
  382. .Loader<int>("status", 0, "ali_status")
  383. .Loader<string>("warningText", string.Empty)
  384. .Add("accountName", _accountName)
  385. .Add("status", true)
  386. .Add("create_time", DateTime.Now)
  387. .Add("last_time", DateTime.Now)
  388. .Create(DBContext.InsertType.REPLACE);
  389. }
  390. }
  391. catch (Exception ex) { }
  392. }
  393. }
  394. }