using CsharpHttpHelper; using Common.Models.Enums; using Common.Models.UnqTables; using Newtonsoft.Json.Linq; using System; using System.Collections.Generic; using System.Linq; using System.Security.Cryptography; using System.Text; using System.Text.RegularExpressions; using System.Threading; using System.Threading.Tasks; namespace Server.HttpRequests { public class TaobaoRequest { public delegate bool OrderChange(TaobaoRequest Req, JToken Order); public static event OrderChange OrderChangeEvent; #region 阿里妈妈请求类 public TaobaoRequest() { } public Lianmeng Lianmeng { get; private set; } public string Token { get { return Lianmeng.Token; } } public TaobaoRequest(Lianmeng Lianmeng) { if (Lianmeng.LianmengType != LianmengType.淘宝联盟) throw new Exception($"当前账号{Lianmeng.LianmengType},不支持!"); this.Lianmeng = Lianmeng; } TbMedia Meadia; public TaobaoRequest(Lianmeng Lianmeng, TbMedia Media) { if (Lianmeng.LianmengType != LianmengType.淘宝联盟) throw new Exception($"当前账号{Lianmeng.LianmengType},不支持!"); this.Lianmeng = Lianmeng; this.Meadia = Media; } private string Appid { get; set; } = "27754179"; private string Appsecret { get; set; } = "2ee7beffe4752708564bf110971c262f"; private const string SIGN_METHOD_MD5 = "md5"; private const string SIGN_METHOD_HMAC = "hmac"; private string SignTopRequest(Dictionary parameters, string secret, string signMethod = "hmac") { // 第一步:把字典按Key的字母顺序排序 IDictionary sortedParams = new SortedDictionary(parameters, StringComparer.Ordinal); // 第二步:把所有参数名和参数值串在一起 StringBuilder query = new StringBuilder(); if (SIGN_METHOD_MD5.Equals(signMethod)) { query.Append(secret); } foreach (KeyValuePair kv in sortedParams) { if (!string.IsNullOrEmpty(kv.Key) && !string.IsNullOrEmpty(kv.Value) && kv.Key != "sign") { query.Append(kv.Key).Append(kv.Value); } } //// 第三步:把请求主体拼接在参数后面 //if (!string.IsNullOrEmpty(body)) //{ // query.Append(body); //} // 第四步:使用MD5/HMAC加密 byte[] bytes; if (SIGN_METHOD_HMAC.Equals(signMethod)) { HMACMD5 hmac = new HMACMD5(Encoding.UTF8.GetBytes(secret)); bytes = hmac.ComputeHash(Encoding.UTF8.GetBytes(query.ToString())); } else { query.Append(secret); MD5 md5 = MD5.Create(); bytes = md5.ComputeHash(Encoding.UTF8.GetBytes(query.ToString())); } // 第五步:把二进制转化为大写的十六进制 StringBuilder result = new StringBuilder(); for (int i = 0; i < bytes.Length; i++) { result.Append(bytes[i].ToString("X2")); } return result.ToString(); } /// /// 计算签名,返回请求阿里妈妈服务器的参数 /// /// api名称 /// 参数 /// appkey /// appsecret /// private string GetAlimamaRequestData(string _api, object _data, string appkey = "", string appsecret = "", string token = "") { try { var data = _data; var api = _api; Dictionary param = new Dictionary(); var type = data.GetType().GetProperties(); foreach (var item in type) { var _value = item.GetValue(data).ToString(); param[item.Name] = _value; } param["method"] = api; param["app_key"] = appkey; param["session"] = token; param["timestamp"] = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); param["format"] = "json"; param["v"] = "2.0"; param["sign_method"] = "md5"; //计算签名 string sign = SignTopRequest(param, appsecret, param["sign_method"]); param["sign"] = sign; return HttpExtend.BuildQuery(param); } catch (Exception) { } return string.Empty; } /// /// 请求淘宝服务器端 /// /// api名称 /// 参数 /// 异常是否抛出 /// public JToken GetJSON(string ApiName, object Data, bool ThrowException = false) { var query = GetAlimamaRequestData(ApiName, Data, Appid, Appsecret, Token); var html = string.Empty; string _url = string.Empty; try { HttpHelper http = new HttpHelper(); _url = "http://gw.api.taobao.com/router/rest?" + query; HttpItem item = new HttpItem() { URL = _url,//URL 必需项 Method = "GET",//URL 可选项 默认为Get Timeout = 5000,//连接超时时间 可选项默认为100000 ReadWriteTimeout = 5000,//写入Post数据超时时间 Accept = "text/html, application/xhtml+xml, */*",// 可选项有默认值 ContentType = "application/json",//返回类型 可选项有默认值 }; var result = http.GetHtml(item); //{"tbk_dg_vegas_tlj_create_response":{"result":{"model":{"rights_id":"XvLXNwkX8HBQ8VZ2WS4DlNtN7m9cS4TU","send_url":"https:\/\/uland.taobao.com\/taolijin\/edetail?eh=5L6pfx5vldOZuQF0XRz0iAXoB%2BDaBK5LQS0Flu%2FfbSp4QsdWMikAalrisGmre1Id0BFAqRODu1004PvI5lqUzYTPq7zN5TtBXU4J7X2wljh7PW2ShemY2x1IRRpXndAncj8tXpgtxXzbOKxKSviYxsuv0da8KKt7WubOUkoI2Oa3HR2hP0JFSmjppH3xlrrJg8pBHJnzzOjd2vZvO6fEydXbwx4naJ6dk%2FBu2lJxZtMc7BMk%2FDH7wY2fDQKPuN9qcxwaWpDoQwfi%2B9ZUBfurmaewy3GJqMoK4342DlvX1ZVNOJlvqrE2h6J7%2BkHL3AEW&union_lens=lensId%3A0b14fbf4_0b3d_16f65a622fd_31b4%3Btraffic_flag%3Dlm","vegas_code":"N4HHV6HV"},"success":true},"request_id":"no8k8bbwsct2"}} if (result != null && result.StatusCode != System.Net.HttpStatusCode.OK) throw new Exception(result.Html); html = result.Html; var JsonResult = JObject.Parse(html); if (JsonResult == null) throw new Exception(html); if (JsonResult["error_response"] != null) throw new Exception(html); //tbk_sc_order_details_get_response //tbk_sc_order_details_get_response var key = ApiName.Replace("taobao.", "").Replace(".", "_") + "_response"; if (JsonResult[key] == null) throw new Exception($"key = {key},html = {html}"); var ResultToken = JsonResult[key]; if (ResultToken["result"] != null) return ResultToken["result"]; if (ResultToken["results"] != null) return ResultToken["results"]; if (ResultToken["data"] != null) return ResultToken["data"]; return ResultToken; } catch (Exception ex) { if (ex.Message.Contains("过期")) { Lianmeng.ExpirationTime = DateTime.Now; //Client.SigleClient.Db.Updateable(Lianmeng).UpdateColumns(f => new { f.ExpirationTime }).ExecuteCommand(); } //Client.SigleClient.Event.OnLog($"请求API:{ApiName}发生错误,{ex.Message}", "系统", ex, true); if (ThrowException) throw ex; } return null; } #endregion /// /// 更新订单 /// /// 开始时间 /// 结束时间 /// 同步的订单类型 /// 返回错误原因 public Task UpdateOrder(DateTime StartTime, DateTime EndTime, TBOrderScene orderScene = TBOrderScene.常规订单) { return Task.Factory.StartNew(() => { try { if (StartTime < DateTime.Now.AddMonths(-5)) StartTime = DateTime.Now.AddMonths(-5); var time = StartTime; do { /* 逻辑:从结束的时间,倒序更新 */ var sTime = time; var eTime = time.AddHours(3); //if (eTime > EndTime) eTime = StartTime; time = eTime; //是否还有下一页 var page_on = 0; var has_next = false; var position_index = string.Empty; do { page_on++; var postData = new { query_type = 4,//查询时间类型,1:按照订单淘客创建时间查询,2:按照订单淘客付款时间查询,3:按照订单淘客结算时间查询,4:按照订单更新时间; page_size = 100,//页大小 start_time = sTime.ToString("yyyy-MM-dd HH:mm:ss"), end_time = eTime.ToString("yyyy-MM-dd HH:mm:ss"),//这里是对应前面同步间隔的19分钟 //【订单查询结束时间,订单开始时间至订单结束时间,中间时间段日常要求不超过3个小时,但如618、双11、年货节等大促期间预估时间段不可超过20分钟,超过会提示错误,调用时请务必注意时间段的选择,以保证亲能正常调用!】 page_no = page_on, position_index = position_index, order_scene = (int)orderScene, }; var Json = GetJSON("taobao.tbk.sc.order.details.get", postData); if (Json != null && Json["data"] != null) { var Data = Json["data"]; has_next = (bool)Data["has_next"]; position_index = Data["position_index"].ToString(); var orders = Data["results"]["publisher_order_dto"]; if (orders == null) break; foreach (var item in orders) { item["LianmengId"] = Lianmeng.Id; OrderChangeEvent?.Invoke(this, item); } if (!has_next) { Lianmeng.ModifiedTime = sTime; //Client.SigleClient.Db.SaveCache(Lianmeng); //Client.SigleClient.Db.Updateable(Lianmeng).UpdateColumns(f => new { f.ModifiedTime }).ExecuteCommand(); } } else break; } while (has_next); } while (time < EndTime); } catch (Exception ex) { //Client.SigleClient.Event.OnLog(ex.Message, "淘宝", ex); return ex.Message; } return string.Empty; }); } /// /// 淘口令解析并转链 返回商品ID 【淘宝客-服务商-淘口令解析&转链】 /// /// public JToken TpwdConvert(string Content, string SiteId, string AdzoneId) { return GetJSON("taobao.tbk.sc.tpwd.convert", new { password_content = Content, adzone_id = AdzoneId, site_id = SiteId }); } /// /// 正则获取Url链接 /// public const string RegexGetUrl = @"(?<链接>(?:(?:ht|f)tps?):\/\/[\w\-]+(?:\.[\w\-]+)+(?:[\w\-\.,@?^=%&:\/~\+#]*[\w\-\@?^=%&\/~\+#])?)"; public JToken TbUrlAnalysis(string Content) { try { var regs = Regex.Matches(Content, RegexGetUrl); if (regs.Count == 0) return null; foreach (Match reg in regs) { try { var url = reg.Groups["链接"].Value; var jToken = GetJSON("taobao.tbk.item.click.extract", new { click_url = url }); if (jToken != null) { } } catch (Exception ex) { } } } catch (Exception ex) { //Client.SigleClient.Event.OnLog($"解析内容中的url异常", Exception: ex, IsDebug: true); } return null; } /// /// 解析宝贝地址 /// /// public string AnalysisItemid(string Content) { var itemid = AnalysisItemidByUrl(Content); if (!string.IsNullOrWhiteSpace(itemid)) return itemid; if (Meadia == null) throw new Exception("推广位信息不能为空!"); var convertRst = TpwdConvert(Content, Meadia.SiteId, Meadia.AdzoneId); if (convertRst != null) { return convertRst["num_iid"].ToString(); } return String.Empty; } /// /// 判断是否为淘宝的相关域名,后续有新的在这个位置添加 /// private static string RegDomainMatch = @"((?:m.tb.cn))"; private string AnalysisItemidByUrl(string Content) { try { //判断是否为淘宝的相关域名 if (!Regex.IsMatch(Content, RegDomainMatch, RegexOptions.IgnoreCase)) return string.Empty; var regs = Regex.Matches(Content, RegexGetUrl); if (regs.Count == 0) return String.Empty; foreach (Match regTmp in regs) { try { var url = regTmp.Groups["链接"].Value; var result = new HttpHelper().GetHtml(url); if (result != null && result.StatusCode != System.Net.HttpStatusCode.OK) throw new Exception(result.Html); var html = result.Html; var itemid = string.Empty; var reg = Regex.Match(html, @"var url = '(?.+?)';", RegexOptions.IgnoreCase); if (reg.Success) { itemid = GetItemIdByContent(html); if (!string.IsNullOrWhiteSpace(itemid)) return itemid; itemid = GetItemIdByCoupon(reg.Groups["url"].Value); if (!string.IsNullOrWhiteSpace(itemid)) return itemid; } } catch (Exception ex) { } } } catch (Exception ex) { throw ex; } return String.Empty; } /// /// 查找宝贝Id的正则表达式 /// 注:追加为最后一个括号前加|(?:新的正则) /// private static string RegItemId = @"((?:item[Ii]d=(?\d{5,}))|(?:item_id=(?\d{5,}))|(?:\?id=(?\d{5,}))|(?:&id=(?\d{5,}))|(?:/i(?\d{5,}))|(?:num[Ii]id=(?\d{5,})))"; /// /// 正则表达式匹配商品Id /// /// 查找的内容 /// 查找到的宝贝id public string GetItemIdByContent(string Content) { var reg = Regex.Match(Content, RegItemId); if (reg.Success) return reg.Groups["itemid"].Value; return string.Empty; } /// /// 通过优惠券链接获取淘宝宝贝的id /// /// public string GetItemIdByCoupon(string url) { try { var urlTmp = url.ToLower(); if (urlTmp.Contains(@"uland.taobao.com/coupon"))//这是针对淘宝联盟有优惠券的接口.//https://uland.taobao.com/coupon/edetail { var coupon = CheckCoupon(url);//将返利接口转成淘宝宝贝接口 if (coupon != null) return coupon.itemId; } else if (url.Contains(@"s.click.taobao.com"))//这是针对淘宝联盟没有的接口.//https://s.click.taobao.com/t?e=m { var html = string.Empty; string locUrl = HttpExtend.GetLocationUrl(url); if (!string.IsNullOrWhiteSpace(locUrl) && locUrl.StartsWith("https://s.click.taobao.com/t?e=", StringComparison.OrdinalIgnoreCase)) { var locUrlTmp = HttpExtend.GetLocationUrl(locUrl); if (!string.IsNullOrEmpty(locUrlTmp)) locUrl = locUrlTmp; } if (!string.IsNullOrEmpty(locUrl))//跳转地址存在 { if (locUrl.ToLower().Contains("uland.taobao.com/coupon/edetail?")) { var reg = Regex.Match(locUrl, @"(?:&|\?)itemId=(\d+)", RegexOptions.IgnoreCase); if (reg.Success) return reg.Groups[1].Value; html = HttpHelper.URLDecode(new HttpHelper().GetHtml(locUrl).Html); var reqUrl = Regex.Match(html, "&req_url=([^\"]+)", RegexOptions.IgnoreCase); if (reqUrl.Success) { var param_e = Regex.Match(reqUrl.Groups[1].Value, "e=([^&]+)"); if (!param_e.Success) return string.Empty; var coupon = CheckCoupon(reqUrl.Groups[1].Value); if (coupon != null) return coupon.itemId; } } else if (locUrl.Contains("uland.taobao.com")) { var _reg = Regex.Match(locUrl, "itemId=(\\d+)", RegexOptions.IgnoreCase); if (_reg.Success) return _reg.Groups[1].Value; } else if (locUrl.Contains("tu=")) { //获得二次访问地址 string next = HttpHelper.URLDecode(locUrl.Replace("http://s.click.taobao.com/t_js?tu=", "").Replace("https://s.click.taobao.com/t_js?tu=", "")); html = HttpHelper.URLDecode(new HttpHelper().GetHtml(next, referer: locUrl).Html); var reg = Regex.Match(html, @"(?:&|\?)itemId=(\d+)", RegexOptions.IgnoreCase); if (reg.Success) return reg.Groups[1].Value; } else return GetItemIdByContent(new HttpHelper().GetHtml(locUrl).Html); } #region if (string.IsNullOrWhiteSpace(locUrl)) { html = new HttpHelper().GetHtml(url).Html; var reg = Regex.Match(html, "real_jump_address = '(?<真正的跳转地址>[^']+)"); if (reg.Success) { var address = reg.Groups["真正的跳转地址"].Value; for (int i = 0; i < 3; i++) { html = new HttpHelper().GetHtml(address.Replace("&", "&"), referer: url).Html; var itemid = GetItemIdByContent(html); if (!string.IsNullOrWhiteSpace(itemid)) return itemid; else { //访问频繁,休息重试3次 Thread.Sleep(500); } } } } #endregion } } catch (Exception ex) { Console.WriteLine(ex.Message); } return string.Empty; } private static DateTime NextTime = DateTime.MinValue; /// /// 淘宝优惠券 /// public class TaobaoCoupon { /// /// 优惠券状态,!=0表示优惠券失效或没有优惠券 /// public int retStatus { get; set; } /// /// 使用条件 /// public string startFee { get; set; } /// /// 使用金额 /// public string amount { get; set; } /// /// 店铺Logo /// public string shopLogo { get; set; } /// /// 店铺名称 /// public string shopName { get; set; } /// /// 使用时间 /// public DateTime effectiveStartTime { get; set; } /// /// 活动截止时间 /// public DateTime effectiveEndTime { get; set; } /// /// 点击下单 /// public string clickUrl { get; set; } /// /// 分享地址 /// public string shareUrl { get; set; } /// /// 软件标题 /// public string title { get; set; } /// /// 原价 /// public string reservePrice { get; set; } /// /// 折扣价格 /// public string discountPrice { get; set; } /// /// 30天销量 /// public int biz30Day { get; set; } /// /// 是否是天猫 ,1(是) /// public string tmall { get; set; } /// /// 未知参数 /// public int postFree { get; set; } /// /// 宝贝ID /// public string itemId { get; set; } /// /// 未知参数 /// public string couponFlowLimit { get; set; } } /// /// 检测淘宝优惠券 /// /// 优惠券地址 /// public TaobaoCoupon CheckCoupon(string coupon_click_url) { string html = string.Empty; try { if (coupon_click_url.Contains("coupon/details") || coupon_click_url.Contains("coupon/edetail")) { TaobaoCoupon c = new TaobaoCoupon(); coupon_click_url = coupon_click_url.Replace("coupon/details", "cp/coupon/").Replace("coupon/edetail", "cp/coupon/"); var http = new HttpHelper(); for (int i = 0; i < 4; i++) { if (NextTime > DateTime.Now) return null; var item = http.GetItem(coupon_click_url); item.Timeout = 30000; item.ReadWriteTimeout = 20000; item.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:18.0) Gecko/20100101 Firefox/18.0"; item.ContentType = "application/x-www-form-urlencoded"; item.SetProxyipCDN(); html = http.GetHtml(item).Html.Replace("\\", ""); if (html.Contains("亲,小二正忙,滑动一下马上回来") || html.Contains("操作超时") || html == @"{""success"": false}") { if (i == 3) { NextTime = DateTime.Now.AddMinutes(2); return null; } Thread.Sleep(500); continue; } var _obj = HttpExtend.JsonToDictionary(html);//转成字典 if (_obj != null) { _obj = _obj["result"] as Dictionary; _obj.ConvertToObj(c); if (c.retStatus == 1) continue; _obj = _obj["item"] as Dictionary; if (_obj["clickUrl"] != null) _obj["clickUrl"] = "http:" + _obj["clickUrl"].ToString(); if (_obj["shareUrl"] != null) _obj["shareUrl"] = "http:" + _obj["shareUrl"].ToString(); _obj.ConvertToObj(c); if (c.retStatus == 2 || c.retStatus == 0 || c.retStatus == 4) return c; } } } } catch (Exception ex) { // Client.SigleClient.Event.OnLog($@"检查淘宝优惠券异常", Exception: ex); } return null; } public class TaobaoIteminfo { /// /// 优惠券剩余量 /// public int coupon_remain_count { get; set; } //coupon_remain_count Number 6859 优惠券剩余量 //优惠券总量 public int coupon_total_count { get; set; } //coupon_total_count Number 8000 优惠券总量 /// /// 优惠券面额 /// public string coupon_info { get; set; } //coupon_info String 满16元减10元 优惠券面额 /// /// 优惠券结束时间 /// public DateTime coupon_end_time { get; set; } // coupon_end_time String 2016-09-26 优惠券结束时间 /// /// 优惠券开始时间 /// public DateTime coupon_start_time { get; set; } // coupon_start_time String 2016-09-25 优惠券开始时间 /// /// 优惠券(商品优惠券推广链接中的券)类型,1 公开券,2 私有券,3 妈妈券 /// public int coupon_type { get; set; } //coupon_type Number 1 优惠券(商品优惠券推广链接中的券)类型,1 公开券,2 私有券,3 妈妈券 /// /// 商品优惠券推广链接 /// public string coupon_click_url { get; set; } //coupon_click_url String https://uland.taobao.com/coupon/edetail?e=nqUNB1NOF3Bt3vqbdXnGloankzPYmeEFkgNrw6YHQf9pZTj41Orn8MwBAs06HAOzqQomYNedOiHDYPmqkFXqLR0HgBdG%2FDDL%2F1M%2FBw7Sf%2FesGXLf%2BqX4cbeC%2F2cR0p0NlWH0%2BknxpnCJJP%2FQkZSsyo1HvKjXo4uz&pid=mm_26381042_12970066_52864659&af=1 商品优惠券推广链接 /// /// 后台一级类目 /// public int category_id { get; set; } //category_id Number 1 后台一级类目 /// /// 展示常规佣金率 /// public double max_commission_rate { get; set; } //max_commission_rate String 20.3 当不入参special_id、relation_id、external_id时,展示常规佣金率(%) /// /// 商品id /// public string item_id { get; set; } //item_id Number 524136796550 商品id /// /// 商品地址 /// public string item_url { get; set; } //item_url String https://s.click.taobao.com/t?spm=a2e2e.10720394/c.90202110.1.4399704cUUhhH0&e=m%3D2%26s%3D0NJS731SUEdw4vFB6t2Z2ueEDrYVVa64LKpWJ%2Bin0XLjf2vlNIV67uIA4kDYDopEpOjgxi0uT208hw4H8GMUew7uoRPWrIBwR7CIpaNCoiKr9WTFywb%2BCtGNFs53xi4QGSKqJrqeJvt5ArodCWjzv9fsai3uVirbXH%2BQH9e66Y4%3D 商品淘客链接 /// /// 预售有礼-推广链接 /// public string ysyl_click_url { get; set; } //ysyl_click_url String https://uland.taobao.com/coupon/edetail?e=nqUNB1NOF3Bt3vqbdXnGloankzPYmeEFkgNrw6YHQf9pZTj41Orn8MwBAs06HAOzqQomYNedOiHDYPmqkFXqLR0HgBdG%2FDDL%2F1M%2FBw7Sf%2FesGXLf%2BqX4cbeC%2F2cR0p0NlWH0%2BknxpnCJJP%2FQkZSsyo1HvKjXo4uz&pid=mm_26381042_12970066_52864659&af=1 预售有礼-推广链接 /// /// 预售有礼-预估淘礼金(元) /// public string ysyl_tlj_face { get; set; } //ysyl_tlj_face String 0.6 预售有礼-预估淘礼金(元) /// /// 预售有礼-淘礼金发放时间 /// public string ysyl_tlj_send_time { get; set; } //ysyl_tlj_send_time String 2019-11-10 21:59:59 预售有礼-淘礼金发放时间 /// /// 预售有礼-淘礼金使用开始时间 /// public string ysyl_tlj_use_start_time { get; set; } //ysyl_tlj_use_start_time String 2019-11-10 21:59:59 预售有礼-淘礼金使用开始时间 /// /// 预售有礼-佣金比例 /// public string ysyl_commission_rate { get; set; } //ysyl_commission_rate String 20.3 预售有礼-佣金比例(%)( 预售有礼活动享受的推广佣金比例,注:推广该活动有特殊分成规则,请详见:https://tbk.bbs.taobao.com/detail.html?appId=45301&postId=9334376 ) public string ysyl_tlj_use_end_time { get; set; } //ysyl_tlj_use_end_time String 2019-11-10 21:59:59 预售有礼-淘礼金使用结束时间 /// /// 预估最低佣金率 /// public double min_commission_rate { get; set; } //min_commission_rate String 20.3 当入参special_id、relation_id、external_id时,该字段展示预估最低佣金率(%) /// /// 比价场景专用 /// public int reward_info { get; set; } //reward_info Number 1 比价场景专用,当系统检测到入参消费者ID购买当前商品会获得《天天开彩蛋》玩法的彩蛋时,该字段显示1,否则为0 } /// /// 单品券高效转链 /// /// 需要转链的产品ID /// 会员运营ID /// public TaobaoIteminfo ConvertItemid(string ItemId, long? SpecialId = null) { object transportData; if (SpecialId != null) { transportData = new { adzone_id = this.Meadia.AdzoneId, site_id = this.Meadia.SiteId, item_id = ItemId, special_id = SpecialId }; } else { transportData = new { adzone_id = this.Meadia.AdzoneId, site_id = this.Meadia.SiteId, item_id = ItemId }; } var data = GetJSON("taobao.tbk.privilege.get", transportData); TaobaoIteminfo obj = new TaobaoIteminfo(); Utils.Util.CopyToObj(data,obj); return obj; } /// /// 获取会员绑定的specialId /// /// 通常情况下为wxid /// public long GetSpecialId(string ExternalId) { var data = GetJSON("taobao.tbk.sc.publisher.info.get", new { info_type = 2, relation_app = "common", external_id = ExternalId, external_type = 1 }); if (data["inviter_list"]["map_data"].Count() > 0) { return (long)data["inviter_list"]["map_data"].First["special_id"]; } return 0; } /// /// 获取私域标记链接 /// /// /// /// /// /// public string GetRelationLink(string WxId, string RedirectUrl, int ExternalType = 1, int? UcRowdId = null) { object transportData; if (UcRowdId != null) { transportData = new { external_id = WxId, external_type = ExternalType, op_type = 2, redirect_url = RedirectUrl, ucrowd_id = UcRowdId }; } else { transportData = new { external_id = WxId, external_type = ExternalType, op_type = 2, redirect_url = RedirectUrl }; } var data = GetJSON("taobao.tbk.sc.relation.record", transportData); return data["url"].ToString(); } } }