//============================================================= // 创建人:千年老妖 // 本页代码,均为原创。对未经许可擅自使用者,本人保留追究其法律责任的权利。 //============================================================== using Api.Framework.Model; using Api.Framework.Tools; using Api.Framework.Utils; using CsharpHttpHelper; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; using Newtonsoft.Json; namespace Api.Framework.Cps { /// /// CpsApi基础类 /// public class BaseCpsApi { /// /// cps数据对象 /// public fl_cps_member Member { get; protected set; } private CpsToken _token = null; private static SynchronizedDictionary Tokens = new SynchronizedDictionary(); /// /// 删除Token缓存 /// internal void ClearToken() { string key = $"{Member.username}_{(int)Member.cpstype}"; if (Tokens.ContainsKey(key)) Tokens.Remove(key); _token = null; } /// /// 获取重新获取token /// /// internal CpsToken GetToken() { try { for (int i = 0; i <= 5; i++) { var result = SendServer("get_token", new { username = Member.username, enc_result = true }); if (result != null) { LogHelper.GetSingleObj().Debug("新token", $"{Member.cpstype.ToString()} {Member.usernick}({Member.username})" + " " + JsonConvert.SerializeObject(result)); if (result.ok) { return HttpHelper.JsonToObject(result.message.ToString()) as CpsToken; } else return null; } Thread.Sleep(15); } } catch (Exception ex) { throw ex; } return null; } /// /// 重新获取Token /// /// internal bool RefToken() { #region 老妖xxx //try //{ // int number = 0; //Next: // number++; // var result = SendServer("get_token", new { username = Member.username, enc_result = true }); // if (result == null && number <= 5) // { // Thread.Sleep(10); // goto Next; // } // _token = HttpHelper.JsonToObject(result.message.ToString()) as CpsToken; // if (_token != null) // { // string key = $"{Member.username}_{(int)Member.cpstype}"; // if (Tokens.ContainsKey(key)) Tokens.Add(key, _token); // else Tokens[key] = _token; // } //} //catch (Exception ex) //{ // throw ex; //} #endregion #region 老道 try { var new_token = GetToken(); if (new_token == null) return false; //本机没有值,拉取服务器Token if (_token == null) { _token = new_token; SetToken(_token); if (Member != null) Member.is_valid = true; return true; } else { //和本机一致,返回False 表示没有新Token if (_token.access_token == new_token.access_token) return false; _token = new_token; SetToken(_token); if (Member != null) Member.is_valid = true; return true; } } catch (Exception ex) { throw ex; } finally { LogHelper.GetSingleObj().Debug("", $"唯品会获取新的Token: username = {_token?.username},appid = {_token?.appid},access_token = {_token?.access_token}"); } #endregion return false; } /// /// 设置Token /// /// private void SetToken(CpsToken cpsToken) { if (cpsToken != null) { string key = $"{Member.username}_{(int)Member.cpstype}"; if (!Tokens.ContainsKey(key)) Tokens.Add(key, cpsToken); else Tokens[key] = cpsToken; } } /// /// 操作Token /// internal CpsToken Token { get { if (_token == null) { string key = $"{Member.username}_{(int)Member.cpstype}"; if (Tokens.ContainsKey(key)) _token = Tokens[key]; else RefToken(); } return _token; } } internal BaseCpsApi(fl_cps_member member) { this.Member = member; //if (this.Member.cpstype == Enums.CpsType.阿里妈妈) //{ // this.RefToken(); //} } /// /// 请求报文 /// /// /// /// /// public WebResult SendServer(string method, string target = "", object param = null) { if (string.IsNullOrEmpty(target)) { var type = this.GetType(); if (type == typeof(AlimamaApi)) target = "alimama.asmx"; else if (type == typeof(PinduoduoApi)) target = "pinduoduo.asmx"; else if (type == typeof(JingdongApi)) target = "jingdong.asmx"; else if (type == typeof(WeipinhuiApi)) target = "weipinhui.asmx"; else if (type == typeof(DouyinApiV2)) target = "douyin.asmx"; else if (type == typeof(DouyinApiV3)) target = "douyin.asmx"; else if (type == typeof(KuaiShouApi)) target = "kuaishou.asmx"; else throw new Exception("暂时不支持类型:" + target); } AuthEndpoint end = new AuthEndpoint() { Appid = CpsClient._appid, Enckey = CpsClient._key, Host = CpsClient._host + "api/" + target + "/send_data", Method = method }; if (param != null) { var _param = param.GetType().GetProperties(); foreach (var item in _param) { end.Param[item.Name] = item.GetValue(param); } } HttpHelper http = new HttpHelper(); WebResult result = null; try { result = http.SendData(end); return result; } catch (Exception ex) { LogHelper.GetSingleObj().Error("cps请求异常", ex.Message + $"{result?.message}"); if (ex.Message == "未将对象引用设置到对象的实例。") return null; else throw ex; } finally { //LogHelper.GetSingleObj().Error("cps请求异常..", $"{target},{result?.message} => {JsonConvert.SerializeObject(end)}"); } } /// /// 发送API数据 /// /// API接口 /// 参数 /// public WebResult SendServer(string method, object param = null) { return SendServer(method, "", param); } } }