Files
KJD/TEMUKJD/BLL/VDian/VDianProductBLL.cs
T

435 lines
19 KiB
C#

using AllBase;
using AllBase.Model.Param.VDianManage;
using AllBase.Model.Result;
using NaiBa.Util.Extension;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace TemuKJD.BLL.VDian
{
public class WeiDianProductBLL
{
public static int upLoadThreadCount = 0;
/// <summary>
/// 上传产品后设置产品佣金
/// </summary>
/// <param name="prodIds"></param>
/// <param name="vDianShop"></param>
/// <param name="commissionRate">佣金比例</param>
/// <returns></returns>
public string UpdateCommission(string prodIds, VDianShopLoginInfo vDianShop, string commissionRate = "5")
{
//{"itemIds":"3318304304","isDownPrice":false,"isUpPrice":false,"priceUpLimit":200,"commissionRate":"{\"L1\":\"5\",\"L2\":\"5\",\"L3\":\"5\",\"L4\":\"5\",\"L5\":\"5\"}","specifyRetailSellerIds":"","specifyCommissionRate":"5"}
VDianParam.VDianCommission comm = new VDianParam.VDianCommission()
{
itemIds = prodIds,
isDownPrice = false,
isUpPrice = false,
priceUpLimit = 200,
commissionRate = new VDianParam.VDianCommissionRate() { L1 = commissionRate, L2 = commissionRate, L3 = commissionRate, L4 = commissionRate, L5 = commissionRate },
specifyRetailSellerIds = "",
specifyCommissionRate = commissionRate,
};
return Request_weidian_Commission(vDianShop, HttpUtility.UrlEncode(JsonHelper.SerializeObject(comm), Encoding.UTF8));
}
public string UpdateCps(string prodIds, VDianShopLoginInfo vDianShop, string commissionRate = "5")
{
var idArr = prodIds.Split(',');
var rate = (commissionRate.ParseToDecimal() / 100).ToString();
string url = "https://thor.weidian.com/cpnserver/cps.operateConfig/1.0?param=";
var dataStr = "{\"item\":{\"cpsItemConfigReqList\":[";
foreach (string id in idArr)
{
dataStr += "{\"itemId\":\"" + id + "\",\"itemRatioStr\":" + rate + "},";
}
dataStr = dataStr.TrimEnd(',');
dataStr += "]}}";
return Request_weidian_cps(vDianShop, url, HttpUtility.UrlEncode(dataStr, Encoding.UTF8));
}
/// <summary>
/// 设置店铺分成推广全店佣金比例
/// </summary>
/// <param name="vDianShop"></param>
/// <param name="commissionRate"></param>
/// <returns></returns>
public string UpdateShopCps(VDianShopLoginInfo vDianShop, string commissionRate = "5")
{
//{"shop":{"pushMode":0,"cpsRatioStr":0.11},"item":{"pushMode":0,"cpsItemConfigReqList":[]}}
var rate = (commissionRate.ParseToDecimal() / 100).ToString();
string url = "https://thor.weidian.com/cpnserver/cps.operateConfig/1.0?param=";
var dataStr = "{\"shop\":{\"pushMode\":0,\"cpsRatioStr\":" + rate + "},\"item\":{\"pushMode\":0,\"cpsItemConfigReqList\":[]}}";
return Request_weidian_cps(vDianShop, url, HttpUtility.UrlEncode(dataStr, Encoding.UTF8));
}
/// <summary>
/// 查询店铺分成推广全店佣金比例
/// </summary>
/// <param name="vDianShop"></param>
/// <returns></returns>
public string GetShopCps(VDianShopLoginInfo vDianShop)
{
string url = "https://thor.weidian.com/cpnserver/cps.queryItemConfig/1.0?param=";
var dataStr = "{\"needQueryRange\":\"true\",\"pageIndex\":1,\"pageSize\":1}";
return Request_weidian_cps(vDianShop, url, HttpUtility.UrlEncode(dataStr, Encoding.UTF8));
}
/// <summary>
/// 查询分成推广首推商品列表
/// </summary>
/// <param name="vDianShop"></param>
/// <param name="page"></param>
/// <param name="pageSize"></param>
/// <returns></returns>
public string GetShopCpsProduct(VDianShopLoginInfo vDianShop, int page = 1, int pageSize = 10)
{
string url = "https://thor.weidian.com/cpnserver/cps.queryItemConfig/1.0?param=";
var dataStr = "{\"needQueryRange\":\"true\",\"pageIndex\":" + page + ",\"pageSize\":" + pageSize + "}";
return Request_weidian_cps(vDianShop, url, HttpUtility.UrlEncode(dataStr, Encoding.UTF8));
}
public string GetShopProductIds(VDianShopLoginInfo vDianShop, int page = 1, int pageSize = 40, bool? isOnSale = true, DateTime? timeEnd = null)
{
// 获取商品列表优先使用开箱小店接口
var vDianApiToken = GetVDianApiTokenCanUse(vDianShop);
if (vDianApiToken == null)
vDianApiToken = vDianShop.LstWdApiToken[0];
if (vDianApiToken == null)
{
return "error,商品获取频次超过上限";
}
if (isOnSale == true)
{
var result = GetVDianProductListOnSale(vDianApiToken.ApiAccessToken, page, pageSize, timeEnd);
return result;
}
else if (isOnSale == false)
{
var result = GetVDianProductListOffSale(vDianApiToken.ApiAccessToken, page, pageSize, timeEnd);
return result;
}
else
{
var result = GetVDianProductListAll(vDianApiToken.ApiAccessToken, page, pageSize, timeEnd);
return result;
}
}
/// <summary>
/// 网页模拟接口调用设置佣金
/// </summary>
/// <param name="vDianShop"></param>
/// <param name="data"></param>
/// <returns></returns>
private string Request_weidian_Commission(VDianShopLoginInfo vDianShop, string data)
{
HttpWebResponse response = null;
string responseText = "";
try
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://thor.weidian.com/fenxiao/supplyItem.updateItemSetting/1.0?wdtoken="
+ vDianShop.Wdtoken + "&_=" + BaseClass.DateTimeToTimestampSeconds(DateTime.Now));
request.KeepAlive = true;
request.Accept = "application/json, */*";
request.UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36";
request.ContentType = "application/x-www-form-urlencoded; charset=UTF-8";
request.Headers.Add("Origin", @"https://d.weidian.com");
request.Headers.Add("Sec-Fetch-Site", @"same-site");
request.Headers.Add("Sec-Fetch-Mode", @"cors");
request.Referer = "https://d.weidian.com/weidian-pc/pc-vue-item/index.html?spider_token=76b8";
request.Headers.Set(HttpRequestHeader.AcceptEncoding, "gzip, deflate, br");
request.Headers.Set(HttpRequestHeader.AcceptLanguage, "zh-CN,zh;q=0.9");
request.Headers.Set(HttpRequestHeader.Cookie, vDianShop.Cookies);
request.Method = "POST";
request.ServicePoint.Expect100Continue = false;
string body = @"param=" + data;
byte[] postBytes = System.Text.Encoding.UTF8.GetBytes(body);
request.ContentLength = postBytes.Length;
Stream stream = request.GetRequestStream();
stream.Write(postBytes, 0, postBytes.Length);
stream.Close();
response = (HttpWebResponse)request.GetResponse();
}
catch (WebException e)
{
if (e.Status == WebExceptionStatus.ProtocolError) response = (HttpWebResponse)e.Response;
else responseText = "error," + e.Message;
}
catch (Exception ex)
{
responseText = "error," + ex.Message;
}
if (response != null)
{
if (string.IsNullOrEmpty(responseText))
responseText = GetHtml.ReadResponse(response);
response.Close();
}
Thread.Sleep(25 + Randomx.GetId(50));
return responseText;
}
/// <summary>
/// 全民推广设置
/// </summary>
/// <param name="vDianShop"></param>
/// <param name="data"></param>
/// <returns></returns>
private string Request_weidian_cps(VDianShopLoginInfo vDianShop, string url, string data)
{
HttpWebResponse response = null;
string responseText = "";
try
{
//https://thor.weidian.com/cpnserver/cps.operateConfig/1.0?param={"item":{"cpsItemConfigReqList":[{"itemId":"3242678219","itemRatioStr":0.22}]}}
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url + data);
request.KeepAlive = true;
request.Headers.Set(HttpRequestHeader.Pragma, "no-cache");
request.Headers.Set(HttpRequestHeader.CacheControl, "no-cache");
request.Accept = "application/json, text/plain, */*";
request.Headers.Add("Origin", @"https://weidian.com");
request.UserAgent = "Mozilla/5.0 (Linux; Android 9; COR-AL00 Build/HUAWEICOR-AL00; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/74.0.3729.136 Mobile Safari/537.36 WDAPP(WD/9.0.80) appid/com.koudai.weishop KDJSBridge2/1.1.0 platform/android apiv/9083 NetType/WIFI";
request.Referer = "https://weidian.com/new-cps/";
request.Headers.Set(HttpRequestHeader.AcceptEncoding, "gzip, deflate");
request.Headers.Set(HttpRequestHeader.AcceptLanguage, "zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7");
request.Headers.Set(HttpRequestHeader.Cookie, vDianShop.Cookies);
request.Headers.Add("X-Requested-With", @"com.koudai.weishop");
response = (HttpWebResponse)request.GetResponse();
}
catch (WebException e)
{
if (e.Status == WebExceptionStatus.ProtocolError) response = (HttpWebResponse)e.Response;
else responseText = "error," + e.Message;
}
catch (Exception ex)
{
responseText = "error," + ex.Message;
}
if (response != null)
{
if (string.IsNullOrEmpty(responseText))
responseText = GetHtml.ReadResponse(response);
response.Close();
}
Thread.Sleep(25 + Randomx.GetId(50));
return responseText;
}
/// <summary>
/// 微店读取店铺所有上架商品
/// </summary>
/// <param name="accessToken"></param>
/// <param name="pageNumber"></param>
/// <param name="pageSize"></param>
/// <returns></returns>
public static string GetVDianProductListOnSale(string accessToken, int pageNumber = 1, int pageSize = 40, DateTime? timeEnd = null)
{
return GetVDianProductList(accessToken, pageNumber, pageSize, 1, timeEnd);
}
/// <summary>
/// 微店读取店铺所有下架商品
/// </summary>
/// <param name="accessToken"></param>
/// <param name="pageNumber"></param>
/// <param name="pageSize"></param>
/// <returns></returns>
public static string GetVDianProductListOffSale(string accessToken, int pageNumber = 1, int pageSize = 40, DateTime? timeEnd = null)
{
return GetVDianProductList(accessToken, pageNumber, pageSize, 2, timeEnd);
}
/// <summary>
/// 读取所有上架和下架商品
/// </summary>
/// <param name="accessToken"></param>
/// <param name="pageNumber"></param>
/// <param name="pageSize"></param>
/// <param name="timeEnd"></param>
/// <returns></returns>
public static string GetVDianProductListAll(string accessToken, int pageNumber = 1, int pageSize = 40, DateTime? timeEnd = null)
{
return GetVDianProductList(accessToken, pageNumber, pageSize, 4, timeEnd);
}
/// <summary>
/// 读取微店所有商品
/// </summary>
/// <param name="accessToken"></param>
/// <param name="pageNumber"></param>
/// <param name="pageSize"></param>
/// <param name="status">1表示上架,2表示下架,4表示上架和下架一起</param>
/// <returns></returns>
public static string GetVDianProductList(string accessToken, int pageNumber = 1, int pageSize = 40, int status = 1, DateTime? timeEnd = null)
{
if (timeEnd == null)
timeEnd = DateTime.Now;
string url = BaseClass.VDianApi + "api?";
string data = "param=" + GetHtml.UrlEncodeUtf8("{\"page_size\":\"" + pageSize + "\",\"status\":" + status + ",\"orderby\":\"1\",\"page_num\":\"" + pageNumber
+ "\",\"update_start\":\"2000-1-1 00:00:00\",\"update_end\":\"" + timeEnd.Value.ToString("yyyy-MM-dd HH:mm:ss") + "\"}");
string _public = "&public=" + GetHtml.UrlEncodeUtf8("{\"method\":\"vdian.item.list.get\",\"access_token\":\"" + accessToken
+ "\",\"version\":\"1.1\",\"format\":\"json\"}");
var result = Request_api_vdian_com(url, data + _public, true);
return result;
}
/// <summary>
/// 商品上下架
/// </summary>
/// <param name="itemId"></param>
/// <param name="accessToken"></param>
/// <param name="opt">1表示商品上架,2表示商品下架</param>
/// <returns></returns>
public static string VDianOnSale(string itemId, VDianShopLoginInfo vDianShop, int opt = 1)
{
// 获取商品列表优先使用开箱小店接口
var vDianApiToken = GetVDianApiTokenCanUse(vDianShop);
if (vDianApiToken == null)
vDianApiToken = vDianShop.LstWdApiToken[0];
if (vDianApiToken == null)
{
return "error,商品获取频次超过上限";
}
string url = BaseClass.VDianApi + "api?";
string data = "param=" + GetHtml.UrlEncodeUtf8("{\"itemid\":\"" + itemId + "\",\"opt\":\"" + opt + "\"}");
string _public = "&public=" + GetHtml.UrlEncodeUtf8("{\"method\":\"weidian.item.onSale\",\"access_token\":\"" + vDianApiToken.ApiAccessToken
+ "\",\"version\":\"1.0\",\"format\":\"json\"}");
var result = Request_api_vdian_com(url, data + _public, true);
return result;
}
public static string VDianProductDel(string itemId, VDianShopLoginInfo vDianShop)
{
// 获取商品列表优先使用开箱小店接口
var vDianApiToken = GetVDianApiTokenCanUse(vDianShop);
if (vDianApiToken == null)
vDianApiToken = vDianShop.LstWdApiToken[0];
if (vDianApiToken == null)
{
return "error,商品获取频次超过上限";
}
string url = BaseClass.VDianApi + "api?";
string data = "param=" + GetHtml.UrlEncodeUtf8("{\"itemid\":\"" + itemId + "\"}");
string _public = "&public=" + GetHtml.UrlEncodeUtf8("{\"method\":\"vdian.item.delete\",\"access_token\":\"" + vDianApiToken.ApiAccessToken
+ "\",\"version\":\"1.0\",\"format\":\"json\"}");
var result = Request_api_vdian_com(url, data + _public, true);
return result;
}
public static string VDianProductDel(List<string> itemIds, VDianShopLoginInfo vDianShop)
{
// 获取商品列表优先使用开箱小店接口
var vDianApiToken = GetVDianApiTokenCanUse(vDianShop);
if (vDianApiToken == null)
{
return "error,商品获取频次超过上限";
}
string itemIdStr = "";
foreach (var item in itemIds)
{
itemIdStr += item + ",";
}
string url = BaseClass.VDianApi + "api?";
string data = "param=" + GetHtml.UrlEncodeUtf8("{\"itemids\":\"" + itemIdStr.TrimEnd(',') + "\"}");
string _public = "&public=" + GetHtml.UrlEncodeUtf8("{\"method\":\"vdian.item.batchDelete\",\"access_token\":\"" + vDianApiToken.ApiAccessToken
+ "\",\"version\":\"1.0\",\"format\":\"json\"}");
var result = Request_api_vdian_com(url, data + _public, true);
return result;
}
/// <summary>
/// 获取可用的微店ApiToken
/// </summary>
/// <param name="vDianShop"></param>
/// <returns></returns>
public static VDianApiToken GetVDianApiTokenCanUse(VDianShopLoginInfo vDianShop)
{
// 获取商品列表优先使用开箱小店接口
var vDianApiToken = vDianShop.LstWdApiToken.FirstOrDefault(t => t.AppKey.AppKey == "691402" && t.AppKey.Status == "ok");
if (vDianApiToken == null)
vDianApiToken = vDianShop.LstWdApiToken.FirstOrDefault(t => t.AppKey.Status == "ok");
return vDianApiToken;
}
/// <summary>
/// 调用微店Api
/// </summary>
/// <param name="response"></param>
/// <returns></returns>
public static string Request_api_vdian_com(string url, string bodyData, bool isPost = true)
{
while (upLoadThreadCount >= 3)
Thread.Sleep(Randomx.GetId(100));
upLoadThreadCount++;
HttpWebResponse response = null;
var responseText = "";
try
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.ContentType = "application/x-www-form-urlencoded;charset=utf-8";
if (isPost)
request.Method = "POST";
else
request.Method = "GET";
request.ServicePoint.Expect100Continue = false;
byte[] postBytes = Encoding.UTF8.GetBytes(bodyData);
request.ContentLength = postBytes.Length;
Stream stream = request.GetRequestStream();
stream.Write(postBytes, 0, postBytes.Length);
stream.Close();
response = (HttpWebResponse)request.GetResponse();
}
catch (WebException e)
{
if (e.Status == WebExceptionStatus.ProtocolError) response = (HttpWebResponse)e.Response;
else responseText = "error," + e.Message;
}
catch (Exception ex)
{
responseText = "error," + ex.Message;
}
if (response != null)
{
if (string.IsNullOrEmpty(responseText))
responseText = GetHtml.ReadResponse(response);
response.Close();
}
Thread.Sleep(50 + Randomx.GetId(100));
upLoadThreadCount--;
return responseText;
}
}
}