//=============================================================
// 创建人:千年老妖
// 本页代码,均为原创。对未经许可擅自使用者,本人保留追究其法律责任的权利。
//==============================================================
using Api.Framework.Events;
using Api.Framework.Model;
using CsharpHttpHelper;
using Api.Framework.Tools;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using System.Threading;
using Api.Framework.Utils;
using Api.Framework.Enums;
using System.Net;
using System.Web;
using System.Web.Caching;
using Api.Framework.Timers;
using System.Windows.Forms;
using Api.Framework.Data.TB;
using Api.Framework.EntityTmp;
using Api.Framework.Extents;
using Microsoft.ClearScript.Util.Web;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
namespace Api.Framework.Cps
{
///
/// 阿里妈妈操作Api
///
public class AlimamaApi : BaseCpsApi
{
#region 静态功能
///
/// url请求方法
///
///
///
private static string M_GET_HTML(string tempUrl)
{
try
{
HttpItem item = new HttpItem()
{
URL = tempUrl, //URL 必需项
Method = "get", //URL 可选项 默认为Get
IsToLower = false, //得到的HTML代码是否转成小写 可选项默认转小写
Cookie = Cookies + ";random=" + new Random().Next(), //字符串Cookie 可选项
Referer = "http://m.taobao.com", //来源URL 可选项
Timeout = 100000, //连接超时时间 可选项默认为100000
ReadWriteTimeout = 30000, //写入Post数据超时时间 可选项默认为30000
UserAgent =
"Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)", //用户的浏览器类型,版本,操作系统 可选项有默认值
ContentType = "text/html", //返回类型 可选项有默认值
Allowautoredirect = false, //是否根据301跳转 可选项
};
HttpHelper http = new HttpHelper();
//HttpResult result = http.GetHtml(item);
var result = http.GetHtml(item);
if (!string.IsNullOrEmpty(result.Cookie))
{
Cookies = result.UpdateCookies(Cookies);
}
return result.Html;
}
catch (Exception ex)
{
//Console.WriteLine(ex.Message);
return string.Empty;
}
}
private static string appKey = "12574478";
private static string Cookies = string.Empty;
private static Dictionary M_GET(string api, object data, string version = "1.0")
{
//_cookies = string.Empty;
int number = 1;
Next:
string time = ((DateTime.Now.ToUniversalTime().Ticks - 621355968000000000) / 10000).ToString();
string mh5Tk = HttpExtend.GetCookiesValue("_m_h5_tk", Cookies);
mh5Tk = string.IsNullOrEmpty(mh5Tk) ? "f64aa152f943661f750e6212ebc98804_1481170439770" : mh5Tk;
string json = (data.GetType() == typeof(string))
? data.ToString()
: HttpHelper.ObjectToJson(data).Replace("\\u0026", "&");
string temp_ = mh5Tk + "&" + time + "&" + appKey + "&" + json;
string sign = HttpHelper.ToMD5(temp_).ToLower();
;
string send = HttpHelper.URLEncode(json);
string temp =
string.Format(
"http://acs.m.taobao.com/h5/{5}/{4}/?v={4}&api={5}&appKey={0}&t={1}&callback=mtopjsonp1&type=jsonp&sign={2}&data={3}",
appKey, time, sign, send, version, api);
string html = M_GET_HTML(temp).Trim();
if ((html.Contains("令牌过期") || html.Contains("令牌为空") || html.Contains("失效") ||
html.Contains("login.m.taobao.com")))
{
if (number < 5)
{
number++;
goto Next;
}
}
var reg = System.Text.RegularExpressions.Regex.Match(html, @"^mtopjsonp1\((.*?)\)$",
System.Text.RegularExpressions.RegexOptions.IgnoreCase);
if (reg.Success)
{
var dic = HttpExtend.JsonToDictionary(reg.Groups[1].Value);
if (dic.ContainsKey("data") && html.Contains("SUCCESS::调用成功"))
return dic["data"] as Dictionary;
throw new Exception(reg.Groups[1].Value);
}
throw new Exception(html);
}
private static Dictionary error_next = new Dictionary();
///
/// 解析优惠券信息
///
/// 商家id
/// 优惠券id
///
///
public static Dictionary mtop_alimama_union_hsf_coupon_get(string sellerId, string activityId,
string pid = "")
{
try
{
//222097624044 7b66a82d352a4af481bc85452fcf3344
if (string.IsNullOrEmpty(pid)) pid = "mm_33231688_7050284_23466709";
string api = "mtop.alimama.union.hsf.mama.coupon.get";
string version = "1.0";
var data = new
{
sellerId = sellerId,
activityId = activityId,
pid = pid
};
if (!error_next.ContainsKey(api) || error_next[api] > DateTime.Now)
{
try
{
var result = M_GET(api, data, version);
return result;
}
catch (Exception ex)
{
if (ex.Message.Contains("访问受限"))
{
error_next[api] = DateTime.Now.AddMinutes(10);
}
else throw new Exception("mauhcg:" + ex.Message);
}
}
}
catch (Exception ex)
{
// Client.OnLog("error:mtop_alimama_union_hsf_coupon_get->" + ex.Message);
}
return null;
}
#endregion
///
/// 优惠券结构类
///
public class Coupon
{
///
/// 优惠券状态,!=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; }
}
#region 私域数据异步绑定
///
/// 淘宝eid绑定缓存
///
public class TBEidExid
{
///
/// 淘宝客外部用户标记,如自身系统账户ID;微信ID等
///
public string special_id { get; set; }
///
/// 失效时间
///
public int dietime { get; set; }
///
/// eid
///
public string external_id { get; set; }
}
///
/// 缓存
///
private static Dictionary> TBEidExidList = new Dictionary>();
///
/// 添加Eid缓存
///
/// eid
public void AddTBEid(string external_id)
{
try
{
if (!TBEidExidList.ContainsKey(Member.username))
TBEidExidList.Add(Member.username, new List());
var ext = TBEidExidList[Member.username].FirstOrDefault(f => f.external_id == external_id);
if (ext != null && ext.dietime < HttpExtend.GetTimeStamp(DateTime.Now))
{
TBEidExidList[Member.username].Remove(ext);
ext = null;
}
if (ext == null)
{
TBEidExidList[Member.username].Add(new TBEidExid()
{ external_id = external_id, dietime = HttpExtend.GetTimeStamp(DateTime.Now.AddMinutes(10)) });
}
}
catch (Exception ex)
{
}
}
private static Dictionary RunEidSyncDic = new Dictionary();
///
/// 同步私域数据
///
private static System.Threading.Timer timer =
new System.Threading.Timer(new TimerCallback(EidSync), null, 0, 1000 * 60 * 2);
private static TBHelper.TbAnalysis tbAnalysis = new TBHelper.TbAnalysis();
private static int runNum = 1;
///
/// 同步私域数据
///
///
private static void EidSync(object state)
{
try
{
if (!tbAnalysis.IsRunTBSiYu())
return;
runNum++;
if (TBEidExidList.Count == 0) return;
var cpsMembers = CpsClient.Members
.Where(f => f.cpstype == CpsType.阿里妈妈 && f.is_download == SwitchType.开启).ToList();
Task[] _task = new Task[cpsMembers.Count];
for (int i = 0; i < cpsMembers.Count; i++)
{
var cps = cpsMembers[i];
_task[i] = new Task(delegate
{
if (RunEidSyncDic.ContainsKey(cps.username))
return;
try
{
RunEidSyncDic.Add(cps.username, cps.username);
var api = CpsClient.CreateAlimamaRequest(cps);
if (!TBEidExidList.ContainsKey(cps.username) || TBEidExidList[cps.username].Count == 0)
return;
#region 删除过期的数据
if (runNum % 10 == 0)
{
try
{
var dieEidList = TBEidExidList[cps.username]
.Where(f => f.dietime < HttpExtend.GetTimeStamp(DateTime.Now)).ToList();
for (int q = 0; q < dieEidList.Count; q++)
{
TBEidExidList[cps.username].Remove(dieEidList[q]);
}
}
catch (Exception ex)
{
}
}
#endregion
TBEidExidList[cps.username] = TBEidExidList[cps.username]
.Where(f => f.dietime >= HttpExtend.GetTimeStamp(DateTime.Now)).ToList();
var arrList = tbAnalysis.FindTbPublisherInfoAll(api);
List> dicList = new List>();
foreach (Dictionary item in arrList)
{
if (item.ContainsKey("external_id"))
dicList.Add(item);
}
var db = ApiClient.GetSession();
bool isUpdate = false;
for (int e = 0; e < TBEidExidList[cps.username].Count; e++)
{
try
{
var result = dicList.Where(z =>
z["external_id"].ToString() == TBEidExidList[cps.username][e].external_id)
.ToList();
if (result != null && result.Count != 0)
{
var count = result.Count;
if (count == 1)
{
var special_id = long.Parse(result[0]["special_id"].ToString());
var external_id = TBEidExidList[cps.username][e].external_id;
var relation = db.FindTbRelations().FirstOrDefault(f =>
f.special_id == special_id && f.cps_memberid == cps.username);
if (relation == null)
relation = new fl_tb_relation()
{ cps_memberid = cps.username, special_id = special_id };
if (relation.username != external_id)
{
isUpdate = true;
relation.username = external_id;
relation = db.Saveable(relation).ExecuteReturnEntity();
}
TBEidExidList[cps.username].Remove(TBEidExidList[cps.username][e]);
}
//else if (count > 1)
//{
// for (int w = 0; w < result.Count; w++)
// {
// dicList.Remove(result[w]);
// }
//}
}
}
catch (Exception ex)
{
}
}
if (isUpdate)
db.FindTbRelations(true);
}
catch (Exception ex)
{
EventClient.OnEvent("私域异步绑定", ex.Message);
}
finally
{
if (RunEidSyncDic.ContainsKey(cps.username))
RunEidSyncDic.Remove(cps.username);
}
});
_task[i].Start();
Thread.Sleep(1);
}
Task.WaitAll(_task);
}
catch (Exception ex)
{
EventClient.OnEvent("", $"私域异步绑定异常:{ex.Message} - {ex.StackTrace}");
}
}
#endregion
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();
}
private static DateTime servertime = DateTime.MinValue;
#region 老道重新修改
private static string tlj = "taobao.tbk.dg.vegas.tlj.create";
private static string[] not_session = new string[] { "taobao.tbk.item.info.get", tlj };
private static int[] server_port = new[] { 30001, 30002, 30003, 30004, 30005 };
///
/// 计算签名,返回请求阿里妈妈服务器的参数
///
/// api名称
/// 参数
/// appkey
/// appsecret
///
private string GetAlimamaRequestData(string _api, object _data, string appkey = "", string appsecret = "")
{
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;
}
var app_id = Token.appid;
var app_key = Token.appkey;
var accessToken = Token.access_token;
//#if DEBUG
// app_id = "33951412";
// app_key = "ab478e5a7332acee4ee3e4f56f70a6cb";
// accessToken = "6100412e139f270d8430132973d2e7cefbbb26be53653b12200733453642";
//#endif
//淘礼金接口
if (tlj == api)
{
if (string.IsNullOrWhiteSpace(appkey)) throw new Exception("淘礼金appkey不能为空,终止淘礼金生成操作");
if (string.IsNullOrWhiteSpace(appsecret)) throw new Exception("淘礼金appsecret不能为空,终止淘礼金生成操作");
app_id = appkey;
app_key = appsecret;
}
param["method"] = api;
param["app_key"] = app_id;
if (!not_session.Contains(api))
param["session"] = accessToken;
//param["session"] = "7000010023374d0168aa5c8b8404a7d1de45cfb11ad3114891fccad8b7384c4d05d4e3c862677733";
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, app_key, param["sign_method"]);
param["sign"] = sign;
return HttpExtend.BuildQuery(param);
}
catch (Exception ex)
{
}
return string.Empty;
}
///
/// 请求淘宝服务器端
///
/// api名称
/// 参数
/// appkey
/// appsecret
///
private Dictionary SendTaobaoServer(string _api, object _data, string _appkey = "",
string _appsecret = "")
{
var data = _data;
var api = _api;
var appkey = _appkey;
var appsecret = _appsecret;
int number = 0;
Next:
number++;
if (!Member.is_valid && !this.RefToken()) throw new Exception("授权状态已过期,请重新登陆阿里妈妈!");
var query = GetAlimamaRequestData(api, data, appkey, appsecret);
var html = string.Empty;
string _url = string.Empty;
try
{
HttpHelper http = new HttpHelper();
_url = "http://gw.api.taobao.com/router/rest?" + query;
if (servertime > DateTime.Now || (number > 2 && api == "taobao.tbk.item.info.get"))
{
try
{
var _item = http.GetItem(
$"http://jushita.api.52cmg.cn:{server_port[new Random().Next(0, server_port.Length)]}/api/http/gethtml",
"", $"url={HttpHelper.URLEncode(_url)}");
var _html = http.GetHtml(_item).Html;
//if (api == "taobao.tbk.sc.tpwd.convert") EventClient.OnEvent("解析日志", _html);
var _dic = HttpExtend.JsonToDictionary(_html);
if (_dic != null && _dic["Code"].ToString() == "0") html = _dic["Data"].ToString();
}
catch (Exception)
{
}
}
if (string.IsNullOrEmpty(html))
{
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"}}
html = result.Html;
if (result != null && result.StatusCode != System.Net.HttpStatusCode.OK)
throw new Exception(html);
}
//Console.WriteLine($"html = {html}");
var dic = HttpExtend.JsonToDictionary(html);
if (dic == null) throw new Exception(html);
if (dic.ContainsKey("error_response"))
throw new Exception(html);
var key = api.Replace("taobao.", "").Replace(".", "_") + "_response";
if (!dic.ContainsKey(key)) throw new Exception($"key = {key},html = {html}");
dic = dic[key] as Dictionary;
if (dic.ContainsKey("result")) return dic["result"] as Dictionary;
if (dic.ContainsKey("results")) return dic["results"] as Dictionary;
return dic;
}
catch (Exception ex)
{
var appId = Token?.appid;
#if DEBUG
appId = "33951412";
#endif
LogHelper.GetSingleObj().Error("AlimamaApi", $"api{api},appid={appId},url={_url}");
if (ex.Message.Contains("invalid-sessionkey"))
{
Thread.Sleep(1000);
if (this.Member != null && RefToken() && this.Member.is_valid) goto Next;
else throw new Exception($"{this.Member.username}({this.Member.usernick})授权状态已过期,请重新登陆阿里妈妈!");
}
else if (ex.Message.Contains("Platform System blacklist"))
{
servertime = DateTime.Now.AddMonths(5);
if (number > 3)
{
throw ex;
}
goto Next;
}
else if (number < 3 && (ex.Message.Contains("sub_msg\":\"无结果") ||
ex.Message.Contains("Invalid signature") ||
ex.Message.Contains("请求阿里妈妈API异常") || ex.Message.Contains("未将对象引用设置到对象的实例") ||
ex.Message.Contains("操作超时") ||
(!ex.Message.Contains("SessionKey非法") &&
!ex.Message.Contains("App Call Limited")) || Regex.Match(ex.Message,
@"(""error_response"":{""code"":15,""msg"":""Remote service error"",""sub_code"":)|(操作超时)|(基础连接已经关闭)|(远程服务调用超时)|(淘宝客API服务不可用)|(HSF执行错误)")
.Success))
{
if ((ex.Message.Contains("该item_id对应宝贝已下架或非淘客宝贝") || ex.Message.Contains("sub_msg\":\"无结果")) &&
number > 1) //重试两次就直接抛出
throw ex;
Thread.Sleep(100);
goto Next;
}
else if (ex.Message.Contains("sub_msg\":\"无结果") || ex.Message.Contains("sub_msg\":\"淘口令解析结果为空") ||
ex.Message.Contains("sub_msg\":\"口令跳转url不支持口令转换"))
throw ex;
else
{
//EventClient.OnEvent(this,$@"cce:{_api.Replace("taobao.tbk.", "").Replace(".", "")} => {ex.Message} - {ex.StackTrace}
//html => {html}");
if (ex.Message.Contains("Invalid signature"))
throw new Exception($"{this.Member.username}({this.Member.usernick})Invalid signature,请求异常");
else
{
if (ex.Message.Contains("Insufficient isv permissions"))
throw new Exception(
$"{this.Member.username}({this.Member.usernick}) isv权限不足~!处理方法:1.请检测阿里妈妈权限 2.重新登陆阿里妈妈重试");
throw new Exception($"{this.Member.username}({this.Member.usernick})请求阿里妈妈接口:" + ex.Message +
" - " + ex.StackTrace);
}
}
}
}
///
/// 请求淘宝服务器端
///
/// api名称
/// 参数
/// appkey
/// appsecret
///
private JToken SendTaobaoServerJToken(string _api, object _data, string _appkey = "", string _appsecret = "")
{
var data = _data;
var api = _api;
var appkey = _appkey;
var appsecret = _appsecret;
int number = 0;
Next:
number++;
if (!Member.is_valid && !this.RefToken()) throw new Exception("授权状态已过期,请重新登陆阿里妈妈!");
var query = GetAlimamaRequestData(api, data, appkey, appsecret);
var html = string.Empty;
string _url = string.Empty;
try
{
HttpHelper http = new HttpHelper();
_url = "http://gw.api.taobao.com/router/rest?" + query;
if (servertime > DateTime.Now || (number > 2 && api == "taobao.tbk.item.info.get"))
{
try
{
var _item = http.GetItem(
$"http://jushita.api.52cmg.cn:{server_port[new Random().Next(0, server_port.Length)]}/api/http/gethtml",
"", $"url={HttpHelper.URLEncode(_url)}");
var _html = http.GetHtml(_item).Html;
//if (api == "taobao.tbk.sc.tpwd.convert") EventClient.OnEvent("解析日志", _html);
var _dic = HttpExtend.JsonToDictionary(_html);
if (_dic != null && _dic["Code"].ToString() == "0") html = _dic["Data"].ToString();
}
catch (Exception)
{
}
}
if (string.IsNullOrEmpty(html))
{
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"}}
html = result.Html;
if (result != null && result.StatusCode != System.Net.HttpStatusCode.OK)
throw new Exception(html);
}
var jsonResult = JObject.Parse(html);
if (jsonResult == null)
throw new Exception(html);
var jToken = jsonResult.First?.First;
if (jToken != null)
{
if (jToken["code"] != null)
throw new Exception(jToken.ToString());
if (jToken["results"] != null)
return jToken["results"];
if (jToken["result"] != null)
{
var jTokenResult = jToken["result"];
return (jTokenResult["data"] ?? jTokenResult);
}
if (jToken["data"] != null)
return jToken["data"];
}
return jToken;
}
catch (Exception ex)
{
var appId = Token.appid;
LogHelper.GetSingleObj().Error("AlimamaApi", $"api{api},appid={appId},url={_url}");
if (ex.Message.Contains("invalid-sessionkey"))
{
Thread.Sleep(1000);
if (this.Member != null && RefToken() && this.Member.is_valid) goto Next;
else throw new Exception($"{this.Member.username}({this.Member.usernick})授权状态已过期,请重新登陆阿里妈妈!");
}
else if (ex.Message.Contains("Platform System blacklist"))
{
servertime = DateTime.Now.AddMonths(5);
if (number > 3)
{
throw ex;
}
goto Next;
}
else if (number < 3 && (ex.Message.Contains("sub_msg\":\"无结果") ||
ex.Message.Contains("Invalid signature") ||
ex.Message.Contains("请求阿里妈妈API异常") || ex.Message.Contains("未将对象引用设置到对象的实例") ||
ex.Message.Contains("操作超时") ||
(!ex.Message.Contains("SessionKey非法") &&
!ex.Message.Contains("App Call Limited")) || Regex.Match(ex.Message,
@"(""error_response"":{""code"":15,""msg"":""Remote service error"",""sub_code"":)|(操作超时)|(基础连接已经关闭)|(远程服务调用超时)|(淘宝客API服务不可用)|(HSF执行错误)")
.Success))
{
if ((ex.Message.Contains("该item_id对应宝贝已下架或非淘客宝贝") || ex.Message.Contains("sub_msg\":\"无结果")) &&
number > 1) //重试两次就直接抛出
throw ex;
Thread.Sleep(100);
goto Next;
}
else if (ex.Message.Contains("sub_msg\":\"无结果") || ex.Message.Contains("sub_msg\":\"淘口令解析结果为空") ||
ex.Message.Contains("sub_msg\":\"口令跳转url不支持口令转换"))
throw ex;
else
{
//EventClient.OnEvent(this,$@"cce:{_api.Replace("taobao.tbk.", "").Replace(".", "")} => {ex.Message} - {ex.StackTrace}
//html => {html}");
if (ex.Message.Contains("Invalid signature"))
throw new Exception($"{this.Member.username}({this.Member.usernick})Invalid signature,请求异常");
else
{
if (ex.Message.Contains("Insufficient isv permissions"))
throw new Exception(
$"{this.Member.username}({this.Member.usernick}) isv权限不足~!处理方法:1.请检测阿里妈妈权限 2.重新登陆阿里妈妈重试");
throw new Exception($"{this.Member.username}({this.Member.usernick})请求阿里妈妈接口:" + ex.Message +
" - " + ex.StackTrace);
}
}
}
}
///
/// 淘礼金调用
///
/// api名称
/// 参数
/// appkey
/// appsecret
///
public Dictionary SendTaobao(string _api, object _data, string _appkey = "",
string _appsecret = "")
{
var data = _data;
var api = _api;
var appkey = _appkey;
var appsecret = _appsecret;
return SendTaobaoServer(api, data, appkey, appsecret);
}
///
/// 发送阿里妈妈报文
///
/// api名称
/// 参数
///
public Dictionary SendTaobao(string _api, object _data)
{
var data = _data;
var api = _api;
return SendTaobaoServer(api, data);
}
///
/// 发送阿里妈妈报文
///
/// api名称
/// 参数
///
public T SendTaobao(string _api, object _data)
{
var data = _data;
var api = _api;
return SendTaobaoServerJToken(api, data).ToObject();
}
#endregion
///
/// 解析淘口令
///
///
///
///
///
public TBPassInfoData AnalysisTkPassword(string password, string adzoneId, string siteId)
{
var data = SendTaobao("taobao.tbk.sc.tpwd.convert",
new { password_content = password, adzone_id = adzoneId, site_id = siteId });
return data;
}
///
/// 解析链接 (长短链接 s.click.taobao)
///
///
///
public AnalysisTkUrlData AnalysisTkUrl(string url, string bizSceneId)
{
var result = SendTaobao("taobao.tbk.item.click.extract", new { click_url = url, biz_scene_id = bizSceneId });
return result;
}
public TBItemInfoData TurnItemId(string itemId, string activityId, string adzoneId, string siteId,
string bizSceneId, string specialId = "", bool isCircle = false)
{
try
{
bizSceneId = TBHelper.TbAnalysis.BizSceneId(itemId);
object transportData;
if (!string.IsNullOrWhiteSpace(specialId))
transportData = new { adzone_id = adzoneId, site_id = siteId, item_id = itemId, special_id = specialId, biz_scene_id = bizSceneId };
else
transportData = new { adzone_id = adzoneId, site_id = siteId, item_id = itemId, biz_scene_id = bizSceneId };
var queryItemDataResult = GetItemInfo(itemId, bizSceneId);
if (queryItemDataResult == null)
{
throw new Exception("商品基础信息查询失败");
}
if (queryItemDataResult.n_tbk_item == null || queryItemDataResult.n_tbk_item.Count <= 0)
{
throw new Exception("商品基础信息查询失败");
}
var queryItemData = queryItemDataResult.n_tbk_item[0];
if (queryItemData == null)
{
throw new Exception("商品基础信息查询失败");
}
var jToken = SendTaobaoServerJToken("taobao.tbk.privilege.get", transportData);
if (jToken != null)
{
var item = new TBItemInfoData()
{
ItemId = queryItemData.num_iid,
//BuyPass = string.Empty,
BuyUrl = jToken["coupon_click_url"]?.Value() ?? jToken["item_url"]?.Value(),
CommissionRatio = (jToken["max_commission_rate"]?.Value() ?? 0).ExecDivision(100, 4),
//CouponUrl = jToken["coupon_click_url"]?.ToString(),
ImageUrl = queryItemData.pict_url,
ItemTitle = queryItemData.title,
ItemUrl = queryItemData.item_url,
Price = decimal.Parse(queryItemData.zk_final_price),
Sales = queryItemData.volume,
ShopId = queryItemData.seller_id.ToString(),
ShopNick = queryItemData.nick,
IsTip = true,
ActivityId = activityId
};
GetCouponInfo(jToken, item);
var tklResult = SendTaobaoServerJToken("taobao.tbk.tpwd.create", new { url = item.BuyUrl });
var regResult = HttpExtend.RegexMatchUrl(tklResult["model"]?.Value());
if (!string.IsNullOrWhiteSpace(regResult))
{
item.BuyUrl = regResult.Replace("m.tb", "s.tb");
}
item.BuyPass = tklResult["password_simple"]?.Value();
//朋友圈中间页
var zjyResult = ComposeTbClick(itemId, item.ImageUrl, item.BuyPass, item.BuyUrl, adzoneId, true, isCircleZjy: isCircle);
if (zjyResult != null)
{
item.ZJYUrl = zjyResult;
}
return item;
}
throw new Exception("商品链接失败");
}
catch (Exception ex)
{
throw new Exception($"转连商品信息异常:{ex.Message}");
}
}
///
/// 获取商品信息
///
///
///
///
public GetItemInfosData GetItemInfo(string itemId, string bizSceneId)
{
bizSceneId = TBHelper.TbAnalysis.BizSceneId(itemId);
var result = SendTaobao("taobao.tbk.item.info.get", new { num_iids = itemId, biz_scene_id = bizSceneId });
return result;
}
///
/// 获取优惠券信息
///
///
///
private void GetCouponInfo(JToken data, TBItemInfoData infoData)
{
//优惠券地址
//var couponUrl = data["item_url"]?.ToString();
var couponUrl = data["coupon_click_url"]?.Value() ?? data["item_url"]?.ToString();
if (!string.IsNullOrWhiteSpace(infoData.ActivityId))
{
if (!string.IsNullOrWhiteSpace(couponUrl))
{
couponUrl = Regex.Replace(couponUrl, @"&?activityId=(?<活动ID>[A-Za-z0-9]+)", "");
}
infoData.CouponUrl = couponUrl = $"{couponUrl}&activityId={infoData.ActivityId}";
var activityData = GetActivityInfo(infoData.ItemId, infoData.ActivityId);
if (activityData != null)
{
if (activityData.ConditionPrice <= infoData.Price)
{
infoData.CouponPrice = activityData.CouponPrice;
infoData.UseCouponPrice = infoData.Price - infoData.CouponPrice;
}
infoData.BuyUrl = couponUrl;
}
return;
}
//妈妈券
var mmCouponInfo = data["mm_coupon_info"];
//普通券
var couponInfo = data["coupon_info"];
List couponList = new List();
//普通优惠券
if (couponInfo != null)
{
var coupon = new CouponData();
var quanReg = Regex.Match(data["coupon_info"].ToString(), @"满(?<满>\d+)元减(?<减>\d+)元");
if (quanReg.Success)
{
coupon.CouponPrice = decimal.Parse(quanReg.Groups["减"].Value);
coupon.ConditionPrice = decimal.Parse(quanReg.Groups["满"].Value);
couponUrl = coupon.CouponUrl = data["coupon_click_url"].ToString();
couponList.Add(coupon);
}
}
//妈妈优惠券
if (mmCouponInfo != null)
{
var coupon = new CouponData();
var mmQuanReg = Regex.Match(data["mm_coupon_info"].ToString(), @"满(?<满>\d+)元减(?<减>\d+)元");
if (mmQuanReg.Success)
{
coupon.CouponPrice = decimal.Parse(mmQuanReg.Groups["减"].Value);
coupon.ConditionPrice = decimal.Parse(mmQuanReg.Groups["满"].Value);
couponUrl = coupon.CouponUrl = data["mm_coupon_click_url"].ToString();
couponList.Add(coupon);
}
}
//获取其他优惠券Id信息
if (string.IsNullOrWhiteSpace(infoData.ActivityId) == false)
{
var activityData = GetActivityInfo(infoData.ItemId, infoData.ActivityId);
if (activityData != null)
{
couponList.Add(activityData);
}
}
//将优惠券排序
couponList.Sort(new CouponDataComparer());
//获取一个符合的优惠券
var couponData = couponList.FirstOrDefault(f => f.ConditionPrice <= infoData.Price);
if (couponData != null)
{
if (!string.IsNullOrWhiteSpace(couponData.ActivityId))
{
couponUrl = couponData.CouponUrl = $"{couponUrl}&activityId={couponData.ActivityId}";
}
infoData.CouponPrice = couponData.CouponPrice;
infoData.UseCouponPrice = infoData.Price - infoData.CouponPrice;
}
else//没有优惠券
{
if (!string.IsNullOrWhiteSpace(infoData.ActivityId))
{
couponUrl = $"{couponUrl}&activityId={infoData.ActivityId}";
}
infoData.CouponPrice = 0m;
infoData.UseCouponPrice = infoData.Price;
infoData.BuyUrl = couponUrl;
}
infoData.CouponUrl = couponUrl;
}
///
/// 获取优惠券Id的信息
///
/// 商品Id
/// 优惠券活动Id
public CouponData GetActivityInfo(string itemId, string activityId)
{
try
{
var jToken = SendTaobaoServerJToken("taobao.tbk.coupon.get", new { activity_id = activityId, item_id = itemId });
if ((jToken["coupon_remain_count"]?.Value() ?? 0) == 0)
{
throw new Exception("优惠券已经无效");
}
var coupon = new CouponData();
coupon.ConditionPrice = jToken["coupon_start_fee"]?.Value() ?? 0;
coupon.CouponPrice = jToken["coupon_amount"]?.Value() ?? 0;
coupon.ActivityId = jToken["coupon_activity_id"]?.ToString();
return coupon;
}
catch (Exception ex)
{
}
return null;
}
///
/// 校验阿里妈妈cookiecs是否有效
///
/// cookies
///
public static Dictionary GetUnionPubContextInfo(string cookies)
{
var http = new HttpHelper();
var item = http.GetItem("https://www.alimama.com/getLogInfo.htm?callback=__jp0", cookies);
var html = http.GetHtml(item).Html;
html = html.Replace("__jp0(", "").Replace(")", "");
var result =
HttpHelper.JsonToObject>(html.Replace("__jp0", "").Replace(")", "")) as
Dictionary;
if (result != null && result.ContainsKey("result"))
{
return result["result"] as Dictionary;
}
return result;
}
///
/// 订单类型
///
public enum OrderType
{
淘客订单明细 = 1,
第三方订单明细 = 2,
维权退款明细 = 3
}
///
/// 判断是否是天猫商品
///
/// 商品id
///
public bool IsTianmao(string itemid)
{
var html = GetAlimamaHtml("https://detail.tmall.com/item.htm?id=" + itemid);
if (html.Contains("天猫Tmall.com") || html.Contains("tmallBuySupport=true")) return true;
return false;
}
///
/// 爬虫 - 从阿里妈妈官网提取订单
///
/// 爬取的订单类型
/// 写0吧
/// 写空吧
/// 最大1000
/// 不能操作90天最好少于90天
/// 第几页
///
public List> SerchOrder(OrderType type, int queryType, string payStatus, int maxSize,
DateTime day, int toPage)
{
List> rst = new List>();
//string url = "http://pub.alimama.com/report/getTbkPaymentDetails.json?startTime=" + start.ToString("yyyy-MM-dd") + "&endTime=" + end.ToString("yyyy-MM-dd") + "&payStatus="+(all?"":"3")+"&queryType=" + (all ? "1" : "3") + "&toPage=1&perPageSize=" + maxSize + "&total=&t=" + Tools.ConvertDateTimeInt(DateTime.Now).ToString() + "&_tb_token_=" + this.GetKey("tb_token") + "&_input_charset=utf-8";
//pub.alimama.com/report/getTbkThirdPaymentDetails
try
{
string url = string.Empty;
if (type == OrderType.淘客订单明细) //淘客订单明细
//url = "https://pub.alimama.com/report/getTbkPaymentDetails.json?startTime=" + day.ToString("yyyy-MM-dd") + "&endTime=" + DateTime.Now.ToString("yyyy-MM-dd") + "&payStatus=" + payStatus + "&queryType=" + queryType + "&toPage=" + toPage + "&perPageSize=" + maxSize + "&total=&_input_charset=utf-8";
url = "https://pub.alimama.com/report/getTbkPaymentDetails.json?startTime=" +
day.ToString("yyyy-MM-dd") + "&endTime=" + DateTime.Now.ToString("yyyy-MM-dd") +
"&payStatus=" + payStatus + "&queryType=" + queryType + "&toPage=" + toPage +
"&perPageSize=" + maxSize + "&total=&_input_charset=utf-8";
else if (type == OrderType.第三方订单明细) //第三方订单明细
//url = "https://pub.alimama.com/report/getTbkThirdPaymentDetails.json?startTime=" + day.ToString("yyyy-MM-dd") + "&endTime=" + DateTime.Now.ToString("yyyy-MM-dd") + "&payStatus=" + payStatus + "&queryType=" + queryType + "&toPage=" + toPage + "&perPageSize=" + maxSize + "&total=&_input_charset=utf-8";
url = "https://pub.alimama.com/report/getTbkThirdPaymentDetails.json?startTime=" +
day.ToString("yyyy-MM-dd") + "&endTime=" + DateTime.Now.ToString("yyyy-MM-dd") +
"&payStatus=" + payStatus + "&queryType=" + queryType + "&toPage=" + toPage +
"&perPageSize=" + maxSize + "&total=&_input_charset=utf-8";
else if (type == OrderType.维权退款明细)
{
//url = "https://pub.alimama.com/report/getNewTbkRefundPaymentDetails.json?startTime=" + day.ToString("yyyy-MM-dd") + "&endTime=" + DateTime.Now.ToString("yyyy-MM-dd") + "&refundType=1&searchType=1&toPage=1&perPageSize=" + maxSize + "&_input_charset=utf-8";
//url = $"https://pub.alimama.com/openapi/param2/1/gateway.unionpub/report.getTbkRefundOrderDetails.json?pageNo={toPage}&startTime={day.ToString("yyyy-MM-dd")}&endTime={DateTime.Now.ToString("yyyy-MM-dd")}&queryType=1&isFullRefund=0&memberType=1&pageSize={maxSize}";
var tbToken = GetTbToken();
if (string.IsNullOrWhiteSpace(tbToken))
{
return rst;
}
url =
$"https://pub.alimama.com/openapi/param2/1/gateway.unionpub/report.publisher.getRefundOrderDetail.json?t={HttpExtend.GetTimeStamp(DateTime.Now, true)}&{tbToken}&pageNo={toPage}&pageSize={maxSize}&startTime={day.ToString("yyyy-MM-dd")}&endTime={DateTime.Now.ToString("yyyy-MM-dd")}&payStatus=&queryType=1&jumpType=0&isFullRefund=0&memberType=&positionIndex=";
//"https://pub.alimama.com/report/getNewTbkRefundPaymentDetails.json?startTime=" + day.ToString("yyyy-MM-dd") + "&endTime=" + DateTime.Now.ToString("yyyy-MM-dd") + "&refundType=1&searchType=1&toPage=" + toPage + "&perPageSize=" + maxSize + "&_input_charset=utf-8";
}
string html = GetAlimamaHtml(url);
if (html.Contains("阿里妈妈"))
{
Member.online = false;
var session = ApiClient.GetSession();
session.SaveOrUpdate(Member);
}
Dictionary dic = HttpExtend.JsonToDictionary(html);
if (dic != null && dic.ContainsKey("data"))
{
dic = dic["data"] as Dictionary;
if (dic != null && dic.ContainsKey("result"))
{
var list = dic["result"] as ArrayList;
var _rst = new List>();
foreach (Dictionary item in list) _rst.Add(item);
_rst = _rst.OrderByDescending(a => DateTime.Parse(a["refundCreateTime"].ToString()))
.ToList(); //降序
foreach (var item in _rst)
{
var _item = rst.FirstOrDefault(f =>
f["tbTradeId"].ToString() == item["tbTradeId"].ToString() &&
f["tbTradeParentId"].ToString() == item["tbTradeParentId"].ToString());
if (_item == null)
rst.Add(item);
}
}
}
}
catch (Exception wz)
{
// client.SendLogEvent("AliSerchOrder异常:" + ex.Message);
}
return rst;
}
///
/// 爬虫 - 从阿里妈妈官网提取维权订单
///
/// 爬取的订单类型
/// 写0吧
/// 写空吧
/// 最大1000
/// 不能操作90天最好少于90天
/// 第几页
///
public void RefundOrder(DateTime startTime, Func callback)
{
var html = string.Empty;
try
{
var tbToken = GetTbToken();
if (string.IsNullOrWhiteSpace(tbToken))
{
return;
}
var pageIndex = 1;
var pageSize = 1000;
var positionIndex = string.Empty;
bool hasNext = false;
do
{
var url = $"https://pub.alimama.com/openapi/param2/1/gateway.unionpub/report.publisher.getRefundOrderDetail.json?t={HttpExtend.GetTimeStamp(DateTime.Now, true)}&_tb_token_={tbToken}&pageNo={pageIndex}&pageSize={pageSize}&startTime={startTime:yyyy-MM-dd}&endTime={DateTime.Now:yyyy-MM-dd}&payStatus=&queryType=1&jumpType={(string.IsNullOrWhiteSpace(positionIndex) ? 0 : 1)}&isFullRefund=0&memberType=&positionIndex=" + positionIndex;
html = GetAlimamaHtml(url);
if (html.Contains("阿里妈妈"))
{
Member.online = false;
var session = ApiClient.GetSession();
session.SaveOrUpdate(Member);
}
var json = JObject.Parse(html);
if (json["resultCode"]?.Value() != 200 || json["success"]?.Value() != true || json["data"] == null)
{
Sleep();
continue;
}
var data = json["data"];
if (data == null)
{
Sleep();
continue;
}
positionIndex = data["positionIndex"]?.ToString();
hasNext = data["hasNext"]?.ToObject() ?? false;
var result = data["result"];
if (result == null || !result.Any())
{
break;
}
callback(result);
if (hasNext)
{
Sleep();
pageIndex++;
}
} while (hasNext);
}
catch (Exception wz)
{
// client.SendLogEvent("AliSerchOrder异常:" + ex.Message);
}
}
private void Sleep(int seconds = 2)
{
Thread.Sleep(1000 * seconds);
}
private string create_scorder_url(Dictionary infos, string start_time, int page, int tk_status,
string order_query_type, string fields = "")
{
var parameters = new Dictionary();
parameters["fields"] = string.IsNullOrEmpty(fields)
? "tb_trade_parent_id,tb_trade_id,num_iid,item_title,item_num,price,pay_price,seller_nick,seller_shop_title,commission,commission_rate,unid,create_time,earning_time,tk3rd_pub_id,tk3rd_site_id,tk3rd_adzone_id,relation_id,tk_status,earning_time"
: fields;
parameters["method"] = "taobao.tbk.sc.order.get";
parameters["start_time"] = start_time;
parameters["span"] = "1200";
parameters["page_no"] = page.ToString();
parameters["page_size"] = "100";
parameters["tk_status"] = tk_status.ToString();
parameters["order_query_type"] = order_query_type;
parameters["app_key"] = infos["key"].ToString();
parameters["timestamp"] = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
parameters["format"] = "json";
parameters["v"] = "2.0";
parameters["sign_method"] = "md5";
//计算签名
string sign = SignTopRequest(parameters, infos["secret"].ToString(), parameters["sign_method"]);
parameters["sign"] = sign;
string query = HttpExtend.BuildQuery(parameters);
return "http://gw.api.taobao.com/router/rest?" + query;
}
///
/// 下载订单,带状态(有多页,获取所有)
///
/// 开始时间
/// 第几页
/// 页大小
/// 同步的订单状态
/// 阿里妈妈同步的订单类型
/// 场景订单场景类型,1:常规订单,2:渠道订单,3:会员运营订单,默认为1
///
internal ArrayList DownOrder(DateTime start_time, int _page_index, int page_size, AlimamaOrderStatus tk_status,
AlimamaOrderType type, int order_scene)
{
#region 2021-08-04之后 新接口 第三版(按照订单更新时间)
var interval = DownAlimamaTimer.GetIntervalCache(); //这个是三个小时的间隔 如果报错就用19分钟的间隔,默认179
ArrayList array = new ArrayList();
try
{
object obj = null;
var page_index = _page_index;
Dictionary _rst = null;
for (int i = 0; i < 2; i++)
{
try
{
obj = new
{
query_type = 4, //查询时间类型,1:按照订单淘客创建时间查询,2:按照订单淘客付款时间查询,3:按照订单淘客结算时间查询,4:按照订单更新时间;
page_size = page_size, //页大小
start_time = start_time.ToString("yyyy-MM-dd HH:mm:ss"),
end_time = start_time.AddMinutes(interval)
.ToString(
"yyyy-MM-dd HH:mm:ss"), //这里是对应前面同步间隔的19分钟 //【订单查询结束时间,订单开始时间至订单结束时间,中间时间段日常要求不超过3个小时,但如618、双11、年货节等大促期间预估时间段不可超过20分钟,超过会提示错误,调用时请务必注意时间段的选择,以保证亲能正常调用!】
page_no = page_index,
order_count_type = (int)type,
order_scene = order_scene
};
_rst = this.SendTaobao("taobao.tbk.sc.order.details.get", obj);
DownAlimamaTimer.SetIntervalCache(interval);
break;
}
catch (Exception ex)
{
//29453481(魏娜晓辉)请求阿里妈妈接口:{"error_response":{"code":15,"msg":"Remote service error","sub_code":"2007","sub_msg":"亲,订单开始时间至订单结束时间的时间段是60分钟,时间段日常要求不超过3个小时,但如618、双11、年货节等大促期间预估时间段不可超过20分钟,超过会提示错误,调用时请务必注意时间段的选择,以保证亲能正常调用!","request_id":"3ppg3w1tkhay"}} - 在 Api.Framework.Cps.AlimamaApi.SendTaobaoServer(String _api, Object _data, String _appkey, String _appsecret) 位置 D:\秒单客项目\返利机器人\fl_system\类库\Api.Framework\Cps\AlimamaApi.cs:行号 569
if (ex.Message.Contains("年货节等大促期间预估时间段不可超过"))
interval = 19;
else
throw ex;
}
}
var isWhile = false;
do
{
//Console.WriteLine($"{this.Member.usernick} - {tk_status} - {start_time} - {page_index}/{page_size}");
try
{
if (_rst != null && _rst.ContainsKey("data"))
{
var data = _rst["data"] as Dictionary;
//查看是否还有下一页
if (data.ContainsKey("has_next") && data["has_next"].ToString().ToLower() != "false")
{
isWhile = true;
#region 获取下一页数据
array.AddRange(GetResult(data));
if (data.ContainsKey("position_index"))
{
var position_index = data["position_index"].ToString();
page_index++;
if (tk_status != AlimamaOrderStatus.全部订单)
obj = new
{
query_type = 4, //查询时间类型,1:按照订单淘客创建时间查询,2:按照订单淘客付款时间查询,3:按照订单淘客结算时间查询
page_size = page_size, //页大小
tk_status = (int)tk_status,
start_time = start_time.ToString("yyyy-MM-dd HH:mm:ss"),
end_time = start_time.AddMinutes(interval)
.ToString(
"yyyy-MM-dd HH:mm:ss"), //这里是对应前面同步间隔的19分钟 //【订单查询结束时间,订单开始时间至订单结束时间,中间时间段日常要求不超过3个小时,但如618、双11、年货节等大促期间预估时间段不可超过20分钟,超过会提示错误,调用时请务必注意时间段的选择,以保证亲能正常调用!】
page_no = page_index,
position_index = position_index,
order_count_type = (int)type
};
else
obj = new
{
query_type = 4, //查询时间类型,1:按照订单淘客创建时间查询,2:按照订单淘客付款时间查询,3:按照订单淘客结算时间查询
page_size = page_size, //页大小
start_time = start_time.ToString("yyyy-MM-dd HH:mm:ss"),
end_time = start_time.AddMinutes(interval)
.ToString(
"yyyy-MM-dd HH:mm:ss"), //这里是对应前面同步间隔的19分钟 //【订单查询结束时间,订单开始时间至订单结束时间,中间时间段日常要求不超过3个小时,但如618、双11、年货节等大促期间预估时间段不可超过20分钟,超过会提示错误,调用时请务必注意时间段的选择,以保证亲能正常调用!】
page_no = page_index,
position_index = position_index,
order_count_type = (int)type
};
//continue;
}
#endregion
}
else
{
//isWhile = false;
_rst.Clear();
_rst = null;
array.AddRange(GetResult(data));
return array;
}
_rst = this.SendTaobao("taobao.tbk.sc.order.details.get", obj);
}
}
catch (Exception _ex)
{
throw _ex;
}
} while (isWhile);
}
catch (Exception ex)
{
throw ex;
}
return array;
#endregion
}
///
/// 下载订单,不带状态(有多页,获取所有)
///
/// 开始时间
/// 第几页
/// 页大小
/// 阿里妈妈同步的订单类型
/// 场景订单场景类型,1:常规订单,2:渠道订单,3:会员运营订单,默认为1
///
internal ArrayList DownOrder(DateTime start_time, int _page_index, int page_size, AlimamaOrderType type,
int order_scene)
{
#region 2021-08-04之后 新接口 第三版(按照订单更新时间)
var interval = DownAlimamaTimer.GetIntervalCache(); //这个是三个小时的间隔 如果报错就用19分钟的间隔,默认179
ArrayList array = new ArrayList();
try
{
object obj = null;
var page_index = _page_index;
Dictionary _rst = null;
for (int i = 0; i < 2; i++)
{
try
{
obj = new
{
query_type = 4, //查询时间类型,1:按照订单淘客创建时间查询,2:按照订单淘客付款时间查询,3:按照订单淘客结算时间查询,4:按照订单更新时间;
page_size = page_size, //页大小
start_time = start_time.ToString("yyyy-MM-dd HH:mm:ss"),
end_time = start_time.AddMinutes(interval)
.ToString(
"yyyy-MM-dd HH:mm:ss"), //这里是对应前面同步间隔的19分钟 //【订单查询结束时间,订单开始时间至订单结束时间,中间时间段日常要求不超过3个小时,但如618、双11、年货节等大促期间预估时间段不可超过20分钟,超过会提示错误,调用时请务必注意时间段的选择,以保证亲能正常调用!】
page_no = page_index,
order_count_type = (int)type,
order_scene = order_scene
};
_rst = this.SendTaobao("taobao.tbk.sc.order.details.get", obj);
DownAlimamaTimer.SetIntervalCache(interval);
break;
}
catch (Exception ex)
{
//1029080089(秒单客036)请求阿里妈妈接口:{"error_response":{"code":15,"msg":"Remote service error","sub_code":"2007","sub_msg":"亲,订单开始时间至订单结束时间的时间段是60分钟,时间段日常要求不超过3个小时,但如618、双11、年货节等大促期间预估时间段不可超过20分钟,超过会提示错误,调用时请务必注意时间段的选择,以保证亲能正常调用!","request_id":"5zjxw7z7laai"}} - 在 Api.Framework.Cps.AlimamaApi.SendTaobaoServer(String _api, Object _data, String _appkey, String _appsecret) 位置 D:\秒单客项目\返利机器人\fl_system\类库\Api.Framework\Cps\AlimamaApi.cs:行号 614
//29453481(魏娜晓辉)请求阿里妈妈接口:{"error_response":{"code":15,"msg":"Remote service error","sub_code":"2007","sub_msg":"亲,订单开始时间至订单结束时间的时间段是60分钟,时间段日常要求不超过3个小时,但如618、双11、年货节等大促期间预估时间段不可超过20分钟,超过会提示错误,调用时请务必注意时间段的选择,以保证亲能正常调用!","request_id":"3ppg3w1tkhay"}} - 在 Api.Framework.Cps.AlimamaApi.SendTaobaoServer(String _api, Object _data, String _appkey, String _appsecret) 位置 D:\秒单客项目\返利机器人\fl_system\类库\Api.Framework\Cps\AlimamaApi.cs:行号 569
//28592081(永远圆不了)请求阿里妈妈接口:{"error_response":{"code":15,"msg":"Remote service error","sub_code":"2007","sub_msg":"亲,订单开始时间至订单结束时间的时间段是60分钟,时间段日常要求不超过3个小时,但如618、双11、年货节等大促期间预估时间段不可超过20分钟,超过会提示错误,调用时请务必注意时间段的选择,以保证亲能正常调用!","request_id":"f87pm4x24dn2"}} - 在 Api.Framework.Cps.AlimamaApi.SendTaobaoServer(String _api, Object _data, String _appkey, String _appsecret) 位置 D:\秒单客项目\返利机器人\fl_system\类库\Api.Framework\Cps\AlimamaApi.cs:行号 614
if (ex.Message.Contains("年货节等大促期间预估时间段不可超过"))
interval = 19;
else
throw ex;
}
}
var isWhile = false;
do
{
//Console.WriteLine($".{this.Member.usernick} - {start_time} - {page_index}/{page_size}");
try
{
if (_rst != null && _rst.ContainsKey("data"))
{
var data = _rst["data"] as Dictionary;
//查看是否还有下一页
if (data.ContainsKey("has_next") && data["has_next"].ToString().ToLower() != "false")
{
isWhile = true;
#region 获取下一页数据
array.AddRange(GetResult(data));
if (data.ContainsKey("position_index"))
{
var position_index = data["position_index"].ToString();
page_index++;
obj = new
{
query_type = 4, //查询时间类型,1:按照订单淘客创建时间查询,2:按照订单淘客付款时间查询,3:按照订单淘客结算时间查询
page_size = page_size, //页大小
start_time = start_time.ToString("yyyy-MM-dd HH:mm:ss"),
end_time = start_time.AddMinutes(interval)
.ToString(
"yyyy-MM-dd HH:mm:ss"), //这里是对应前面同步间隔的19分钟 //【订单查询结束时间,订单开始时间至订单结束时间,中间时间段日常要求不超过3个小时,但如618、双11、年货节等大促期间预估时间段不可超过20分钟,超过会提示错误,调用时请务必注意时间段的选择,以保证亲能正常调用!】
page_no = page_index,
position_index = position_index,
order_count_type = (int)type
};
//continue;
}
#endregion
}
else
{
//isWhile = false;
_rst.Clear();
_rst = null;
array.AddRange(GetResult(data));
return array;
}
_rst = this.SendTaobao("taobao.tbk.sc.order.details.get", obj);
}
}
catch (Exception _ex)
{
throw _ex;
}
} while (isWhile);
}
catch (Exception ex)
{
throw ex;
}
return array;
#endregion
}
///
/// 解析请求到的订单
///
/// 获取到的订单数据
///
private ArrayList GetResult(Dictionary data)
{
if (data != null && data.ContainsKey("results"))
{
var results = data["results"] as Dictionary;
if (results != null && results.ContainsKey("publisher_order_dto"))
return results["publisher_order_dto"] as ArrayList;
}
return new ArrayList();
}
///
/// 淘宝防屏蔽地址(不带缩短)
///
/// 淘宝ID
/// 图片地址
/// 淘口令
/// 下单地址
/// 推荐商品转链pid
/// 是否有推荐商品
/// 自定义的目标地址
///
private string ComposeTbClick(string itemId, string img, string tkl, string url, string pid, bool isTuiguang,
string target = "", bool isCircleZjy = false)
{
if (!string.IsNullOrWhiteSpace(tkl))
{
var reg = Regex.Match(tkl, "[^A-Za-z0-9]?([A-Za-z0-9]{11})[^A-Za-z0-9]?");
if (reg.Success)
tkl = "¥" + reg.Groups[1].Value + "¥";
}
if (string.IsNullOrWhiteSpace(target))
target = string.IsNullOrWhiteSpace(ApiClient.Setting.SystemConfig.URLTbTkl)
? FindTransferAddress(isCircleZjy ? TargetType.朋友圈中间页 : TargetType.淘口令)
: ApiClient.Setting.SystemConfig.URLTbTkl.Trim();
target = target
.Replace("[关键词]", System.Web.HttpUtility.UrlEncode(tkl))
.Replace("[口令]", "[淘口令]")
.Replace("[淘口令]", System.Web.HttpUtility.UrlEncode(tkl))
.Replace("[宝贝ID]", itemId)
.Replace("[图片]", System.Web.HttpUtility.UrlEncode(HttpExtend.StringToBase64String(img)))
.Replace("[图片地址]", System.Web.HttpUtility.UrlEncode(img))
.Replace("[宝贝地址]", "[地址]")
.Replace("&url=[返利链接]", "")
.Replace("[地址]", System.Web.HttpUtility.UrlEncode(url))
.Replace("[pid]", pid)
.Replace("[tj]", isTuiguang.ToString());
if (target.StartsWith("https://hkl.api.52cmg.cn"))
{
var html = string.Empty;
for (int i = 0; i < 3; i++)
{
var http = new HttpHelper();
var item = http.GetItem(target);
html = http.GetHtml(item).Html;
var json = HttpExtend.JsonToDictionary(html);
if (json != null && json["ok"].ToString().ToLower() == "true")
{
return json["message"].ToString();
}
continue;
}
throw new Exception($@"gethkl:{html}
t = {target}");
}
return target;
}
///
/// 淘宝防屏蔽地址带缩短
///
/// 淘宝ID
/// 图片地址
/// 淘口令
/// 下单地址
/// 是否缩短
/// 缩短的枚举类型数值(-1为系统基础设置)
/// 自定义的目标地址
///
public string ComposeTbClick(string itemId, string img, string tkl, string url, bool isShortUrl,
int DwzType = -1, string target = "", bool isCircleZjy = false)
{
try
{
if (string.IsNullOrWhiteSpace(img))
img = "https://img.alicdn.com/tfs/TB1MaLKRXXXXXaWXFXXXXXXXXXX-480-260.png";
var compose = ComposeTbClick(itemId, img, tkl, url, "", false, target, isCircleZjy);
return GetComposeUrl(compose, isShortUrl, DwzType, target); //
}
catch (Exception ex)
{
EventClient.OnEvent(this, $@"CTC:{ex.Message} @ {ex.StackTrace}");
}
return string.Empty;
}
///
/// 淘宝防屏蔽地址(带推荐)
///
/// 淘宝ID
/// 图片地址
/// 淘口令
/// 下单地址
/// 是否缩短
/// 推广商品转链用的推广位信息
/// 是否推广
/// 缩短的枚举类型数值(-1为系统基础设置)
/// 自定义的目标地址
///
public string ComposeTbClick(string itemId, string img, string tkl, string url, bool isShortUrl, string pid,
bool isTuiGuang, int DwzType = -1, string target = "", bool isCircleZjy = false)
{
var compose = string.Empty;
if (string.IsNullOrWhiteSpace(pid))
compose = ComposeTbClick(itemId, img, tkl, url, isShortUrl, DwzType, target, isCircleZjy);
else
compose = ComposeTbClick(itemId, img, tkl, url, pid, isTuiGuang, target, isCircleZjy);
return GetComposeUrl(compose, isShortUrl, DwzType, target);
}
///
/// 获取中间页地址
///
///
///
///
///
///
private string GetComposeUrl(string compose, bool isShortUrl, int DwzType = -1, string target = "", bool isCircleZjy = false)
{
if (string.IsNullOrWhiteSpace(target))
{
//target =
if (string.IsNullOrWhiteSpace(ApiClient.Setting.SystemConfig.URLTbTkl))
{
target = FindTransferAddress(isCircleZjy ? TargetType.朋友圈中间页 : TargetType.淘口令);
}
else
{
target = ApiClient.Setting.SystemConfig.URLTbTkl.Trim();
}
}
if (target.StartsWith("https://hkl.api.52cmg.cn"))
{
return compose;
}
var dtype = Api.Framework.ApiClient.Setting.SystemConfig.dwz_type;
if (isShortUrl && DwzType != -1)
{
//Util.CheckUrlDomain(compose);
//return ApiClient.ShortURL(compose, (DwzType)DwzType).Result;
dtype = (DwzType)DwzType;
}
if (!string.IsNullOrWhiteSpace(ApiClient.Setting.SystemConfig.URLTbTkl)) Util.CheckUrlDomain(compose);
return ApiClient.ShortURL(compose, dtype).Result;
}
///
/// 拼接淘宝Cms地址.关键词:[推广位]、[关键词](注:小写的url编码)、[关键词U](注:大写的url编码)、
///
/// 推广位id
/// 搜索的关键词
/// 拼接好的url
public string ComposeTbCms(string pid, string keyword)
{
var target = string.Empty;
if (string.IsNullOrWhiteSpace(ApiClient.Setting.SystemConfig.URLTbCms))
{
target = FindTransferAddress(TargetType.产品库);
}
else
{
target = ApiClient.Setting.SystemConfig.URLTbCms.Trim();
}
var result = target
.Replace("[推广位]", pid)
.Replace("[关键词]", "[关键词L]")
.Replace("[关键词L]", System.Web.HttpUtility.UrlEncode(keyword))
.Replace("[关键词U]", HttpExtend.UrlEncode(keyword));
return result;
}
///
/// 淘宝防屏蔽地址缓存
///
/// 请求目标类型(产品库/淘口令/订单页)
/// false获取缓存,true重新获取
///
public static string FindTransferAddress2(TargetType type, bool refresh = false)
{
string key = $"key_alimamaapi_composetbclick_{(int)type}";
string target = ApiClient.Cache.Get(key);
//Console.WriteLine(type.ToString() + ",target = " + target);
if (refresh || string.IsNullOrWhiteSpace(target))
{
for (int i = 0; i < 5; i++)
{
try
{
var ali = CpsClient.Members.FirstOrDefault(f => f.cpstype == CpsType.阿里妈妈);
if (ali == null) return target;
var cps = CpsClient.CreateAlimamaRequest(ali);
if (cps == null)
{
//Console.WriteLine("cps = " + cps == null + " , " + type.ToString() + ",target = " + target);
return target;
}
target = cps.SendServer("find_wangzhi", "webTool.asmx", new { name = type.ToString() }).message.ToString();
ApiClient.Cache.Set(key, target, 10);
break;
}
catch (Exception ex)
{
Thread.Sleep(200);
}
}
}
//Console.WriteLine(type.ToString() + ",target = " + target);
return target;
}
internal AlimamaApi(fl_cps_member member) : base(member)
{
}
#region MyRegion
private static NoticeSocketClient _noticeSocket;
private static RemoteCloudConnectService _remoteCloudConnectService = new RemoteCloudConnectService();
public static void Init()
{
_remoteCloudConnectService.Initialize();
//"tksoft", "circle_goods_task"
_noticeSocket = new NoticeSocketClient();
_remoteCloudConnectService.CloudNoticeEvent += _remoteCloudConnectService_CloudNoticeEvent;
_remoteCloudConnectService.OnOpen += _remoteCloudConnectService_OnOpen;
ThreadPool.QueueUserWorkItem(o => { RefreshTkUrl(); });
}
// 连接打开
private static void _remoteCloudConnectService_OnOpen()
{
var arr = new string[] { "tksoft", "circle_goods_task", "laow" };
foreach (var item in arr)
{
_remoteCloudConnectService.SendString("subchannel\u0000" + item);
}
}
///
/// 防止重复
///
private static List repeatList = new List();
private static void _remoteCloudConnectService_CloudNoticeEvent(object sender, CloudNoticeEventArgs e)
{
if (repeatList.Contains(e.Id))//去重复
{
return;
}
repeatList.Add(e.Id);
var commonId = e.CommonId.ToLower();
try
{
LogHelper.GetSingleObj().Info("", "域名相关通知 => " + e.Body);
if (commonId == "change_tkurl")
{
var data = JObject.Parse(e.Body);
var newUrl = (data["new"] ?? string.Empty).Value();
var oldUrl = (data["old"] ?? string.Empty).Value();
if (string.IsNullOrEmpty(newUrl) || string.IsNullOrEmpty(oldUrl)) return;
//替换查询中间页
for (int i = 0; i < TkUrl.UrlQuery.Length; i++)
{
if (TkUrl.UrlQuery[i].IndexOf(oldUrl, StringComparison.Ordinal) != -1)
TkUrl.UrlQuery[i] = TkUrl.UrlQuery[i].Replace(oldUrl, newUrl);
}
//替换cms网站
for (int i = 0; i < TkUrl.UrlCms.Length; i++)
{
if (TkUrl.UrlCms[i].IndexOf(oldUrl, StringComparison.Ordinal) != -1)
TkUrl.UrlCms[i] = TkUrl.UrlCms[i].Replace(oldUrl, newUrl);
}
////替换提现页面
//for (int i = 0; i < TkUrl.UrlCash.Length; i++)
//{
// if (TkUrl.UrlCash[i].IndexOf(oldUrl, StringComparison.Ordinal) != -1)
// TkUrl.UrlCash[i] = TkUrl.UrlCash[i].Replace(oldUrl, newUrl);
//}
//替换朋友圈中间页
for (int i = 0; i < TkUrl.UrlCircle.Length; i++)
{
if (TkUrl.UrlCircle[i].IndexOf(oldUrl, StringComparison.Ordinal) != -1)
TkUrl.UrlCircle[i] = TkUrl.UrlCircle[i].Replace(oldUrl, newUrl);
}
}
else if (commonId == "refreshTkurl".ToLower())
{
RefreshTkUrl();
}
else if (commonId == "send" && e.Channel == "circle_goods_task")
{
//{"Id":"122522636742819840","TaskId":"122522636742819840","IsGoods":true}
EventClient.OnDyyNoticeEvent(null, new DyyNoticeEvent() { Data = e.Body });
}
}
catch (Exception exception)
{
EventClient.OnEvent("收到域名变化通知", $"数据:{e.Body};异常:{exception.Message}");
}
finally
{
if (repeatList.Count > 10000)
{
repeatList.RemoveRange(0, 9000);
}
}
}
///
/// 淘客的地址
///
public static TkUrlClass TkUrl { get; private set; }
///
/// 刷新淘客中间页
///
public static void RefreshTkUrl()
{
try
{
var data = _noticeSocket.GetData("tkurl");
LogHelper.GetSingleObj().Info("", "域名重新获取 => " + data);
if (string.IsNullOrWhiteSpace(data))
{
throw new Exception("请求域名为空");
}
var rst = JsonConvert.DeserializeObject(data);
if (rst != null) TkUrl = rst;
}
catch (Exception exception)
{
EventClient.OnEvent($"获取淘客域名失败", $"{exception.Message}");
}
}
///
/// 获取新的域名
///
///
///
///
public static string FindTransferAddress(TargetType targetType, bool refresh = false)
{
if (TkUrl == null)
{
RefreshTkUrl();
}
switch (targetType)
{
case TargetType.产品库:
{
var _url = GetRandomUrl(TkUrl.UrlCms);
return $"{_url}/?keyword=[关键词]&pid=[推广位]";
}
break;
case TargetType.淘口令:
{
var _url = GetRandomUrl(TkUrl.UrlQuery);
return $"{_url}/?taowords=[淘口令]&pic=[图片]&url=[地址]&pid=[pid]&tj=[tj]&item_id=[宝贝ID]";
}
break;
case TargetType.订单页:
{
//var _url = GetRandomUrl(TkUrl.UrlCms);
//return $"{_url}/aliorder.html?key=[key]";
var _url = FindTransferAddress2(targetType);
return _url;
}
break;
case TargetType.朋友圈中间页:
{
var _url = GetRandomUrl(TkUrl.UrlCircle);
return $"{_url}/?taowords=[淘口令]&pic=[图片]&url=[地址]&pid=[pid]&tj=[tj]&item_id=[宝贝ID]";
}
break;
}
return string.Empty;
}
///
/// 随机取一个
///
///
///
private static string GetRandomUrl(string[] list)
{
if (list != null && list.Length > 0)
{
var r = new Random(Guid.NewGuid().GetHashCode());
var index = r.Next(0, list.Length);
return list[index];
}
return string.Empty;
}
#endregion
///
/// 会员推广位为列表
///
/// 第几页
/// 页大小
///
internal Dictionary VipAdzoneManage(int topage, int pagesize)
{
var _tb_token_ = string.Empty;
var reg = Regex.Match(Member.cookies, "_tb_token_=([^;]+)");
if (reg.Success)
_tb_token_ = reg.Groups[1].Value;
var _url = $"https://pub.alimama.com/common/adzone/adzoneList.json?type=2&t={HttpExtend.GetTimeStamp()}&_tb_token_={_tb_token_}&pvid=";
var http = new HttpHelper();
var item = http.GetItem(_url, Member.cookies);
var html = http.GetHtml(item).Html;
if (html.Contains("没有权限"))
{
try
{
Clipboard.SetDataObject("https://survey.taobao.com/apps/zhiliao/0JpI9eizU");
}
catch (Exception ex)
{ }
throw new Exception($@"{Member.usernick},您还没有申请权限哦
申请地址已经复制,请在网页中打开");
}
//EventClient.OnEvent("", "html = " + html);
var _dic = HttpExtend.JsonToDictionary(html);
if (_dic == null) throw new Exception($"{Member.usernick},此接口需要访问阿里妈妈官网,登录已过期请重新登录阿里妈妈!");
if (_dic["ok"].ToString().ToLower() == "false") throw new Exception(html);
_dic = _dic["data"] as Dictionary;
return _dic;
}
///
/// 普通推广位列表
///
/// 第几页
/// 页大小
///
public Dictionary AdzoneManage(int topage, int pagesize)
{
var _url = $"https://pub.alimama.com/common/adzone/adzoneManage.json?tab=3&toPage={topage}&perPageSize={pagesize}&gcid=8&t={HttpExtend.GetTimeStamp()}&_input_charset=utf-8";
var http = new HttpHelper();
var item = http.GetItem(_url, Member.cookies);
var html = http.GetHtml(item).Html;
var _dic = HttpExtend.JsonToDictionary(html);
if (_dic == null) throw new Exception($"{Member.usernick},此接口需要访问阿里妈妈官网,登录已过期请重新登录阿里妈妈!");
if (_dic["ok"].ToString().ToLower() == "false") throw new Exception(html);
_dic = _dic["data"] as Dictionary;
return _dic;
}
private static DateTime NextTime = DateTime.MinValue;
///
/// 检测淘宝优惠券
///
/// 优惠券地址
///
public Coupon CheckCoupon(string coupon_click_url)
{
string html = string.Empty;
try
{
if (coupon_click_url.Contains("coupon/details") || coupon_click_url.Contains("coupon/edetail"))
{
Coupon c = new Coupon();
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)
{
EventClient.OnEvent(this, $@"检查优惠券异常:{ex.Message} @ {ex.StackTrace}
html => {html}");
}
return null;
}
private string GetTbToken()
{
var reg = Regex.Match(Member.cookies, "(?_tb_token_=[a-zA-Z0-9]+)",
RegexOptions.IgnoreCase | RegexOptions.IgnorePatternWhitespace | RegexOptions.ExplicitCapture);
if (reg.Success)
{
return reg.Groups["tbToken"].Value;
}
return string.Empty;
}
///
/// 获得HTML
///
/// 请求的地址
/// post数据
/// referer的地址
///
private string GetAlimamaHtml(string url, string postData = "", string referer = "http://pub.alimama.com/myunion.htm")
{
try
{
//Console.WriteLine(url);
Thread.Sleep(300 + random.Next(700, 3000));
HttpHelper _http = new HttpHelper();
HttpItem item = new HttpItem()
{
URL = url,
Method = string.IsNullOrEmpty(postData) ? "get" : "post",
IsToLower = false,
Cookie = Member.cookies,
Referer = referer,
Postdata = postData,
Timeout = 3000,
ReadWriteTimeout = 3000,
UserAgent = "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.154 Safari/537.36 LBBROWSER",
ContentType = "application/x-www-form-urlencoded",
Allowautoredirect = true,
ProtocolVersion = System.Net.HttpVersion.Version11
};
//item.SetProxyipCDN();
var result = _http.GetHtml(item);
//Console.WriteLine($"{result.Html} - {result.Cookie}");
if (!string.IsNullOrEmpty(result.Cookie))
{
this.Member.cookies = result.UpdateCookies(this.Member.cookies);
}
return result.Html;
}
catch (Exception)
{ }
return string.Empty;
}
///
/// 随机数对象
///
private static Random random = new Random();
///
/// 淘宝活动页参数
///
private List ActivityList = new List() { "official", "union", "local", "tbtm", "atb", "bpk" };
///
/// 更新阿里妈妈Cookies
///
internal void UpdateCookies()
{
GetAlimamaHtml("https://pub.alimama.com/portal/home/index.htm");
GetAlimamaHtml("https://pub.alimama.com/promo/search/index.htm");
for (int i = 0; i < 2; i++)
{
var index = random.Next(0, ActivityList.Count);
GetAlimamaHtml($"https://pub.alimama.com/portal/promo/activity.htm?tab={ActivityList[index]}");
}
GetAlimamaHtml("https://pub.alimama.com/portal/account/settle/income/index.htm");
GetAlimamaHtml("https://media.alimama.com/account/drawback/list.htm");
GetAlimamaHtml("https://pub.alimama.com/fourth/tool/api/index.htm");
GetAlimamaHtml("https://pub.alimama.com/portal/v2/tool/links/page/home/index.htm");
GetAlimamaHtml("https://dmp.taobao.com/");
GetAlimamaHtml("https://pub.alimama.com/");
GetAlimamaHtml("https://subway.simba.taobao.com/indexnew.jsp");
GetAlimamaHtml("https://pub.alimama.com/openapi/param2/1/gateway.unionpub/thor.campaign.report.json", $"t={HttpExtend.GetTimeStamp(DateTime.Now, true)}&campaignName=&gap=7&pageSize=20&page=1");
GetAlimamaHtml("https://pub.alimama.com/openapi/param2/1/gateway.unionpub/thor.ad.unit.report.json", $"t={HttpExtend.GetTimeStamp(DateTime.Now, true)}&itemId=&pid=&gap=1&pageSize=20&page=1&campaignId=");
GetAlimamaHtml("https://pub.alimama.com/openapi/json2/1/gateway.unionpub/xt.entry.json", $"t={HttpExtend.GetTimeStamp(DateTime.Now, true)}&_tb_token_=eb53bb61783d6&_data_=%7B%22floorId%22%3A36306%2C%22variableMap%22%3A%7B%22status%22%3A%22check%22%2C%22orderType%22%3A%22%22%7D%2C%22pageNum%22%3A%221%22%2C%22pageSize%22%3A%2220%22%7D");
GetAlimamaHtml($"https://pub.alimama.com/openapi/param2/1/gateway.unionpub/asset.entry.json?t={HttpExtend.GetTimeStamp(DateTime.Now, true)}&bizType=asset.asset-accountQuery&bizParam=");
GetAlimamaHtml($"https://pub.alimama.com/common/site/getAuthorities.json?t={HttpExtend.GetTimeStamp(DateTime.Now, true)}&siteId=111111");
GetAlimamaHtml($"https://mo.m.taobao.com/union/mm/pub-common/frontversion");
GetAlimamaHtml($"https://aff-open.taobao.com/apply.htm");
GetAlimamaHtml("http://www.alimama.com/index.htm");
GetAlimamaHtml("https://ssp.tanx.com/api/userinfo?callback=userInfoCallback");
GetAlimamaHtml("http://ssp.tanx.com/api/userinfo?callback=userInfoCallback");
GetAlimamaHtml("https://media.alimama.com/user/base_info.htm");
GetAlimamaHtml("https://media.alimama.com/verify/risk.htm");
GetAlimamaHtml("https://media.alimama.com/");
GetAlimamaHtml("https://media.alimama.com/product.htm");
GetAlimamaHtml("https://pub.alimama.com/myunion.htm");
GetAlimamaHtml("https://tbk.bbs.taobao.com/list.html");
GetAlimamaHtml("https://pub.alimama.com/manage/overview/index.htm");
GetAlimamaHtml("https://pub.alimama.com/common/getUnionPubContextInfo.json");
var page = random.Next(1, 5);
var size = page * 10;
GetAlimamaHtml($"https://media.alimama.com/violationu2/violation2_page.json?r=mx_387&toPage={page}&pageSize=40");
if (page % 2 != 0)
{
GetAlimamaHtml($"https://pub.alimama.com/third/manage/record/adzone.htmhttps://pub.alimama.com/third/manage/record/site.htm?tab=self_web_site");//媒体备案管理 - 自有平台(网站)
if (page == 3)
GetAlimamaHtml($"https://pub.ama.com/third/manage/record/site.htm?tab=self_web_site&sencecode=self_app&pageNo=1&pageSize=50");//媒体备案管理 - 自有平台(App客户端)
GetAlimamaHtml($"https://pub.alimama.com/third/manage/record/site.htm?tab=self_web_site&sencecode=self_pc_client&pageNo=1&pageSize=50");//媒体备案管理 - 自有平台(PC客户端)
GetAlimamaHtml($"https://pub.alimama.com/third/manage/record/site.htm?tab=self_web_site&sencecode=self_offline&pageNo=1&pageSize=50");//媒体备案管理 - 自有平台(线下阵地)
}
else
{
GetAlimamaHtml($"https://pub.alimama.com/third/manage/record/adzone.htm");//推广位
GetAlimamaHtml($"https://pub.alimama.com/third/manage/record/site.htm?tab=all");//媒体备案管理 - 全部
if (page == 2)
{
GetAlimamaHtml($"https://pub.alimama.com/third/manage/record/site.htm?tab=self_web_site&sencecode=self_miniprogram&pageNo=1&pageSize=50");//媒体备案管理 - 自有平台(小程序/快应用)
GetAlimamaHtml($"https://pub.alimama.com/third/manage/record/site.htm?tab=self_web_site&sencecode=self_operating_system&pageNo=1&pageSize=50");//媒体备案管理 - 自有平台(操作系统)
}
GetAlimamaHtml($"https://pub.alimama.com/third/manage/record/site.htm?tab=self_web_site&sencecode=self_hardware_device&pageNo=1&pageSize=50");//媒体备案管理 - 自有平台(硬件设备)
}
GetAlimamaHtml($"https://pub.alimimama.com/third/manage/record/site.htm?tab=other_social");//媒体备案管理 - 他方平台(社交平台)
GetAlimamaHtml($"https://pub.alimama.com/third/manage/record/site.htm?tab=other_social&sencecode=other_content&pageNo=1&pageSize=50");//媒体备案管理 - 他方平台(内容平台)
GetAlimamaHtml($"https://pub.alimama.com/third/manage/record/site.htm?tab=traffic_purchasing");//媒体备案管理 - 无自有阵地
GetAlimamaHtml("http://c.tanx.com/");
for (int i = 0; i < 2; i++)
{
GetAlimamaHtml($"https://pub.alimama.com/openapi/json2/1/gateway.unionpub/xt.entry.json", $"t={HttpExtend.GetTimeStamp()}000&_tb_token_=33183160110853659822%3A34758%2C%22variableMap%22%3A%7B%22itemId%22%3A%22{(Util.GetRandomString(12))}%22%7D%7D");//内容库查询
}
GetAlimamaHtml($"https://pub.alimama.com/manage/user/new_privilege.htm");
for (int i = 0; i < 3; i++)
{
var punishStatus = random.Next(1, 9);
page = random.Next(1, 5);
size = page * 10;
GetAlimamaHtml($"https://media.alimama.com/violationu2/violation2_page.json?toPage={page}&pageSize={size}&punishStatus={punishStatus}");
}
GetAlimamaHtml($"https://pub.alimama.com/manage/overview/index.htm");
for (int i = 0; i < 3; i++)
{
var type = random.Next(1, 4);
var day = random.Next(1, 16);
var date1 = DateTime.Now.Date.AddDays(-day).ToString("yyyy-MM-dd");
var date2 = DateTime.Now.Date.ToString("yyyy-MM-dd");
GetAlimamaHtml($"https://pub.alimama.com/openapi/param2/1/gateway.unionpub/report.getTbkOrderDetails.json?t={HttpExtend.GetTimeStamp()}000&_tb_token_=33183d55eb1e6&jumpType=0&positionIndex=&pageNo=1&startTime={date1}&endTime={date2}&queryType={type}&tkStatus=&memberType=&pageSize=40");
}
for (int i = 0; i < 5; i++)
{
GetAlimamaHtml($"https://pub.alimama.com/openapi/param2/1/gateway.unionpub/mkt.campaign.signUp.list.json?t={HttpExtend.GetTimeStamp(DateTime.Now, true)}&pageNo=1&pageSize=20&keyword=&showStatus={(i + 1)}&productType=19&phaseType=3&searchType=1");
}
CheckLoginAlimama();
GetAlimamaHtml("https://pub.alimama.com/common/getUnionPubContextInfo.json");
GetAlimamaHtml($"https://media.alimama.com/violationu2/warning_instance_page.json?r=mx_544&toPage={page}&pageSize={size}");
GetAlimamaHtml($"https://everyservice.cdn.taobao.com/widget/queryServiceStrategy");
GetAlimamaHtml($"https://everyhelp.taobao.com/version/getWidgetVersion");
GetAlimamaHtml($"https://media.alimama.com/violation/violation_list.htm");
CheckLoginAlimama();
GetAlimamaHtml("https://c.tanx.com/");
}
///
/// 检测登录阿里妈妈
///
///
internal bool CheckLoginAlimama()
{
try
{
var dic = GetUnionPubContextInfo(this.Member.cookies);
if (dic != null)
{
if (dic.ContainsKey("memberID"))
return true;
else return false;
}
else return true;
}
catch (Exception ex)
{
return false;
}
}
///
/// 阿里妈妈同步的订单类型
///
internal enum AlimamaOrderType : int
{
淘客明细订单 = 1,
第三方订单明细 = 2
}
///
/// 阿里妈妈订单状态
///
public enum AlimamaOrderStatus : int
{
全部订单 = 1,
订单结算 = 3,
订单付款 = 12,
订单失效 = 13,
订单成功 = 14,
订单维权中 = 15,
}
//public enum AlimamaOrderSort : int
//{
// 创建时间 = 1,
// 结算时间 = 2
//}
///
/// 请求目标类型 产品库/淘口令/订单页
///
public enum TargetType : int
{
淘口令 = 1,
产品库 = 2,
订单页 = 3,
朋友圈中间页 = 4
}
}
}