crawler.cs 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682
  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, string prefix = "", string channel = "all")
  30. {
  31. var db_prefix = prefix;
  32. if (channel == "tool")
  33. {
  34. db_prefix = "tool_";
  35. }
  36. DateTime log_date = DateTime.Now.AddDays(-intervalDay).Date;
  37. var accounts = TkPoolCore.List();
  38. foreach (var account in accounts)
  39. {
  40. int accountId = account.id;
  41. string accountName = $"{TkChannelEnum.tb}_{account.id}";
  42. int total_count = TkLogCore.GetTotal($":{prefix}total:{accountName}:{log_date:yyyyMMdd}");
  43. if (total_count == 0) accountName = account.name;
  44. total_count = TkLogCore.GetTotal($":{prefix}total:{accountName}:{log_date:yyyyMMdd}");
  45. if (total_count == 0) continue;
  46. var success_count = TkLogCore.GetTotal($":{prefix}total:{accountName}:success:{log_date:yyyyMMdd}");
  47. var abandon_count = TkLogCore.GetTotal($":{prefix}total:{accountName}:放弃转链:{log_date:yyyyMMdd}");
  48. string success_percentage = string.Empty;
  49. string abandon_percentage = string.Empty;
  50. if (total_count > 0)
  51. {
  52. success_percentage = $"{success_count / (double)total_count * 100:f2}%";
  53. abandon_percentage = $"{abandon_count / (double)total_count * 100:f2}%";
  54. }
  55. var exist = new DBContext.Table("daily_logs")
  56. .Fields("id,log_date")
  57. .Get<dynamic>("log_date=@log_date AND accountId=@accountId", new { log_date, accountId });
  58. var createArgs = new DBContext.Table("daily_logs")
  59. .Add($"{db_prefix}total_count", total_count)
  60. .Add($"{db_prefix}abandon_count", abandon_count)
  61. .Add($"{db_prefix}abandon_percentage", abandon_percentage)
  62. .Add($"{db_prefix}success_count", success_count)
  63. .Add($"{db_prefix}success_percentage", success_percentage)
  64. .Add("last_time", DateTime.Now);
  65. if (exist == null)
  66. {
  67. createArgs.Add("channel", 0)
  68. .Add("accountId", accountId)
  69. .Add("accountName", account.company)
  70. .Add("log_date", log_date)
  71. .Add("create_time", DateTime.Now)
  72. .Create();
  73. }
  74. else
  75. {
  76. createArgs.Where("id=@id", new { exist.id }).Update();
  77. }
  78. }
  79. int all_total_count = TkLogCore.GetTotal($":{prefix}total:{channel}:{log_date:yyyyMMdd}");
  80. var all_success_count = TkLogCore.GetTotal($":{prefix}total:{channel}:success:{log_date:yyyyMMdd}");
  81. var all_abandon_count = TkLogCore.GetTotal($":{prefix}total:{channel}:放弃转链:{log_date:yyyyMMdd}");
  82. string all_success_percentage = string.Empty;
  83. string all_abandon_percentage = string.Empty;
  84. if (all_total_count > 0)
  85. {
  86. all_success_percentage = $"{all_success_count / (double)all_total_count * 100:f2}%";
  87. all_abandon_percentage = $"{all_abandon_count / (double)all_total_count * 100:f2}%";
  88. }
  89. var exist2 = new DBContext.Table("daily_logs")
  90. .Fields("id,log_date")
  91. .Get<dynamic>("log_date=@log_date AND accountId=@accountId", new { log_date, accountId = 0 });
  92. var createArgs2 = new DBContext.Table("daily_logs")
  93. .Add($"{db_prefix}total_count", all_total_count)
  94. .Add($"{db_prefix}abandon_count", all_abandon_count)
  95. .Add($"{db_prefix}abandon_percentage", all_abandon_percentage)
  96. .Add($"{db_prefix}success_count", all_success_count)
  97. .Add($"{db_prefix}success_percentage", all_success_percentage)
  98. .Add("last_time", DateTime.Now);
  99. if (exist2 == null)
  100. {
  101. createArgs2.Add("channel", 0)
  102. .Add("accountId", 0)
  103. .Add("accountName", "all")
  104. .Add("log_date", log_date)
  105. .Add("create_time", DateTime.Now)
  106. .Create();
  107. }
  108. else
  109. {
  110. createArgs2.Where("id=@id", new { exist2.id }).Update();
  111. }
  112. /*
  113. -- 定义变量用于日期间隔
  114. SET @interval_days = 4;
  115. -- 汇总所有账户的数据
  116. INSERT INTO daily_logs (
  117. channel, accountId, accountName, log_date, total_count, abandon_count, abandon_percentage, success_count, success_percentage, create_time, last_time
  118. )
  119. SELECT
  120. 0 AS channel,
  121. 0 AS accountId,
  122. 'all' AS accountName,
  123. DATE_SUB(CURDATE(), INTERVAL @interval_days DAY) AS log_date,
  124. COUNT(*) AS total_count,
  125. COALESCE(SUM(CASE WHEN message = '放弃转链' THEN 1 ELSE 0 END), 0) AS abandon_count,
  126. COALESCE(CONCAT(ROUND((SUM(CASE WHEN message = '放弃转链' THEN 1 ELSE 0 END) / COUNT(*)) * 100, 2), '%'), 0) AS abandon_percentage,
  127. COALESCE(SUM(CASE WHEN success = 1 THEN 1 ELSE 0 END), 0) AS success_count,
  128. COALESCE(CONCAT(ROUND((SUM(CASE WHEN success = 1 THEN 1 ELSE 0 END) / COUNT(*)) * 100, 2), '%'), 0) AS success_percentage,
  129. NOW() AS create_time,
  130. NOW() AS last_time
  131. FROM tk_logs
  132. WHERE create_time >= DATE_SUB(CURDATE(), INTERVAL @interval_days DAY)
  133. AND create_time < DATE_SUB(CURDATE(), INTERVAL @interval_days - 1 DAY)
  134. ON DUPLICATE KEY UPDATE
  135. total_count = VALUES(total_count),
  136. abandon_count = VALUES(abandon_count),
  137. abandon_percentage = VALUES(abandon_percentage),
  138. success_count = VALUES(success_count),
  139. success_percentage = VALUES(success_percentage),
  140. last_time = NOW();
  141. -- 按渠道、账户分组的数据
  142. INSERT INTO daily_logs (
  143. channel, accountId, accountName, log_date, total_count, abandon_count, abandon_percentage, success_count, success_percentage, create_time, last_time
  144. )
  145. SELECT
  146. channel,
  147. accountId,
  148. accountName,
  149. DATE_SUB(CURDATE(), INTERVAL @interval_days DAY) AS log_date,
  150. COUNT(*) AS total_count,
  151. COALESCE(SUM(CASE WHEN message = '放弃转链' THEN 1 ELSE 0 END), 0) AS abandon_count,
  152. COALESCE(CONCAT(ROUND((SUM(CASE WHEN message = '放弃转链' THEN 1 ELSE 0 END) / COUNT(*)) * 100, 2), '%'), 0) AS abandon_percentage,
  153. COALESCE(SUM(CASE WHEN success = 1 THEN 1 ELSE 0 END), 0) AS success_count,
  154. COALESCE(CONCAT(ROUND((SUM(CASE WHEN success = 1 THEN 1 ELSE 0 END) / COUNT(*)) * 100, 2), '%'), 0) AS success_percentage,
  155. NOW() AS create_time,
  156. NOW() AS last_time
  157. FROM tk_logs
  158. WHERE create_time >= DATE_SUB(CURDATE(), INTERVAL @interval_days DAY)
  159. AND create_time < DATE_SUB(CURDATE(), INTERVAL @interval_days - 1 DAY)
  160. GROUP BY channel, accountId, accountName
  161. ON DUPLICATE KEY UPDATE
  162. total_count = VALUES(total_count),
  163. abandon_count = VALUES(abandon_count),
  164. abandon_percentage = VALUES(abandon_percentage),
  165. success_count = VALUES(success_count),
  166. success_percentage = VALUES(success_percentage),
  167. last_time = NOW();
  168. */
  169. //DBContext.Execute(sql, new { });
  170. //DBContext.Execute(sql2, new { });
  171. }
  172. public static void ApiCallStatistics(int intervalDay, TkChannelEnum channel, string prefix = "")
  173. {
  174. DateTime log_date = DateTime.Now.AddDays(-intervalDay).Date;
  175. var accounts = TkPoolCore.List();
  176. foreach (var account in accounts)
  177. {
  178. int accountId = account.id;
  179. string accountName = $"{channel}_{account.id}";
  180. int total_count = TkLogCore.GetTotal($":{prefix}total:{accountName}:{log_date:yyyyMMdd}");
  181. if (total_count == 0) continue;
  182. var success_count = TkLogCore.GetTotal($":{prefix}total:{accountName}:success:{log_date:yyyyMMdd}");
  183. var abandon_count = TkLogCore.GetTotal($":{prefix}total:{accountName}:放弃转链:{log_date:yyyyMMdd}");
  184. string success_percentage = string.Empty;
  185. string abandon_percentage = string.Empty;
  186. if (total_count > 0)
  187. {
  188. success_percentage = $"{success_count / (double)total_count * 100:f2}%";
  189. abandon_percentage = $"{abandon_count / (double)total_count * 100:f2}%";
  190. }
  191. var exist = new DBContext.Table("api_call_statistics")
  192. .Fields("id,log_date")
  193. .Get<dynamic>("log_date=@log_date AND channel=@channel AND accountId=@accountId",
  194. new { log_date, channel, accountId });
  195. var createArgs = new DBContext.Table("api_call_statistics")
  196. .Add($"{prefix}total_count", total_count)
  197. .Add($"{prefix}abandon_count", abandon_count)
  198. .Add($"{prefix}abandon_percentage", abandon_percentage)
  199. .Add($"{prefix}success_count", success_count)
  200. .Add($"{prefix}success_percentage", success_percentage)
  201. .Add("last_time", DateTime.Now);
  202. if (exist == null)
  203. {
  204. createArgs.Add("channel", channel)
  205. .Add("accountId", accountId)
  206. .Add("accountName", account.company)
  207. .Add("log_date", log_date)
  208. .Add("create_time", DateTime.Now)
  209. .Create();
  210. }
  211. else
  212. {
  213. createArgs.Where("id=@id", new { exist.id }).Update();
  214. }
  215. }
  216. int all_total_count = TkLogCore.GetTotal($":{prefix}total:{channel.ToString()}:{log_date:yyyyMMdd}");
  217. var all_success_count = TkLogCore.GetTotal($":{prefix}total:{channel.ToString()}:success:{log_date:yyyyMMdd}");
  218. var all_abandon_count = TkLogCore.GetTotal($":{prefix}total:{channel.ToString()}:放弃转链:{log_date:yyyyMMdd}");
  219. string all_success_percentage = string.Empty;
  220. string all_abandon_percentage = string.Empty;
  221. if (all_total_count > 0)
  222. {
  223. all_success_percentage = $"{all_success_count / (double)all_total_count * 100:f2}%";
  224. all_abandon_percentage = $"{all_abandon_count / (double)all_total_count * 100:f2}%";
  225. }
  226. var exist2 = new DBContext.Table("api_call_statistics")
  227. .Fields("id,log_date")
  228. .Get<dynamic>("log_date=@log_date AND channel=@channel AND accountId=@accountId",
  229. new { log_date, channel, accountId = 0 });
  230. var createArgs2 = new DBContext.Table("api_call_statistics")
  231. .Add($"{prefix}total_count", all_total_count)
  232. .Add($"{prefix}abandon_count", all_abandon_count)
  233. .Add($"{prefix}abandon_percentage", all_abandon_percentage)
  234. .Add($"{prefix}success_count", all_success_count)
  235. .Add($"{prefix}success_percentage", all_success_percentage)
  236. .Add("last_time", DateTime.Now);
  237. if (exist2 == null)
  238. {
  239. createArgs2.Add("channel", channel)
  240. .Add("accountId", 0)
  241. .Add("accountName", "all")
  242. .Add("log_date", log_date)
  243. .Add("create_time", DateTime.Now)
  244. .Create();
  245. }
  246. else
  247. {
  248. createArgs2.Where("id=@id", new { exist2.id }).Update();
  249. }
  250. }
  251. /// <summary>
  252. /// 事实动态接口(5分钟一次)
  253. /// </summary>
  254. /// <param name="date"></param>
  255. public void SaveReportOverview()
  256. {
  257. DateTime date = DateTime.Now;
  258. TkReportDTO result = new TkReportDTO();
  259. try
  260. {
  261. string t = $"{date.Convert2UnixTimestamp(true)}";
  262. string dt = date.ToString("yyyy-MM-dd");
  263. string url = "https://pub.alimama.com/openapi/param2/1/gateway.unionpub/data.lens.report.overview.json?" +
  264. $"t={t}&_tb_token_={_tb_token}&ruleEnum=pub_overview&startDate={dt}&endDate={dt}&fixPeriod=1d";
  265. var client = new WebClientUtility().SetContentType("application/json;charset=utf-8")
  266. .AddHeaders("X-Requested-With", "XMLHttpRequest")
  267. .AddHeaders("Cookie", _cookies);
  268. #if DEBUG
  269. #else
  270. client.Proxy = _proxy;
  271. #endif
  272. if (!string.IsNullOrEmpty(_user_agent)) client.UserAgent = _user_agent;
  273. var response = client.Request(url);
  274. var body = response.Body();
  275. var root = body.Convert2JsonElement();
  276. int resultCode = root.Read<int>("resultCode", 0);
  277. bool success = root.Read("success", false);
  278. if (!success)
  279. {
  280. _ = new LoggerLibrary("report", "error")
  281. .Info(url, body)
  282. .SaveAsync();
  283. throw new Exception(body);
  284. }
  285. var data = root.ElementRead("data").ElementRead("data");
  286. result.eff_ord_num = data.Read<int>("eff_ord_num", 0);
  287. result.eff_ord_amt = data.Read<decimal>("eff_ord_amt", 0);
  288. result.eff_tk_disp_tfee = data.Read<decimal>("eff_tk_disp_tfee", 0);
  289. result.uclk_uv_56 = data.Read<int>("uclk_uv_56", 0);
  290. result.uclk_pv_56 = data.Read<int>("uclk_pv_56", 0);
  291. result.uclt_uv_56 = data.Read<int>("uclt_uv_56", 0);
  292. result.ucart_uv_56 = data.Read<int>("ucart_uv_56", 0);
  293. result.dep_ord_num_56 = data.Read<int>("dep_ord_num_56", 0);
  294. result.dep_ord_dep_amt_56 = data.Read<decimal>("dep_ord_dep_amt_56", 0);
  295. result.pay_ord_num_56 = data.Read<int>("pay_ord_num_56", 0);
  296. result.pay_ord_amt_56 = data.Read<decimal>("pay_ord_amt_56", 0);
  297. result.pay_tk_disp_tfee_56 = data.Read<decimal>("pay_tk_disp_tfee_56", 0);
  298. result.pay_ord_uv_56 = data.Read<int>("pay_ord_uv_56", 0);
  299. result.sett_ord_num_56 = data.Read<int>("sett_ord_num_56", 0);
  300. result.sett_ord_amt_56 = data.Read<decimal>("sett_ord_amt_56", 0);
  301. result.sett_tk_disp_tfee_56 = data.Read<decimal>("sett_tk_disp_tfee_56", 0);
  302. DateTime report_date = date.Date;
  303. if (report_date == DateTime.Now.Date)
  304. {
  305. TkPoolCore.SaveIncomeAmt(_accountId.ToString(), result.eff_tk_disp_tfee);
  306. TkPoolCore.SaveIncomeAmt(_accountName, result.eff_tk_disp_tfee);
  307. EachSaveReportOverview(report_date.AddHours(DateTime.Now.Hour), "tk_report_hourtrend", result);
  308. EachSaveReportOverview(report_date, "tk_report", result);
  309. }
  310. }
  311. catch (Exception ex) { }
  312. }
  313. private void EachSaveReportOverview(DateTime report_date, string tableName, TkReportDTO data)
  314. {
  315. var exist = new DBContext.Table(tableName)
  316. .Fields("id,report_date")
  317. .Get<dynamic>("report_date=@report_date AND accountId=@accountId",
  318. new { report_date, accountId = _accountId });
  319. var createArgs = new DBContext.Table(tableName)
  320. .Add("uclk_uv_56", data.uclk_uv_56)
  321. .Add("uclk_pv_56", data.uclk_pv_56)
  322. .Add("uclt_uv_56", data.uclt_uv_56)
  323. .Add("ucart_uv_56", data.ucart_uv_56)
  324. .Add("dep_ord_num_56", data.dep_ord_num_56)
  325. .Add("dep_ord_dep_amt_56", data.dep_ord_dep_amt_56)
  326. .Add("pay_ord_num_56", data.pay_ord_num_56)
  327. .Add("pay_ord_amt_56", data.pay_ord_amt_56)
  328. .Add("pay_tk_disp_tfee_56", data.pay_tk_disp_tfee_56)
  329. .Add("pay_ord_uv_56", data.pay_ord_uv_56)
  330. .Add("sett_ord_num_56", data.sett_ord_num_56)
  331. .Add("sett_ord_amt_56", data.sett_ord_amt_56)
  332. .Add("sett_tk_disp_tfee_56", data.sett_tk_disp_tfee_56)
  333. .Add("eff_ord_num", data.eff_ord_num)
  334. .Add("eff_ord_amt", data.eff_ord_amt)
  335. .Add("eff_tk_disp_tfee", data.eff_tk_disp_tfee);
  336. if (exist == null)
  337. {
  338. createArgs.Add("accountId", _accountId)
  339. .Add("accountName", _company)
  340. .Add("report_date", report_date)
  341. .Add("create_time", DateTime.Now)
  342. .Add("last_time", DateTime.Now)
  343. .Create();
  344. }
  345. else
  346. {
  347. createArgs.Add("last_time", DateTime.Now)
  348. .Where("id=@id", new { exist.id })
  349. .Update();
  350. }
  351. }
  352. /// <summary>
  353. /// 修正点击数
  354. /// </summary>
  355. public void FixReport(DateTime date)
  356. {
  357. TkReportDTO result = new TkReportDTO();
  358. try
  359. {
  360. string t = $"{date.Convert2UnixTimestamp(true)}";
  361. string dt = date.ToString("yyyy-MM-dd");
  362. string url = "https://pub.alimama.com/openapi/param2/1/gateway.unionpub/data.lens.report.overview.json?" +
  363. $"t={t}&_tb_token_={_tb_token}&ruleEnum=pub_overview&startDate={dt}&endDate={dt}&fixPeriod=1d";
  364. var client = new WebClientUtility().SetContentType("application/json;charset=utf-8")
  365. .AddHeaders("X-Requested-With", "XMLHttpRequest")
  366. .AddHeaders("Cookie", _cookies);
  367. #if DEBUG
  368. #else
  369. client.Proxy = _proxy;
  370. #endif
  371. if (!string.IsNullOrEmpty(_user_agent)) client.UserAgent = _user_agent;
  372. var response = client.Request(url);
  373. var body = response.Body();
  374. var root = body.Convert2JsonElement();
  375. int resultCode = root.Read<int>("resultCode", 0);
  376. bool success = root.Read("success", false);
  377. if (!success)
  378. {
  379. _ = new LoggerLibrary("report", "error")
  380. .Info(url, body)
  381. .SaveAsync();
  382. throw new Exception(body);
  383. }
  384. var data = root.ElementRead("data").ElementRead("data");
  385. result.eff_ord_num = data.Read<int>("eff_ord_num", 0);
  386. result.eff_ord_amt = data.Read<decimal>("eff_ord_amt", 0);
  387. result.eff_tk_disp_tfee = data.Read<decimal>("eff_tk_disp_tfee", 0);
  388. result.uclk_uv_56 = data.Read<int>("uclk_uv_56", 0);
  389. result.uclk_pv_56 = data.Read<int>("uclk_pv_56", 0);
  390. result.uclt_uv_56 = data.Read<int>("uclt_uv_56", 0);
  391. result.ucart_uv_56 = data.Read<int>("ucart_uv_56", 0);
  392. result.dep_ord_num_56 = data.Read<int>("dep_ord_num_56", 0);
  393. result.dep_ord_dep_amt_56 = data.Read<decimal>("dep_ord_dep_amt_56", 0);
  394. result.pay_ord_num_56 = data.Read<int>("pay_ord_num_56", 0);
  395. result.pay_ord_amt_56 = data.Read<decimal>("pay_ord_amt_56", 0);
  396. result.pay_tk_disp_tfee_56 = data.Read<decimal>("pay_tk_disp_tfee_56", 0);
  397. result.pay_ord_uv_56 = data.Read<int>("pay_ord_uv_56", 0);
  398. result.sett_ord_num_56 = data.Read<int>("sett_ord_num_56", 0);
  399. result.sett_ord_amt_56 = data.Read<decimal>("sett_ord_amt_56", 0);
  400. result.sett_tk_disp_tfee_56 = data.Read<decimal>("sett_tk_disp_tfee_56", 0);
  401. DateTime report_date = date.Date;
  402. EachSaveReportOverview(report_date, "tk_report", result);
  403. //var exist = new DBContext.Table("tk_report")
  404. // .Fields("id,report_date")
  405. // .Get<dynamic>("report_date=@report_date AND accountId=@accountId",
  406. // new { report_date, accountId = _accountId });
  407. //var createArgs = new DBContext.Table("tk_report")
  408. // .Add("fix_uclk_pv_56", result.fix_uclk_pv_56);
  409. //if (exist == null)
  410. //{
  411. // createArgs.Add("accountId", _accountId)
  412. // .Add("accountName", _company)
  413. // .Add("report_date", report_date)
  414. // .Add("create_time", DateTime.Now)
  415. // .Add("last_time", DateTime.Now)
  416. // .Create();
  417. //}
  418. //else
  419. //{
  420. // createArgs.Add("last_time", DateTime.Now)
  421. // .Where("id=@id", new { exist.id })
  422. // .Update();
  423. //}
  424. }
  425. catch (Exception ex) { }
  426. }
  427. /// <summary>
  428. /// 1小时更新一次
  429. /// </summary>
  430. public void SaveReportHourtrend(DateTime date)
  431. {
  432. string t = $"{DateTime.Now.Convert2UnixTimestamp(true)}";
  433. string dt = date.ToString("yyyy-MM-dd");
  434. string url = "https://pub.alimama.com/openapi/param2/1/gateway.unionpub/data.lens.report.hourtrend.dod.json?" +
  435. $"t={t}&_tb_token_={_tb_token}&ruleEnum=pub_homepage&startDate={dt}&endDate={dt}&fixPeriod=realTime";
  436. var client = new WebClientUtility().SetContentType("application/json;charset=utf-8")
  437. .AddHeaders("X-Requested-With", "XMLHttpRequest")
  438. .AddHeaders("Cookie", _cookies);
  439. #if DEBUG
  440. #else
  441. client.Proxy = _proxy;
  442. #endif
  443. if (!string.IsNullOrEmpty(_user_agent)) client.UserAgent = _user_agent;
  444. var response = client.Request(url);
  445. var body = response.Body();
  446. var root = body.Convert2JsonElement();
  447. int resultCode = root.Read<int>("resultCode", 0);
  448. bool success = root.Read("success", false);
  449. if (!success)
  450. {
  451. _ = new LoggerLibrary("report", "error")
  452. .Info(url, body)
  453. .SaveAsync();
  454. throw new Exception(body);
  455. }
  456. var data_list = root.ElementRead("data").ElementRead("data");
  457. foreach (var data in data_list.EnumerateArray())
  458. {
  459. string xAxis = data.Read<string>("xAxis");
  460. string _report_date = $"{dt} {xAxis}";
  461. EachSaveReport(_report_date, "tk_report_hourtrend", data);
  462. if ("23:00".Equals(xAxis))
  463. {
  464. EachSaveReport(dt, "tk_report", data);
  465. }
  466. }
  467. }
  468. private void EachSaveReport(string _report_date, string tableName, JsonElement data)
  469. {
  470. _ = DateTime.TryParse(_report_date, out DateTime report_date);
  471. var exist = new DBContext.Table(tableName)
  472. .Fields("id,report_date")
  473. .Get<dynamic>("report_date=@report_date AND accountId=@accountId",
  474. new { report_date, accountId = _accountId });
  475. if (exist == null)
  476. {
  477. new DBContext.Table(tableName)
  478. .Fill(data)
  479. .Loader<int>("uclk_uv_56", 0)
  480. .Loader<int>("uclk_pv_56", 0)
  481. .Loader<int>("uclt_uv_56", 0)
  482. .Loader<int>("ucart_uv_56", 0)
  483. .Loader<int>("dep_ord_num_56", 0)
  484. .Loader<decimal>("dep_ord_dep_amt_56", 0)
  485. .Loader<int>("pay_ord_num_56", 0)
  486. .Loader<decimal>("pay_ord_amt_56", 0)
  487. .Loader<decimal>("pay_tk_disp_tfee_56", 0)
  488. .Loader<int>("pay_ord_uv_56", 0)
  489. .Loader<int>("sett_ord_num_56", 0)
  490. .Loader<decimal>("sett_ord_amt_56", 0)
  491. .Loader<decimal>("sett_tk_disp_tfee_56", 0)
  492. .Add("accountId", _accountId)
  493. .Add("accountName", _company)
  494. .Add("report_date", report_date)
  495. .Add("create_time", DateTime.Now)
  496. .Add("last_time", DateTime.Now)
  497. .Create();
  498. }
  499. else
  500. {
  501. new DBContext.Table(tableName)
  502. .Fill(data)
  503. .Loader<int>("uclk_uv_56", 0)
  504. .Loader<int>("uclk_pv_56", 0)
  505. .Loader<int>("uclt_uv_56", 0)
  506. .Loader<int>("ucart_uv_56", 0)
  507. .Loader<int>("dep_ord_num_56", 0)
  508. .Loader<decimal>("dep_ord_dep_amt_56", 0)
  509. .Loader<int>("pay_ord_num_56", 0)
  510. .Loader<decimal>("pay_ord_amt_56", 0)
  511. .Loader<decimal>("pay_tk_disp_tfee_56", 0)
  512. .Loader<int>("pay_ord_uv_56", 0)
  513. .Loader<int>("sett_ord_num_56", 0)
  514. .Loader<decimal>("sett_ord_amt_56", 0)
  515. .Loader<decimal>("sett_tk_disp_tfee_56", 0)
  516. .Add("last_time", DateTime.Now)
  517. .Where("id=@id", new { exist.id })
  518. .Update();
  519. }
  520. }
  521. /// <summary>
  522. /// 警告消息
  523. /// </summary>
  524. public void GetViolationuWarning()
  525. {
  526. try
  527. {
  528. string url = "https://media.alimama.com/violationu2/warning_instance_page_v2.json?r=mx_208&toPage=1&pageSize=40&params=";
  529. var client = new WebClientUtility().SetContentType("application/json;charset=utf-8")
  530. .AddHeaders("X-Requested-With", "XMLHttpRequest")
  531. .AddHeaders("Cookie", _cookies);
  532. #if DEBUG
  533. #else
  534. client.Proxy = _proxy;
  535. #endif
  536. if (!string.IsNullOrEmpty(_user_agent)) client.UserAgent = _user_agent;
  537. var response = client.Request(url);
  538. var body = response.Body();
  539. var root = body.Convert2JsonElement();
  540. int resultCode = root.Read<int>("resultCode", 0);
  541. int totalCount = root.PathRead<int>("data.totalCount", 0);
  542. bool success = root.Read("success", false);
  543. if (!success)
  544. {
  545. _ = new LoggerLibrary("violationu", "warning_error")
  546. .Info(url, body)
  547. .SaveAsync();
  548. throw new Exception(body);
  549. }
  550. if (totalCount == 0) return;
  551. _ = new LoggerLibrary("violationu", "warning").Info(url, body).SaveAsync();
  552. var list = root.ElementRead("data").ElementRead("result").EnumerateArray();
  553. foreach (var data in list)
  554. {
  555. var violation_commission = data.PathRead<decimal>("mediaInfo.订单虚假交易违规佣金", 0);
  556. new DBContext.Table("alimama_warning")
  557. .Fill(data)
  558. .Loader<int>("filterRuleId", 0)
  559. .Loader<long>("gmtCreate", 0)
  560. .Loader<long>("id", 0, "ali_id")
  561. .Loader<string>("idStr", string.Empty)
  562. .Loader<int>("mediaDimension", 0)
  563. .Loader<long>("mediaId", 0)
  564. .Loader<int>("mediaInfo.abn_cnt", 0, "abn_cnt")
  565. .Add("violation_commission", violation_commission)
  566. .Loader<int>("mediaInfo.warning_cnt", 0, "warning_cnt")
  567. .Loader<string>("mediaName", string.Empty)
  568. .Loader<long>("memberId", 0)
  569. .Loader<string>("noticeCategory", string.Empty)
  570. .Loader<int>("noticeTemplateId", 0)
  571. .Loader<string>("noticeTemplateName", string.Empty)
  572. .Loader<string>("orderFile", string.Empty)
  573. .Loader<string>("pid", string.Empty)
  574. .Loader<int>("punishRuleId", 0)
  575. .Loader<string>("riskType", string.Empty)
  576. .Loader<string>("roleName", string.Empty)
  577. .Loader<string>("ruleLink", string.Empty)
  578. .Loader<bool>("showOrderDetail", false)
  579. .Loader<int>("status", 0, "ali_status")
  580. .Loader<string>("warningText", string.Empty)
  581. .Add("accountName", _company)
  582. .Add("status", true)
  583. .Add("create_time", DateTime.Now)
  584. .Add("last_time", DateTime.Now)
  585. .Create(DBContext.InsertType.REPLACE);
  586. }
  587. }
  588. catch (Exception ex) { }
  589. }
  590. }
  591. }