435 lines
19 KiB
C#
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;
|
|
}
|
|
}
|
|
}
|