using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Text; using System.Text.RegularExpressions; using System.Threading; using System.Threading.Tasks; using Api.Framework.EntityTmp.SuNing; using Api.Framework.EntityTmp.SuNing1; using Api.Framework.EntityTmp.SuNing2; using Api.Framework.EntityTmp.SuNing3; using Api.Framework.EntityTmp.SuNing4; using Api.Framework.Model; using Api.Framework.Utils; using CsharpHttpHelper; using CsharpHttpHelper.Enum; using Newtonsoft.Json; using Newtonsoft.Json.Linq; namespace Api.Framework.Cps { /// /// 苏宁操作Api /// public class SuNingApi : BaseCpsApi { private string cookice = string.Empty; internal SuNingApi(fl_cps_member member) : base(member) { cookice = member.cookies; } private const string ChannelID = "15824"; #region 获取Appkey private static string[] KeyInfo = null; private static DateTime UpdateKeyTime = DateTime.MinValue; private string[] GetKeySecret() { if (UpdateKeyTime.AddDays(1) < DateTime.Now) KeyInfo = null; if (KeyInfo == null) { for (int i = 0; i < 3; i++) { try { var data = this.SendServer("find_wangzhi", "webTool.asmx", new { name = "苏宁APPKEY" }).message.ToString(); if (!string.IsNullOrWhiteSpace(data)) { //data = a683d87c23dc4e6d01020cd8fa356456_a76798b7230b886627f6e6090d3b4e48 //data = "75b46e8fb0a3a10a534282a684c92a09_532d037c25612475fd68e09eddb873fa"; KeyInfo = data.Split(new string[] { "_" }, StringSplitOptions.RemoveEmptyEntries); break; } continue; } catch (Exception) { KeyInfo = null; Thread.Sleep(500); } } UpdateKeyTime = DateTime.Now; } return KeyInfo; } #endregion #region 获取所有推广位 List TgwList = null; public List GetTuiguagnwei(bool flush = false) { try { if (flush || TgwList == null) { TgwList = RequestTuiguagnwei(1); } return TgwList; } catch (Exception ex) { throw ex; } return new List(); } /// /// 请求苏宁获取聊天推广位 /// /// /// /// private List RequestTuiguagnwei(int pageNumber, int countNumber = -1) { var list = new List(); try { HttpHelper http = new HttpHelper(); HttpItem item = new HttpItem() { URL = "http://sums.suning.com/union/member/myPromotion/promotionPosition/list.htm", Method = "POST", Timeout = 100000, ReadWriteTimeout = 30000, IsToLower = false, Cookie = cookice, UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:18.0) Gecko/20100101 Firefox/18.0", Accept = "text/html, application/xhtml+xml, */*", ContentType = "application/x-www-form-urlencoded", Referer = "http://sums.suning.com/union/member/myPromotion/promotionPosition/list.htm", Allowautoredirect = false, AutoRedirectCookie = false, Postdata = "promotionSubjection=3&siteId_val=&siteId=&pageNumber=" + pageNumber, ResultType = ResultType.String }; HttpResult result = http.GetHtml(item); string html = result.Html; if (!string.IsNullOrWhiteSpace(html)) { html = Regex.Replace(html, @"\s", "", RegexOptions.IgnoreCase); var regs = Regex.Matches(html, @"(?<推广位名称>.+?)(?\d+).+?.+?.+?.+?.+?查看报表删除

", RegexOptions.IgnoreCase | RegexOptions.Multiline); foreach (Match reg in regs) { list.Add(new SN_TuiGuangWeiInfo() { adzonename = reg.Groups["推广位名称"].Value, adzonepid = reg.Groups["pid"].ToString() }); } if (countNumber == -1) { var reg1 = Regex.Match(html, @"\(inputPageNumber-0\)<=\((?<页数>\d+)\)\)", RegexOptions.IgnoreCase | RegexOptions.Multiline); if (reg1.Success) { countNumber = int.Parse(reg1.Groups["页数"].Value); } } if (countNumber > pageNumber) { pageNumber++; list.AddRange(RequestTuiguagnwei(pageNumber, countNumber)); } } } catch (Exception ex) { } return list; } #endregion /// /// 创建工具商客户关系 /// /// 苏宁的手机号 /// public string CreateToolsRelation(string mediaCustNum) { try { var result = SendSuNing("suning.netalliance.toolseller.add", new { phone = "", channel = ChannelID, mediaCustNum = mediaCustNum }); //{"sn_responseContent":{"sn_body":{"addToolseller":{"pid":"0c3cced96b03e0f0a06a","status":"1"}}}} if (result == null) throw new Exception("请求异常,请稍后重试!"); var addToolseller = result.sn_responseContent.sn_body.addToolseller; if (addToolseller.status != "1") throw new Exception(addToolseller.errMsg); else return addToolseller.pid; } catch (Exception ex) { throw ex; } return string.Empty; } /// /// 查询商品xixni /// /// public SN_GoodInfo QuerySearchCommodity(string mess) { var data = new { keyword = mess }; return SendSuNing("suning.netalliance.searchcommodity.query", data); } /// /// 转链 二合一 /// /// 商品链接 /// 优惠券链接 /// public SN_QueryCommoditydetail GetExtensionUrl(string pid, string url, string quanUrl) { var data = new { productUrl = url, quanUrl = quanUrl, //promotionId = "",//这个推广只联盟前台申请的推广位,如果没有可以不填 这个不符合我们的需求 subUser = pid,//这个是自定义字段,传pid以及拼接的绑定信息等 pid = Member.usernick//这个指定订单归工具商还是客户 - 工具商绑定关系pid }; return SendSuNing("suning.netalliance.extensionlink.get", data); } /// /// 查询商品信息 /// /// 商品编码1-供应商编码1_商品编码2-供应商编码2... 商品编码取有效位,供应商编码左补零至10位 最大查询10个商品 /// public SN_GoodInfo QueryGoodInfo(string commodityStr) { var data = new { commodityStr = commodityStr }; return SendSuNing("suning.netalliance.commoditydetail.query", data); } /// /// 商品精选接口 /// /// 默认为1,,营销id。1-小编推荐;2-实时热销榜;3-当日热推榜;4-高佣爆款榜;5-团长招商榜;6-9块9专区 /// public SN_Recommend_Commodity QueryGuideGoodsInfo(CategoryType categoryType, int pageIndex = 1) { var data = new { eliteId = (int)categoryType, pageIndex = pageIndex, size = 40, }; return SendSuNing("suning.netalliance.selectrecommendcommodity.query", data); } /// /// 请求苏宁Api /// /// api接口 /// 请求参数 /// public T SendSuNing(string api, object data) { var html = SendSuNingServer(api, data); return JsonConvert.DeserializeObject(html); } /// /// 请求苏宁Api /// /// api接口 /// 请求参数 /// public JToken SendSuNing(string api, object data) { try { var html = SendSuNingServer(api, data); var jObj = JObject.Parse(html); if (jObj != null && jObj["sn_responseContent"] != null) { var sn_responseContent = jObj["sn_responseContent"]; if (sn_responseContent != null && sn_responseContent["sn_body"] != null) { return sn_responseContent["sn_body"]; } } } catch (Exception ex) { throw ex; } return null; } private string SendSuNingServer(string api, object data) { int number = 0; var html = string.Empty; Next: try { var appname = string.Empty; var apiSplic = api.Split(new string[] { "." }, StringSplitOptions.RemoveEmptyEntries); if (apiSplic.Length == 4) { var tmp = apiSplic[2].ToString(); appname = apiSplic[3] + tmp.Substring(0, 1).ToUpper() + tmp.Substring(1); } var jsonData = @"{""sn_request"":{""sn_body"":{""" + appname + @""":" + JsonConvert.SerializeObject(data) + "}}}"; var keyInfo = GetKeySecret(); //var jsonData = JsonConvert.SerializeObject(jsonStr); var base64Str = HttpExtend.StringToBase64String(jsonData); var timeStr = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); var versionNo = "v1.2"; var sign = GetSign(api, timeStr, versionNo, base64Str); var http = new HttpHelper(); var _item = new HttpItem() { //URL = $"https://openpre.cnsuning.com/api/http/sopRequest/{api}", URL = $"https://open.suning.com/api/http/sopRequest/{api}", Method = "post", Timeout = 3000, ReadWriteTimeout = 3000, UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:18.0) Gecko/20100101 Firefox/18.0", Accept = "text/html, application/xhtml+xml, */*", ContentType = "application/json", PostDataType = CsharpHttpHelper.Enum.PostDataType.Byte, PostdataByte = Encoding.UTF8.GetBytes(jsonData), Referer = "" }; _item.Header["appMethod"] = api; _item.Header["appRequestTime"] = timeStr; _item.Header["appKey"] = keyInfo[0]; _item.Header["versionNo"] = "v1.2"; _item.Header["format"] = "json"; _item.Header["signInfo"] = sign; html = http.GetHtml(_item).Html; if (html.Contains("操作超时") || html.Contains("服务端异常") || html.Contains("基础连接已经关闭") || html.Contains("请求被中止")) throw new Exception(); return html; } catch (Exception ex) { Thread.Sleep(200); if (number < 2 && html.Contains("操作超时") || html.Contains("服务端异常") || html.Contains("基础连接已经关闭") || html.Contains("请求被中止")) goto Next; else { EventClient.OnEvent(this, $"【苏宁易购】 => 请求异常1:{this.Member.usernick}({this.Member.username})"); LogHelper.GetSingleObj().Error("", $@"【苏宁易购】 => 请求异常1:{this.Member.usernick}({this.Member.username}) {api} {html} {ex.Message} - {ex.StackTrace}"); } throw ex; } return string.Empty; } /// /// 下载订单,不带状态(有多页,获取所有) /// /// 开始时间 /// 第几页 /// 页大小 /// 阿里妈妈同步的订单类型 /// 场景订单场景类型,1:常规订单,2:渠道订单,3:会员运营订单,默认为1 /// internal SN_OrderInfo DownOrder(DateTime start_time, DateTime end_time, int page_index, int page_size) { SN_OrderInfo _rst = null; for (int i = 0; i < 2; i++) { try { var data = new { pageNo = page_index, pageSize = page_size, startTime = start_time.ToString("yyyy-MM-dd HH:mm:ss"), endTime = end_time.ToString("yyyy-MM-dd HH:mm:ss"), orderLineStatus = 0, pid = Member.usernick//这个指定订单归工具商还是客户 - 工具商绑定关系pid }; _rst = SendSuNing("suning.netalliance.order.query", data); if (_rst.sn_responseContent != null && _rst.sn_responseContent.sn_body != null && _rst.sn_responseContent.sn_body.queryOrder != null && _rst.sn_responseContent.sn_body.queryOrder.Count != 0) return _rst; else if (_rst.sn_responseContent != null && _rst.sn_responseContent.sn_error != null && _rst.sn_responseContent.sn_error.error_code.Contains("no-result"))//没有查到数据 break; } catch (Exception ex) { throw ex; } } return null; } /// /// 计算sign /// /// private string GetSign(string api, string timeStr, string versionNo, string base64Str) { //按照顺序依次拼接appSecret的值(appKey对应的密钥)、appMethod的值,appRequestTime的值,appkey的值,versionNo的值和第一步编码后的值 var data = $"{KeyInfo[1]}{api}{timeStr}{KeyInfo[0]}{versionNo}{base64Str}"; //md5 小写 return HttpHelper.ToMD5(data).ToLower(); } } }