using molilian.core; using dodohold.core; using Microsoft.AspNetCore.Mvc; using Org.BouncyCastle.Ocsp; using System.Text.Json; using System.Runtime.InteropServices; using System.Net; using System.Security.Cryptography; using Microsoft.AspNetCore.Authentication; using TencentCloud.Ecm.V20190719.Models; using COSXML.Network; using System.Linq; using static dodohold.core.ZTOExpress.CreateOrderArgs; namespace molilian.api.Controllers { [ApiController] [Route("[controller]/[action]")] public class TkController : ControllerBase { protected IHttpContextAccessor _accessor; public TkController(IHttpContextAccessor accessor) { _accessor = accessor; } /// /// oppo调用 /// /// 正文 /// 渠道。tb/jd /// 分配的客户端账号 /// 11位时间戳 /// 签名 /// 客户的IP /// 客户的唯一ID /// [HttpPost] public async Task unionParse([FromBody] JsonElement form, [FromQuery] string a = "", [FromQuery] int t = 0, [FromQuery] string sign = "") { //正文 var content = form.Read("s", string.Empty); var channel = form.Read("c", string.Empty); var ip = form.Read("ip", string.Empty); var oaid = form.Read("oaid", string.Empty); //验证签名 if (string.IsNullOrEmpty(a) || string.IsNullOrEmpty(sign)) { return new APIResult(new { success = false, message = "验证错误" }, APIResultCodeEnum.Unauthorized); } DateTime time1 = t.Convert2Datetime(); if (time1 < DateTime.Now.AddMinutes(-10)) { return new APIResult(new { success = false, message = "验证错误2" }, APIResultCodeEnum.Unauthorized); } var account = ApiAccountCore.GetOne(a); if (account == null) { return new APIResult(new { success = false, message = "验证错误3" }, APIResultCodeEnum.Unauthorized); } string app_sign = $"{account.api_secret}@{t}".MD5(); if (sign != app_sign) { return new APIResult(new { success = false, message = "验证错误4" }, APIResultCodeEnum.Unauthorized); } return await UnionParseCore.UnionParseAsync(content, channel, ip, oaid); } [HttpPost] public async Task unsafeParse([FromBody] JsonElement form) { var content = form.Read("s", string.Empty); var channel = form.Read("c", string.Empty); var ip = form.Read("ip", string.Empty); var oaid = form.Read("oaid", string.Empty); #if DEBUG ip = "127.0.0.1"; oaid = "test-oaid"; #endif return await UnionParseCore.UnionParseAsync(content, channel, ip, oaid); } //[HttpGet] //public async Task testParse() //{ // var ip = "127.0.0.1"; // var oaid = "test-oaid"; // var list = new DBContext.Table("tk_parse_logs") // .Where("success=1", null) // .Order("ID DESC") // .Limit(1000) // .Select(); // int success_total = 0, error_total = 0; // foreach (var item in list) // { // var result = UnionParseCore.testTaobaoParseAsync(item.rawContent, ip, oaid); // if (result.success) // { // success_total++; // } // else // { // Console.Write(result); // } // } // var list2 = new DBContext.Table("tk_parse_logs") // .Where("success=0", null) // .Order("ID DESC") // .Limit(100) // .Select(); // foreach (var item in list2) // { // var result = UnionParseCore.testTaobaoParseAsync(item.rawContent, ip, oaid); // if (result.success) // { // Console.Write(result); // } // else // { // error_total++; // } // } // return new APIResult(new { success_total, error_total }); //} [HttpPost] public async Task unionCoupon([FromBody] JsonElement form, [FromQuery] string a = "", [FromQuery] int t = 0, [FromQuery] string sign = "") { //正文 var content = form.Read("s", string.Empty); var channel = form.Read("c", string.Empty); var ip = form.Read("ip", string.Empty); var oaid = form.Read("oaid", string.Empty); //验证签名 if (string.IsNullOrEmpty(a) || string.IsNullOrEmpty(sign)) { return new APIResult(new { success = false, message = "验证错误" }, APIResultCodeEnum.Unauthorized); } DateTime time1 = t.Convert2Datetime(); if (time1 < DateTime.Now.AddMinutes(-10)) { return new APIResult(new { success = false, message = "验证错误2" }, APIResultCodeEnum.Unauthorized); } var account = ApiAccountCore.GetOne(a); if (account == null) { return new APIResult(new { success = false, message = "验证错误3" }, APIResultCodeEnum.Unauthorized); } string app_sign = $"{account.api_secret}@{t}".MD5(); if (sign != app_sign) { return new APIResult(new { success = false, message = "验证错误4" }, APIResultCodeEnum.Unauthorized); } return await UnionCouponCore.UnionCouponAsync(content, channel, ip, oaid); } [HttpPost] public async Task unsafeCoupon([FromBody] JsonElement form) { var content = form.Read("s", string.Empty); var channel = form.Read("c", string.Empty); var ip = form.Read("ip", string.Empty); var oaid = form.Read("oaid", string.Empty); #if DEBUG ip = "127.0.0.1"; oaid = "test-oaid"; #endif return await UnionCouponCore.UnionCouponAsync(content, channel, ip, oaid); } /// /// 第三方调用 /// /// /// /// [HttpGet] public async Task parse(string s, string s2 = "", string ip = "", string oaid = "") { AlimamaPlus alimama = null; ip = AlimamaPlus.OppoDecode(ip); oaid = AlimamaPlus.OppoDecode(oaid); var result = AlimamaPlus.GetFormattedObject(s, ip, oaid); string body = ""; string content = s.UrlDecode(); string content2 = s2.UrlDecode(); string account_name = string.Empty; result.rawContent = content; result.rawContent2 = content2; try { if (AlimamaPlus.ShouldIgnoreRequest(ip, oaid, out string reason)) { result.success = false; result.message = "放弃转链"; result.reason = reason; _ = TkLogCore.LogAsync(result); return new APIResult(new { result.success, result.message, result.content, result.couponAmount, result.taoToken, result.shortLinkurl, result.deeplink_url, }); } var account = TkPoolCore.GetOne(TkPoolCore.TkAction.parse); if (account == null) { result.success = false; result.message = "放弃转链"; result.reason = "没有匹配账号"; _ = TkLogCore.LogAsync(result); return new APIResult(new { result.success, result.message, result.content, result.couponAmount, result.taoToken, result.shortLinkurl, result.deeplink_url, }); } result.accountId = account.id; account_name = account.name; alimama = new AlimamaPlus(account); if (alimama.ShouldIgnoreOtherAff(s2)) { result.success = false; result.message = "放弃转链"; result.reason = "其他推广链接"; _ = TkLogCore.LogAsync(result); return new APIResult(new { result.success, result.message, result.content, result.couponAmount, result.taoToken, result.shortLinkurl, result.deeplink_url, }); } result = await alimama.UnionParseAsync(content, result); } catch (Exception ex) { if (ex.Message.Contains("was canceled")) { result.success = false; result.message = "放弃转链"; result.reason = "请求超时"; } else { //new LoggerLibrary("api_error", "parse") //.Info(s, s2) //.Info($"【taobao】{account_name}", body) //.Info(ex.Message, ex.StackTrace) //.SaveAsync(); NotifyCore.Notify(new NifyMessage { message = $"【转链接口异常】{account_name}\n{content}\n{content2}\n{body}\n\n{ex.Message}\n{ex.StackTrace}", priority = NifyMessagePriority.high, tags = ["red_circle"] }); result.success = false; result.message = "放弃转链"; result.reason = "转链接口异常"; } } _ = TkLogCore.LogAsync(result, alimama); return new APIResult(new { result.success, result.message, result.content, result.couponAmount, result.taoToken, result.shortLinkurl, result.deeplink_url, }); } [HttpGet] public ActionResult parse2(string s, string s2 = "", string ip = "", string oaid = "") { AlimamaPlus alimama = null; ip = AlimamaPlus.OppoDecode(ip); oaid = AlimamaPlus.OppoDecode(oaid); var result = AlimamaPlus.GetFormattedObject(s, ip, oaid); string body = ""; string content = s.UrlDecode(); string content2 = s2.UrlDecode(); string account_name = string.Empty; result.rawContent = content; result.rawContent2 = content2; try { if (AlimamaPlus.ShouldIgnoreRequest(ip, oaid, out string reason)) { result.success = false; result.message = "放弃转链"; result.reason = reason; _ = TkLogCore.LogAsync(result); return new APIResult(new { result.success, result.message, result.content, result.couponAmount, result.taoToken, result.shortLinkurl, result.deeplink_url, }); } var account = TkPoolCore.GetOne(TkPoolCore.TkAction.parse); if (account == null) { result.success = false; result.message = "放弃转链"; result.reason = "没有匹配账号"; _ = TkLogCore.LogAsync(result); return new APIResult(new { result.success, result.message, result.content, result.couponAmount, result.taoToken, result.shortLinkurl, result.deeplink_url, }); } account_name = account.name; alimama = new AlimamaPlus(account); if (alimama.ShouldIgnoreOtherAff(s2)) { result.success = false; result.message = "放弃转链"; result.reason = "其他推广链接"; _ = TkLogCore.LogAsync(result); return new APIResult(new { result.success, result.message, result.content, result.couponAmount, result.taoToken, result.shortLinkurl, result.deeplink_url, }); } alimama.UnionParse(content, ref result); //result.ip = ip; //result.oaid = oaid; } catch (Exception ex) { _ = new LoggerLibrary("api_error", "parse") .Info(s, s2) .Info($"【taobao】{account_name}", body) .Info(ex.Message, ex.StackTrace) .SaveAsync(); NotifyCore.Notify(new NifyMessage { message = $"【转链接口异常】{account_name}\n{content}\n{content2}\n{body}\n\n{ex.Message}\n{ex.StackTrace}", priority = NifyMessagePriority.high, tags = ["red_circle"] }); result.success = false; result.message = "放弃转链"; result.reason = "转链接口异常"; } _ = TkLogCore.LogAsync(result, alimama); return new APIResult(new { result.success, result.message, result.content, result.couponAmount, result.taoToken, result.shortLinkurl, result.deeplink_url, }); } [HttpGet] public ActionResult jd_parse(string s, string s2 = "", string ip = "", string oaid = "") { var result = JdUnionPlus.GetFormattedObject(s, ip, oaid); string body = ""; string content = s.UrlDecode(); string content2 = s2.UrlDecode(); try { if (AlimamaPlus.ShouldIgnoreRequest(ip, oaid, out string reason)) { result.success = false; result.message = "放弃转链"; result.reason = reason; result.rawContent = content; result.rawContent2 = content2; _ = TkLogCore.LogAsync(result); return new APIResult(result); } var api = DataokeCore.GetOne(); if (api == null) { result.success = false; result.message = "放弃转链"; result.reason = "没有匹配账号"; result.rawContent = content; result.rawContent2 = content2; _ = TkLogCore.LogAsync(result); return new APIResult(result); } var account = JdPoolCore.GetOne(); if (account == null) { result.success = false; result.message = "放弃转链"; result.reason = "没有匹配账号"; result.rawContent = content; result.rawContent2 = content2; _ = TkLogCore.LogAsync(result); return new APIResult(result); } result = DataokeCore.JdParse(result, api, account, content); } catch (Exception ex) { _ = new LoggerLibrary("api_error") .Info(s, s2) .Info("【jd】", body) .Info(ex.Message, ex.StackTrace) .SaveAsync(); NotifyCore.Notify(new NifyMessage { message = $"【转链接口异常】\n{content}\n{content2}\n{body}\n\n{ex.Message}\n{ex.StackTrace}", priority = NifyMessagePriority.high, tags = ["red_circle"] }); result.success = false; result.message = "放弃转链"; result.reason = "转链接口异常"; } result.rawContent = content; result.rawContent2 = content2; _ = TkLogCore.LogAsync(result); return new APIResult(new { result.success, result.message, result.shortLinkurl, result.deeplink_url, }); } //[HttpGet] //public Task parse3(string s, string s2, string ip = "", string oaid = "") //{ // var result = AlimamaPlus.GetFormattedObject(s, ip, oaid); // string body = ""; // string content = s.UrlDecode(); // string content2 = s2.UrlDecode(); // try // { // if (AlimamaPlus.ShouldIgnoreRequest("", "")) // { // result.success = false; // result.message = "放弃转链"; // } // else // { // var account = VeapiPoolCore.GetOne(); // if (account == null) // { // result.success = false; // result.message = "内部错误(500)"; // } // else // { // var core = new VeapiPlus(account.name, account.key, account.sessionKey); // result = core.UnionParse(content); // } // } // } // catch (Exception ex) // { // NotifyCore.Notify(new NifyMessage // { // message = $"【转链接口异常】\n{body}", // priority = NifyMessagePriority.high, // tags = ["red_circle"] // }); // result.success = false; // result.message = "转链接口异常"; // } // _ = TkLogCore.Log(content, content2, result); // return Task.FromResult(new APIResult(result)); //} [HttpGet("{ignorePercentage}")] public ActionResult set_ignore(int ignorePercentage = 0) { TkConfigCore.Update(ignorePercentage); return new APIResult(new { success = true, message = "ok" }); } [HttpGet("{ignorePercentage}")] public ActionResult set_jd_ignore(int ignorePercentage = 0) { TkConfigCore.JdUpdate(ignorePercentage); return new APIResult(new { success = true, message = "ok" }); } [HttpGet] public async Task Reload() { await EndPointCore.NotifyReload(); return new APIResult(new { success = true, message = "ok", }); } [HttpGet] public async Task dplist([FromQuery] string query = "", [FromQuery] string a = "", [FromQuery] int t = 0, [FromQuery] string sign = "") { #if DEBUG #else //验证签名 if (string.IsNullOrEmpty(a) || string.IsNullOrEmpty(sign)) { return new APIResult(new { success = false, message = "验证错误" }, APIResultCodeEnum.Unauthorized); } DateTime time1 = t.Convert2Datetime(); if (time1 < DateTime.Now.AddMinutes(-10)) { return new APIResult(new { success = false, message = "验证错误2" }, APIResultCodeEnum.Unauthorized); } var account = ApiAccountCore.GetOne(a); if (account == null) { return new APIResult(new { success = false, message = "验证错误3" }, APIResultCodeEnum.Unauthorized); } string app_sign = $"{account.api_secret}@{t}".MD5(); if (sign != app_sign) { return new APIResult(new { success = false, message = "验证错误4" }, APIResultCodeEnum.Unauthorized); } if (string.IsNullOrEmpty(query)) { return new APIResult(new { success = false, message = "查询条件不能为空" }); } #endif string filter = $"batchId=@query"; var account_list = TkPoolCore.List(); List account_ids = []; if (account_list.Any()) { account_ids = account_list.Where(e => e.enable_fake_click).Select(e => e.id).ToList(); filter += $" AND accountId IN @account_ids"; } string orderBy = "paid_time ASC"; var data = new DBContext.Table("tk_order_tracking") .Where(filter, new { query, account_ids }) .Order(orderBy) .Select(); List list = []; foreach (var item in data) { list.Add(new { url = item.deeplinkUrl, count = item.click_num, time = item.exp_time }); } var clientIp = _accessor.HttpContext.GetUserIp(); LoggerLibrary log = new LoggerLibrary("api", "dplist"); log.Info($"{clientIp}\t{query}\tcount:{list.Count}"); var ids = data.Select(e => e.Id).ToArray(); log.Info(string.Join(',', ids)); _ = log.SaveAsync(); return new APIResult(new { success = true, message = list.Count == 0 ? "none" : "ok", count = list.Count, data = list, }); } [HttpGet] public async Task unsafeParseDpList([FromQuery] string query = "") { string filter = $"batchId=@query"; var account_list = TkPoolCore.List(); List account_ids = []; if (account_list.Any()) { account_ids = account_list.Where(e => e.enable_fake_click).Select(e => e.id).ToList(); filter += $" AND accountId IN @account_ids"; } string orderBy = "paid_time ASC"; var data = new DBContext.Table("tk_order_tracking") .Where(filter, new { query, account_ids }) .Order(orderBy) .Select(); List list = []; foreach (var item in data) { list.Add(new { url = item.deeplinkUrl, count = item.click_num, time = item.exp_time }); } var clientIp = _accessor.HttpContext.GetUserIp(); LoggerLibrary log = new LoggerLibrary("api", "unsafeParseDpList"); log.Info($"{clientIp}\t{query}\tcount:{list.Count}"); var ids = data.Select(e => e.Id).ToArray(); log.Info(string.Join(',', ids)); _ = log.SaveAsync(); return new APIResult(new { success = true, message = list.Count == 0 ? "none" : "ok", count = list.Count, data = list, }); } } }