868 lines
35 KiB
C#
868 lines
35 KiB
C#
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<string, string> parameters, string secret, string signMethod = "hmac")
|
||
{
|
||
// 第一步:把字典按Key的字母顺序排序
|
||
IDictionary<string, string> sortedParams = new SortedDictionary<string, string>(parameters, StringComparer.Ordinal);
|
||
|
||
// 第二步:把所有参数名和参数值串在一起
|
||
StringBuilder query = new StringBuilder();
|
||
if (SIGN_METHOD_MD5.Equals(signMethod))
|
||
{
|
||
query.Append(secret);
|
||
}
|
||
foreach (KeyValuePair<string, string> 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();
|
||
}
|
||
|
||
/// <summary>
|
||
/// 计算签名,返回请求阿里妈妈服务器的参数
|
||
/// </summary>
|
||
/// <param name="_api">api名称</param>
|
||
/// <param name="_data">参数</param>
|
||
/// <param name="appkey">appkey</param>
|
||
/// <param name="appsecret">appsecret</param>
|
||
/// <returns></returns>
|
||
private string GetAlimamaRequestData(string _api, object _data, string appkey = "", string appsecret = "", string token = "")
|
||
{
|
||
try
|
||
{
|
||
var data = _data;
|
||
var api = _api;
|
||
Dictionary<string, string> param = new Dictionary<string, string>();
|
||
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;
|
||
}
|
||
|
||
/// <summary>
|
||
/// 请求淘宝服务器端
|
||
/// </summary>
|
||
/// <param name="ApiName">api名称</param>
|
||
/// <param name="Data">参数</param>
|
||
/// <param name="ThrowException">异常是否抛出</param>
|
||
/// <returns></returns>
|
||
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
|
||
|
||
|
||
/// <summary>
|
||
/// 更新订单
|
||
/// </summary>
|
||
/// <param name="StartTime">开始时间</param>
|
||
/// <param name="EndTime">结束时间</param>
|
||
/// <param name="orderScene">同步的订单类型</param>
|
||
/// <returns>返回错误原因</returns>
|
||
public Task<string> UpdateOrder(DateTime StartTime, DateTime EndTime, TBOrderScene orderScene = TBOrderScene.常规订单)
|
||
{
|
||
return Task.Factory.StartNew<string>(() =>
|
||
{
|
||
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;
|
||
});
|
||
}
|
||
|
||
/// <summary>
|
||
/// 淘口令解析并转链 返回商品ID 【淘宝客-服务商-淘口令解析&转链】
|
||
/// </summary>
|
||
/// <returns></returns>
|
||
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 });
|
||
}
|
||
/// <summary>
|
||
/// 正则获取Url链接
|
||
/// </summary>
|
||
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;
|
||
}
|
||
|
||
/// <summary>
|
||
/// 解析宝贝地址
|
||
/// </summary>
|
||
/// <returns></returns>
|
||
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;
|
||
}
|
||
|
||
/// <summary>
|
||
/// 判断是否为淘宝的相关域名,后续有新的在这个位置添加
|
||
/// </summary>
|
||
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 = '(?<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;
|
||
}
|
||
|
||
/// <summary>
|
||
/// 查找宝贝Id的正则表达式
|
||
/// 注:追加为最后一个括号前加|(?:新的正则)
|
||
/// </summary>
|
||
private static string RegItemId = @"((?:item[Ii]d=(?<itemid>\d{5,}))|(?:item_id=(?<itemid>\d{5,}))|(?:\?id=(?<itemid>\d{5,}))|(?:&id=(?<itemid>\d{5,}))|(?:/i(?<itemid>\d{5,}))|(?:num[Ii]id=(?<itemid>\d{5,})))";
|
||
|
||
/// <summary>
|
||
/// 正则表达式匹配商品Id
|
||
/// </summary>
|
||
/// <param name="Content">查找的内容</param>
|
||
/// <returns>查找到的宝贝id</returns>
|
||
public string GetItemIdByContent(string Content)
|
||
{
|
||
var reg = Regex.Match(Content, RegItemId);
|
||
if (reg.Success)
|
||
return reg.Groups["itemid"].Value;
|
||
return string.Empty;
|
||
}
|
||
|
||
/// <summary>
|
||
/// 通过优惠券链接获取淘宝宝贝的id
|
||
/// </summary>
|
||
/// <param name="url"></param>
|
||
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;
|
||
|
||
|
||
/// <summary>
|
||
/// 淘宝优惠券
|
||
/// </summary>
|
||
public class TaobaoCoupon
|
||
{
|
||
/// <summary>
|
||
/// 优惠券状态,!=0表示优惠券失效或没有优惠券
|
||
/// </summary>
|
||
public int retStatus { get; set; }
|
||
|
||
/// <summary>
|
||
/// 使用条件
|
||
/// </summary>
|
||
public string startFee { get; set; }
|
||
|
||
/// <summary>
|
||
/// 使用金额
|
||
/// </summary>
|
||
public string amount { get; set; }
|
||
|
||
/// <summary>
|
||
/// 店铺Logo
|
||
/// </summary>
|
||
public string shopLogo { get; set; }
|
||
|
||
/// <summary>
|
||
/// 店铺名称
|
||
/// </summary>
|
||
public string shopName { get; set; }
|
||
|
||
/// <summary>
|
||
/// 使用时间
|
||
/// </summary>
|
||
public DateTime effectiveStartTime { get; set; }
|
||
|
||
/// <summary>
|
||
/// 活动截止时间
|
||
/// </summary>
|
||
public DateTime effectiveEndTime { get; set; }
|
||
|
||
/// <summary>
|
||
/// 点击下单
|
||
/// </summary>
|
||
public string clickUrl { get; set; }
|
||
|
||
/// <summary>
|
||
/// 分享地址
|
||
/// </summary>
|
||
public string shareUrl { get; set; }
|
||
|
||
/// <summary>
|
||
/// 软件标题
|
||
/// </summary>
|
||
public string title { get; set; }
|
||
|
||
/// <summary>
|
||
/// 原价
|
||
/// </summary>
|
||
public string reservePrice { get; set; }
|
||
|
||
/// <summary>
|
||
/// 折扣价格
|
||
/// </summary>
|
||
public string discountPrice { get; set; }
|
||
|
||
/// <summary>
|
||
/// 30天销量
|
||
/// </summary>
|
||
public int biz30Day { get; set; }
|
||
|
||
/// <summary>
|
||
/// 是否是天猫 ,1(是)
|
||
/// </summary>
|
||
public string tmall { get; set; }
|
||
|
||
/// <summary>
|
||
/// 未知参数
|
||
/// </summary>
|
||
public int postFree { get; set; }
|
||
|
||
/// <summary>
|
||
/// 宝贝ID
|
||
/// </summary>
|
||
public string itemId { get; set; }
|
||
|
||
/// <summary>
|
||
/// 未知参数
|
||
/// </summary>
|
||
public string couponFlowLimit { get; set; }
|
||
}
|
||
|
||
/// <summary>
|
||
/// 检测淘宝优惠券
|
||
/// </summary>
|
||
/// <param name="coupon_click_url">优惠券地址</param>
|
||
/// <returns></returns>
|
||
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<string, object>;
|
||
_obj.ConvertToObj(c);
|
||
if (c.retStatus == 1) continue;
|
||
_obj = _obj["item"] as Dictionary<string, object>;
|
||
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
|
||
{
|
||
/// <summary>
|
||
/// 优惠券剩余量
|
||
/// </summary>
|
||
public int coupon_remain_count { get; set; }
|
||
//coupon_remain_count Number 6859 优惠券剩余量
|
||
|
||
//优惠券总量
|
||
public int coupon_total_count { get; set; }
|
||
//coupon_total_count Number 8000 优惠券总量
|
||
|
||
/// <summary>
|
||
/// 优惠券面额
|
||
/// </summary>
|
||
public string coupon_info { get; set; }
|
||
//coupon_info String 满16元减10元 优惠券面额
|
||
|
||
/// <summary>
|
||
/// 优惠券结束时间
|
||
/// </summary>
|
||
public DateTime coupon_end_time { get; set; }
|
||
// coupon_end_time String 2016-09-26 优惠券结束时间
|
||
|
||
/// <summary>
|
||
/// 优惠券开始时间
|
||
/// </summary>
|
||
public DateTime coupon_start_time { get; set; }
|
||
// coupon_start_time String 2016-09-25 优惠券开始时间
|
||
|
||
/// <summary>
|
||
/// 优惠券(商品优惠券推广链接中的券)类型,1 公开券,2 私有券,3 妈妈券
|
||
/// </summary>
|
||
public int coupon_type { get; set; }
|
||
//coupon_type Number 1 优惠券(商品优惠券推广链接中的券)类型,1 公开券,2 私有券,3 妈妈券
|
||
|
||
/// <summary>
|
||
/// 商品优惠券推广链接
|
||
/// </summary>
|
||
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 商品优惠券推广链接
|
||
|
||
/// <summary>
|
||
/// 后台一级类目
|
||
/// </summary>
|
||
public int category_id { get; set; }
|
||
//category_id Number 1 后台一级类目
|
||
|
||
/// <summary>
|
||
/// 展示常规佣金率
|
||
/// </summary>
|
||
public double max_commission_rate { get; set; }
|
||
//max_commission_rate String 20.3 当不入参special_id、relation_id、external_id时,展示常规佣金率(%)
|
||
|
||
/// <summary>
|
||
/// 商品id
|
||
/// </summary>
|
||
public string item_id { get; set; }
|
||
//item_id Number 524136796550 商品id
|
||
|
||
/// <summary>
|
||
/// 商品地址
|
||
/// </summary>
|
||
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 商品淘客链接
|
||
|
||
/// <summary>
|
||
/// 预售有礼-推广链接
|
||
/// </summary>
|
||
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 预售有礼-推广链接
|
||
|
||
/// <summary>
|
||
/// 预售有礼-预估淘礼金(元)
|
||
/// </summary>
|
||
public string ysyl_tlj_face { get; set; }
|
||
//ysyl_tlj_face String 0.6 预售有礼-预估淘礼金(元)
|
||
|
||
/// <summary>
|
||
/// 预售有礼-淘礼金发放时间
|
||
/// </summary>
|
||
public string ysyl_tlj_send_time { get; set; }
|
||
//ysyl_tlj_send_time String 2019-11-10 21:59:59 预售有礼-淘礼金发放时间
|
||
|
||
/// <summary>
|
||
/// 预售有礼-淘礼金使用开始时间
|
||
/// </summary>
|
||
public string ysyl_tlj_use_start_time { get; set; }
|
||
//ysyl_tlj_use_start_time String 2019-11-10 21:59:59 预售有礼-淘礼金使用开始时间
|
||
|
||
/// <summary>
|
||
/// 预售有礼-佣金比例
|
||
/// </summary>
|
||
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 预售有礼-淘礼金使用结束时间
|
||
|
||
/// <summary>
|
||
/// 预估最低佣金率
|
||
/// </summary>
|
||
public double min_commission_rate { get; set; }
|
||
//min_commission_rate String 20.3 当入参special_id、relation_id、external_id时,该字段展示预估最低佣金率(%)
|
||
|
||
/// <summary>
|
||
/// 比价场景专用
|
||
/// </summary>
|
||
public int reward_info { get; set; }
|
||
//reward_info Number 1 比价场景专用,当系统检测到入参消费者ID购买当前商品会获得《天天开彩蛋》玩法的彩蛋时,该字段显示1,否则为0
|
||
}
|
||
|
||
/// <summary>
|
||
/// 单品券高效转链
|
||
/// </summary>
|
||
/// <param name="ItemId">需要转链的产品ID</param>
|
||
/// <param name="SpecialId">会员运营ID</param>
|
||
/// <returns></returns>
|
||
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;
|
||
}
|
||
|
||
/// <summary>
|
||
/// 获取会员绑定的specialId
|
||
/// </summary>
|
||
/// <param name="ExternalId">通常情况下为wxid</param>
|
||
/// <returns></returns>
|
||
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;
|
||
}
|
||
|
||
/// <summary>
|
||
/// 获取私域标记链接
|
||
/// </summary>
|
||
/// <param name="WxId"></param>
|
||
/// <param name="RedirectUrl"></param>
|
||
/// <param name="ExternalType"></param>
|
||
/// <param name="UcRowdId"></param>
|
||
/// <returns></returns>
|
||
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();
|
||
}
|
||
|
||
}
|
||
}
|