901 lines
38 KiB
C#
901 lines
38 KiB
C#
using AllBase;
|
|
using AllBase.Model.Result;
|
|
using AllBase.Model.Result.PDDResult;
|
|
using CefSharp;
|
|
using CefSharp.WinForms;
|
|
using NaiBa.CefHelper;
|
|
using NaiBa.CefHelper.Handler;
|
|
using NaiBa.Util;
|
|
using NaiBa.Util.Extension;
|
|
using Newtonsoft.Json.Linq;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.ComponentModel;
|
|
using System.Data;
|
|
using System.Drawing;
|
|
using System.Globalization;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Threading;
|
|
using System.Threading.Tasks;
|
|
using System.Windows.Forms;
|
|
using TemuKJD.BaseForms;
|
|
using TemuKJD.BLL;
|
|
using TemuKJD.Extension;
|
|
using TemuKJD.Helper;
|
|
using TemuKJD.PDDForms.ProductSelectForms;
|
|
using TemuKJD.WXForms.ProductForms;
|
|
using Work;
|
|
|
|
namespace TemuKJD.ToolForms
|
|
{
|
|
public partial class WXSaleAssistantForm : BaseGeneralForm
|
|
{
|
|
public string OpenType { get; set; } = "collect";
|
|
public string InitUrl { get; set; } = "https://store.weixin.qq.com/talent/pool/home"; // https://store.weixin.qq.com/talent/home
|
|
public bool isGetingProdWithCef = false;
|
|
public CancellationTokenSource cancellationTokenSource { get; set; } = null;
|
|
ConcurrentList<WXSaleAssistantSpuItemInfo> lstWxSaleAssistantSpuItemInfo = new ConcurrentList<WXSaleAssistantSpuItemInfo>();
|
|
public ChromiumWebBrowser cefWebBrowser = null;
|
|
private string currentUrl = "";
|
|
int pageStart = 1;
|
|
int pageEnd = 9999;
|
|
decimal getDetailWaitSeconds = 1;
|
|
int filterMonthSaleCount = 100;
|
|
int filterTotalSaleCount = 500;
|
|
int searchPageCount = 0;
|
|
int noNextPageRetryTimes = 50;
|
|
|
|
public WXSaleAssistantForm()
|
|
{
|
|
InitializeComponent();
|
|
}
|
|
|
|
private void WXSaleAssistantForm_Load(object sender, EventArgs e)
|
|
{
|
|
//this.ucTabControlMetro1.TabPages.Remove(tabPage3);
|
|
|
|
if (OpenType == "login")
|
|
{
|
|
this.ucTabControlMetro1.TabPages.Remove(tabPage2);
|
|
this.Height = 900;
|
|
this.Width = 1360;
|
|
this.splitContainer1.SplitterDistance = splitContainer1.Height - 10;
|
|
this.CenterToScreen();
|
|
}
|
|
|
|
//this.splitContainer1.SplitterDistance = 472;
|
|
this.dgvProduct.AddSelectorColumn("colCheck");
|
|
this.dgvProduct.AddImgColumn("colImg", "colImgUrl");
|
|
|
|
lstWxSaleAssistantSpuItemInfo = NaiBa.Util.Helper.ConfigHelper.LoadConfig<ConcurrentList<WXSaleAssistantSpuItemInfo>>("wx_sale_assistant_list_" + MainForm.ProcessCount);
|
|
if (lstWxSaleAssistantSpuItemInfo == null)
|
|
lstWxSaleAssistantSpuItemInfo = new ConcurrentList<WXSaleAssistantSpuItemInfo>();
|
|
|
|
if (OpenType == "collect")
|
|
{
|
|
|
|
pbLoading.Visible = true;
|
|
Task.Run(() =>
|
|
{
|
|
int id = 0;
|
|
foreach (var prod in lstWxSaleAssistantSpuItemInfo)
|
|
{
|
|
id++;
|
|
if (id % 50 == 0)
|
|
Thread.Sleep(1);
|
|
Invoke(new Action(() =>
|
|
{
|
|
var rowId = this.dgvProduct.Rows.Add(
|
|
true,
|
|
prod.shop.appId,
|
|
prod.shop.name,
|
|
prod.spu.id,
|
|
prod.spu.headImage, //.Replace("https://", "http://"),
|
|
DataGridViewExtension.defaultBitmap,
|
|
prod.spu.name,
|
|
prod.spu.sales.monthlySales,
|
|
prod.spu.sales.cumulativeSales,
|
|
"", // 没有类目信息,不填
|
|
prod.spu.price.sellingPrice * 0.01m,
|
|
"删除",
|
|
prod.operateMsg
|
|
);
|
|
dgvProduct.Rows[rowId].Height = 60;
|
|
}));
|
|
}
|
|
Invoke(new Action(() =>
|
|
{
|
|
pbLoading.Visible = false;
|
|
}));
|
|
});
|
|
}
|
|
|
|
InitCef();
|
|
}
|
|
|
|
void InitCef()
|
|
{
|
|
if (cefWebBrowser == null)
|
|
{
|
|
cefWebBrowser = CEFBrowser.CreateChromiumWebBrowser(InitUrl, false);
|
|
|
|
CustomResourceRequestHandlerLocal resourceRequestHandler = new CustomResourceRequestHandlerLocal();
|
|
resourceRequestHandler.ResourceLoadCompleteEvent += RequestHandler_ResourceLoadComplete;
|
|
resourceRequestHandler.BeforeResourceLoadEvent += RequestHandler_BeforeResourceLoad;
|
|
cefWebBrowser.RequestHandler = new CustomRequestHandler(resourceRequestHandler);
|
|
var lifeSapnHandler = new LifeSpanHandlerLocal(PopWindowType.SelfWindow);
|
|
cefWebBrowser.LifeSpanHandler = lifeSapnHandler;
|
|
cefWebBrowser.KeyboardHandler = new KeyboardHandler();
|
|
cefWebBrowser.FrameLoadEnd += CefWebBrowser_FrameLoadEnd;
|
|
cefWebBrowser.AddressChanged += CefWebBrowser_AddressChanged;
|
|
cefWebBrowser.LoadError += CefWebBrowser_LoadError;
|
|
cefWebBrowser.Dock = DockStyle.Fill;
|
|
|
|
Invoke(new Action(() =>
|
|
{
|
|
splitContainer2.Panel2.Controls.Add(cefWebBrowser);
|
|
//cefWebBrowser.Load(shopMainUrl);
|
|
}));
|
|
}
|
|
|
|
Task.Run(() =>
|
|
{
|
|
List<Cookie> cookieLst = new List<Cookie>();
|
|
|
|
if (OpenType == "collect")
|
|
{
|
|
string serverCookie = "";
|
|
var url = BaseClass.BuildWXObjString("user/get_wx_sale_assistant_cookie");
|
|
var data = UserLogin.GetSignaturex();
|
|
var result = GetHtml.PostUtf8(url, data);
|
|
if (!result.Contains("\"code\":200"))
|
|
result = GetHtml.PostUtf8(url, data);
|
|
try
|
|
{
|
|
serverCookie = JsonHelper.SerializeObject(JsonHelper.JObjectParse(result)["cookie"]);
|
|
cookieLst = JsonHelper.DeserializeJsonToList<CefSharp.Cookie>(serverCookie);
|
|
if (cookieLst == null)
|
|
cookieLst = new List<Cookie>();
|
|
}
|
|
catch
|
|
{
|
|
}
|
|
}
|
|
if (OpenType == "login")
|
|
{
|
|
cookieLst = NaiBa.Util.Helper.ConfigHelper.LoadConfig<List<Cookie>>("wx_sale_assistant_cookies");
|
|
if (cookieLst == null)
|
|
cookieLst = new List<Cookie>();
|
|
}
|
|
|
|
|
|
// cef138必须init后方可设置或删除cookie
|
|
while (!cefWebBrowser.IsBrowserInitialized || !cefWebBrowser.GetBrowser().MainFrame.IsValid)
|
|
Thread.Sleep(20);
|
|
CEFBrowser.DeleteCookie(cefWebBrowser.GetCookieManager(null));
|
|
|
|
//cef 138 如果没有设置RequestContext 可能为空,直接getCookieManager
|
|
//if (this.openType != EnumOpenType.login)
|
|
{
|
|
//var t = CEFBrowser.SetCookieAsync(JsonHelper.SerializeObject(cookieLst), cefWebBrowser.GetCookieManager(null));
|
|
foreach (var cook in cookieLst)
|
|
{
|
|
var t = CEFBrowser.SetCookieAsync(cook.Domain.Trim('.'), cook.Name + "=" + cook.Value + ";", cefWebBrowser.GetCookieManager(null));
|
|
t.Wait(5000);
|
|
}
|
|
}
|
|
cefWebBrowser.Load(InitUrl);
|
|
});
|
|
}
|
|
|
|
private void CefWebBrowser_FrameLoadEnd(object sender, CefSharp.FrameLoadEndEventArgs e)
|
|
{
|
|
Task.Run(() =>
|
|
{
|
|
var jsStr = @"(function() { return document.body.innerHTML.indexOf('登录超时,请重新'); })();";
|
|
var client = cefWebBrowser.GetDevToolsClient();
|
|
if (client != null)
|
|
{
|
|
var result = client.Runtime.EvaluateAsync(jsStr, null, true, null, null, true, null, true);
|
|
result.Wait(5000);
|
|
string resultStr = result.Result.Result.Value.ParseToString();
|
|
if (resultStr.ParseToInt() > 0)
|
|
{
|
|
CEFBrowser.DeleteCookie(cefWebBrowser.GetCookieManager(null));
|
|
cefWebBrowser.Load("https://store.weixin.qq.com/talent/?redirect_url=%2Fpool%2Fhome");
|
|
return;
|
|
}
|
|
}
|
|
|
|
if (OpenType == "login" && !isLogin && (cefWebBrowser.Address.StartsWith("https://store.weixin.qq.com/talent/home") ||
|
|
cefWebBrowser.Address.StartsWith("https://store.weixin.qq.com/talent/pool/home")))
|
|
{
|
|
isLogin = true;
|
|
Thread.Sleep(500);
|
|
List<Cookie> cookieList = CEFBrowser.GetCookieList("store.weixin.qq.com", cefWebBrowser.GetCookieManager(null));
|
|
NaiBa.Util.Helper.ConfigHelper.SaveConfig("wx_sale_assistant_cookies", cookieList);
|
|
if (this.Created)
|
|
Invoke(new Action(() =>
|
|
{
|
|
BaseMsgForm.ShowInfo("登录成功");
|
|
this.Close();
|
|
}));
|
|
}
|
|
});
|
|
}
|
|
bool isLogin = false;
|
|
|
|
private void RequestHandler_ResourceLoadComplete(object sender, string url, string postData, string responseData, IRequest request)
|
|
{
|
|
var dataTmp = responseData;
|
|
var postTmp = postData;
|
|
if (isGetingProdWithCef && spuItemsBase == null && url.Contains("https://store.weixin.qq.com/shop-faas/mmeckolpoolnode/ecListSelectionSpuItems?token=&lang=zh_CN"))
|
|
{
|
|
getSpuItemsParams = JsonHelper.JObjectParse(postTmp);
|
|
Task.Run(() =>
|
|
{
|
|
showGetSaleAssistantItems(dataTmp);
|
|
});
|
|
}
|
|
}
|
|
|
|
public string requestId = "";
|
|
public string pageContext = "";
|
|
List<WXSaleAssistantSpuItemInfo> spuItemsBase = null;
|
|
JObject getSpuItemsParams = null;
|
|
void showGetSaleAssistantItems(string spuItemsData)
|
|
{
|
|
try
|
|
{
|
|
searchPageCount++;
|
|
Invoke(new Action(() =>
|
|
{
|
|
statusBar.lblTaskStatus.Text = "当前翻页数:" + searchPageCount;
|
|
}));
|
|
if (searchPageCount % 10 == 0)
|
|
{
|
|
NaiBa.Util.Helper.ConfigHelper.SaveConfig("wx_sale_assistant_list_" + MainForm.ProcessCount, lstWxSaleAssistantSpuItemInfo);
|
|
}
|
|
if (searchPageCount >= pageEnd)
|
|
{
|
|
isGetingProdWithCef = false;
|
|
}
|
|
if (spuItemsData.Contains("\"hasNext\":false"))
|
|
{
|
|
isGetingProdWithCef = false;
|
|
}
|
|
pageContext = BaseRegex.GetStringJson(ref spuItemsData, "pageContext");
|
|
requestId = BaseRegex.GetStringJson(ref spuItemsData, "requestId");
|
|
|
|
var jObj = JsonHelper.JObjectParse(spuItemsData)["spuItems"];
|
|
var spuItems = JsonHelper.DeserializeJsonToList<WXSaleAssistantSpuItemInfo>(JsonHelper.SerializeObject(jObj));
|
|
if (spuItemsBase == null)
|
|
{
|
|
spuItemsBase = spuItems;
|
|
foreach (var spuItem in spuItems)
|
|
{
|
|
// 月销
|
|
if (spuItem.spu.sales.monthlySales < filterMonthSaleCount)
|
|
continue;
|
|
// 总销
|
|
if (spuItem.spu.sales.cumulativeSales < filterTotalSaleCount)
|
|
continue;
|
|
// 已加入橱窗
|
|
if (chkSkipIsAddWindow.Checked && spuItem.shopWindow != null && spuItem.shopWindow.status == 1)
|
|
continue;
|
|
// 已存在
|
|
if (lstWxSaleAssistantSpuItemInfo.Any(s => s.spu.id == spuItem.spu.id))
|
|
continue;
|
|
|
|
lstWxSaleAssistantSpuItemInfo.Add(spuItem);
|
|
Invoke(new Action(() =>
|
|
{
|
|
var rowId = this.dgvProduct.Rows.Add(
|
|
true,
|
|
spuItem.shop.appId,
|
|
spuItem.shop.name,
|
|
spuItem.spu.id,
|
|
spuItem.spu.headImage, //.Replace("https://", "http://"),
|
|
DataGridViewExtension.defaultBitmap,
|
|
spuItem.spu.name,
|
|
spuItem.spu.sales.monthlySales,
|
|
spuItem.spu.sales.cumulativeSales,
|
|
"", // 没有类目信息,不填
|
|
spuItem.spu.price.sellingPrice * 0.01m,
|
|
"删除",
|
|
spuItem.operateMsg
|
|
);
|
|
dgvProduct.Rows[rowId].Height = 60;
|
|
}));
|
|
}
|
|
}
|
|
}
|
|
catch
|
|
{
|
|
}
|
|
//currentGetHotListParamData = "";
|
|
//currentGetSupplierListParamData = postData;
|
|
//currentSupplierId = BaseRegex.GetStringJson(ref postData, "supplierId");
|
|
//currentSupplierName = BaseRegex.GetStringJson(ref responseData, "supplierName");
|
|
}
|
|
|
|
private bool RequestHandler_BeforeResourceLoad(object sender, string url, string postData, IRequest request)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
private void CefWebBrowser_AddressChanged(object sender, CefSharp.AddressChangedEventArgs e)
|
|
{
|
|
if (this.Created && !this.Disposing && !this.IsDisposed)
|
|
{
|
|
Task.Run(() =>
|
|
{
|
|
if (this.Created)
|
|
Invoke(new Action(() =>
|
|
{
|
|
currentUrl = e.Address;
|
|
txtAddress.Text = e.Address;
|
|
}));
|
|
});
|
|
}
|
|
}
|
|
|
|
private void CefWebBrowser_LoadError(object sender, CefSharp.LoadErrorEventArgs e)
|
|
{
|
|
}
|
|
|
|
private void btnImportCookie_Click(object sender, EventArgs e)
|
|
{
|
|
Task.Run(() =>
|
|
{
|
|
foreach (var cookie in txtCookie.Text.Split(new string[] { "\r", "\n" }, StringSplitOptions.RemoveEmptyEntries))
|
|
{
|
|
var t = CEFBrowser.SetCookieAsync("store.weixin.qq.com", cookie, cefWebBrowser.GetCookieManager(null));
|
|
t.Wait(5000);
|
|
}
|
|
cefWebBrowser.Load(InitUrl);
|
|
});
|
|
}
|
|
|
|
private void btnSaveCookie_Click(object sender, EventArgs e)
|
|
{
|
|
List<Cookie> cookieList = CEFBrowser.GetCookieList("store.weixin.qq.com", cefWebBrowser.GetCookieManager(null));
|
|
|
|
var url = BaseClass.BuildWXObjString("user/update_wx_sale_assistant_cookie");
|
|
var data = UserLogin.GetSignaturex();
|
|
data += "&cookie=" + GetHtml.UrlEncodeUtf8(JsonHelper.SerializeObject(cookieList));
|
|
var result = GetHtml.PostUtf8(url, data);
|
|
if (!result.Contains("\"code\":200"))
|
|
result = GetHtml.PostUtf8(url, data);
|
|
|
|
if (result.Contains("\"code\":200"))
|
|
BaseMsgForm.ShowInfo("保存成功");
|
|
else
|
|
BaseMsgForm.ShowInfo("保存失败,请重试");
|
|
}
|
|
|
|
private void btnRefreshCookie_Click(object sender, EventArgs e)
|
|
{
|
|
InitCef();
|
|
}
|
|
|
|
private void btnPrev_Click(object sender, EventArgs e)
|
|
{
|
|
cefWebBrowser.Back();
|
|
}
|
|
|
|
private void btnNext_Click(object sender, EventArgs e)
|
|
{
|
|
cefWebBrowser.Forward();
|
|
}
|
|
|
|
private void txtAddress_KeyDown(object sender, KeyEventArgs e)
|
|
{
|
|
if (e.KeyCode == Keys.Enter)
|
|
{
|
|
if (cefWebBrowser != null)
|
|
{
|
|
cefWebBrowser.Load(txtAddress.Text);
|
|
}
|
|
}
|
|
}
|
|
|
|
private void dgvProduct_CellContentClick(object sender, DataGridViewCellEventArgs e)
|
|
{
|
|
if (e.ColumnIndex < 0 || e.RowIndex < 0)
|
|
return;
|
|
string headerText = dgvProduct.Columns[e.ColumnIndex].HeaderText;
|
|
var prodId = dgvProduct.Rows[e.RowIndex].Cells["colProductId"].Value.ParseToString();
|
|
var prod = lstWxSaleAssistantSpuItemInfo.FirstOrDefault(p => p.spu.id == prodId);
|
|
var row = dgvProduct.Rows[e.RowIndex];
|
|
|
|
switch (headerText)
|
|
{
|
|
case "删除":
|
|
//if (BaseMsgForm.ShowConfirm("确定删除商品吗?删除后不可恢复!").DialogResult == DialogResult.Cancel)
|
|
// return;
|
|
//DeleteProduct(dbId);
|
|
dgvProduct.Rows.Remove(row);
|
|
lstWxSaleAssistantSpuItemInfo.Remove(prod);
|
|
NaiBa.Util.Helper.ConfigHelper.SaveConfig("wx_sale_assistant_list_" + MainForm.ProcessCount, lstWxSaleAssistantSpuItemInfo);
|
|
break;
|
|
case "图片":
|
|
var imgUrl = dgvProduct.Rows[e.RowIndex].Cells["colImgUrl"].Value.ParseToString().Replace("?imageView2/2/w/90/h/90", "");
|
|
Dictionary<string, string> dic = new Dictionary<string, string>();
|
|
dic[imgUrl] = imgUrl;
|
|
foreach (var imgPath in prod.spu.headImage)
|
|
{
|
|
//dic[imgPath.Replace("https", "http")] = imgPath.Replace("https", "http");
|
|
}
|
|
ShowImgForm imgFrom = new ShowImgForm(imgUrl, dic);
|
|
imgFrom.ShowDialog();
|
|
break;
|
|
case "":
|
|
dgvProduct.Rows[e.RowIndex].Cells["colCheck"].Value = !(bool)dgvProduct.Rows[e.RowIndex].Cells["colCheck"].Value;
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
private void txtFilterSaleCount_TextChanged(object sender, EventArgs e)
|
|
{
|
|
filterMonthSaleCount = txtFilterMonthSaleCount.Text.Trim().ParseToInt();
|
|
}
|
|
|
|
private void txtFilterTotalSaleCount_TextChanged(object sender, EventArgs e)
|
|
{
|
|
filterTotalSaleCount = txtFilterTotalSaleCount.Text.Trim().ParseToInt();
|
|
}
|
|
|
|
private void txtPageStart_TextChanged(object sender, EventArgs e)
|
|
{
|
|
pageStart = txtPageStart.Text.Trim().ParseToInt();
|
|
}
|
|
|
|
private void txtPageEnd_TextChanged(object sender, EventArgs e)
|
|
{
|
|
pageEnd = txtPageEnd.Text.Trim().ParseToInt();
|
|
}
|
|
|
|
private void btnStopStop_Click(object sender, EventArgs e)
|
|
{
|
|
if (cancellationTokenSource != null)
|
|
cancellationTokenSource.Cancel();
|
|
isGetingProdWithCef = false;
|
|
|
|
Task.Run(() =>
|
|
{
|
|
Thread.Sleep(5000);
|
|
Invoke(new Action(() =>
|
|
{
|
|
if (cancellationTokenSource == null || cancellationTokenSource.IsCancellationRequested)
|
|
pbLoading.Visible = false;
|
|
}));
|
|
});
|
|
}
|
|
|
|
|
|
private void btnSearchTitle_Click(object sender, EventArgs e)
|
|
{
|
|
pbLoading.Visible = true;
|
|
Task.Run(() =>
|
|
{
|
|
var rowLst = dgvProduct.Rows.Cast<DataGridViewRow>().ToList();
|
|
rowLst.Reverse();
|
|
foreach (DataGridViewRow row in dgvProduct.Rows)
|
|
{
|
|
Invoke(new Action(() =>
|
|
{
|
|
|
|
row.Visible = (row.Cells["colGoodsName"].Value.ParseToString().Contains(txtTitle.Text.Trim()) || txtTitle.Text.Trim() == "");
|
|
if (row.Visible == false)
|
|
row.Cells["colCheck"].Value = false;
|
|
|
|
}));
|
|
}
|
|
Invoke(new Action(() =>
|
|
{
|
|
pbLoading.Visible = false;
|
|
}));
|
|
});
|
|
}
|
|
|
|
|
|
private void txtWaitSeconds_TextChanged(object sender, EventArgs e)
|
|
{
|
|
getDetailWaitSeconds = txtWaitSeconds.Text.ParseToDecimal();
|
|
}
|
|
|
|
private void btnExportCookie_Click(object sender, EventArgs e)
|
|
{
|
|
List<Cookie> cookieList = CEFBrowser.GetCookieList("store.weixin.qq.com", cefWebBrowser.GetCookieManager(null));
|
|
var shop = new ShopLoginInfo();
|
|
shop.Cookies = JsonHelper.SerializeObject(cookieList);
|
|
|
|
List<CefSharp.Cookie> cooks = null;
|
|
try { cooks = JsonHelper.DeserializeJsonToList<CefSharp.Cookie>(shop.Cookies); } catch (Exception ex) { }
|
|
if (cooks == null)
|
|
cooks = new List<CefSharp.Cookie>();
|
|
|
|
string cookJs = "";
|
|
var keys = new string[] { "device_id", "talent_magic", "talent_rand", "talent_token" };
|
|
foreach (var shopCook in cooks)
|
|
{
|
|
var cookie = shopCook.Name + "=" + shopCook.Value;
|
|
if (!keys.Any(k => cookie.StartsWith(k)))
|
|
continue;
|
|
cookJs += "\r\ndocument.cookie='" + cookie.Substring(0, Math.Max(0, cookie.IndexOf("="))) + "=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;';";
|
|
}
|
|
foreach (var shopCook in cooks)
|
|
{
|
|
var cookie = shopCook.Name + "=" + shopCook.Value;
|
|
if (!keys.Any(k => cookie.StartsWith(k)))
|
|
continue;
|
|
cookJs += "\r\ndocument.cookie='" + cookie + "; domain=store.weixin.qq.com; expires=" +
|
|
DateTime.Now.AddMonths(1).ToUniversalTime().ToString("ddd, dd MMM yyyy HH:mm:ss 'UTC'", new DateTimeFormatInfo()) + "; path=/';";
|
|
}
|
|
cookJs += "\r\nsetTimeout(() => { window.location.href='" + InitUrl + "'; }, 200)";
|
|
Clipboard.SetDataObject(cookJs);
|
|
BaseMsgForm.ShowInfo("复制成功");
|
|
}
|
|
|
|
private void btnGetWxProd_Click(object sender, EventArgs e)
|
|
{
|
|
isGetingProdWithCef = true;
|
|
pbLoading.Visible = true;
|
|
if (cancellationTokenSource != null)
|
|
cancellationTokenSource.Cancel();
|
|
cancellationTokenSource = new CancellationTokenSource();
|
|
|
|
if (chkKeepOldData.Checked == false)
|
|
{
|
|
dgvProduct.Rows.Clear();
|
|
lstWxSaleAssistantSpuItemInfo.Clear();
|
|
}
|
|
searchPageCount = 0;
|
|
spuItemsBase = null;
|
|
getSpuItemsParams = null;
|
|
|
|
Task.Run(() =>
|
|
{
|
|
int top = 0;
|
|
while (this.isGetingProdWithCef == true)
|
|
{
|
|
if (cancellationTokenSource.IsCancellationRequested)
|
|
break;
|
|
|
|
top += Randomx.GetId(500, 900);
|
|
Thread.Sleep((int)(getDetailWaitSeconds * 1000) - 100 + Randomx.GetId(101, 501));
|
|
|
|
if (cefWebBrowser.IsLoading)
|
|
{
|
|
|
|
}
|
|
|
|
var jsStr = @"window.scroll({
|
|
top: document.body.scrollHeight,
|
|
left: 0,
|
|
behavior: 'smooth' // 可选,使滚动平滑
|
|
});";
|
|
//jsStr = @"window.scroll({
|
|
// top: " + top + @",
|
|
// left: 0,
|
|
// behavior: 'smooth' // 可选,使滚动平滑
|
|
// });";
|
|
var client = cefWebBrowser.GetDevToolsClient();
|
|
if (client != null)
|
|
{
|
|
var result = client.Runtime.EvaluateAsync(jsStr, null, true, null, null, true, null, true);
|
|
result.Wait(5000);
|
|
}
|
|
|
|
if (getSpuItemsParams != null)
|
|
break;
|
|
}
|
|
|
|
while (spuItemsBase != null && getSpuItemsParams != null && searchPageCount < pageEnd)
|
|
{
|
|
|
|
if (cancellationTokenSource.IsCancellationRequested)
|
|
break;
|
|
|
|
int sleepTime = (int)(getDetailWaitSeconds * 1000) - 100 + Randomx.GetId(101, 501);
|
|
Thread.Sleep(Math.Max(100, sleepTime));
|
|
|
|
searchPageCount++;
|
|
Invoke(new Action(() =>
|
|
{
|
|
statusBar.lblTaskStatus.Text = "当前翻页数:" + searchPageCount;
|
|
}));
|
|
if (searchPageCount % 10 == 0)
|
|
{
|
|
NaiBa.Util.Helper.ConfigHelper.SaveConfig("wx_sale_assistant_list_" + MainForm.ProcessCount, lstWxSaleAssistantSpuItemInfo);
|
|
}
|
|
|
|
List<Cookie> cookieList = CEFBrowser.GetCookieList("store.weixin.qq.com", cefWebBrowser.GetCookieManager(null));
|
|
var cookieShop = new ShopLoginInfo();
|
|
cookieShop.Cookies = JsonHelper.SerializeObject(cookieList);
|
|
getSpuItemsParams["pageContext"]["pageContext"] = pageContext;
|
|
getSpuItemsParams["requestContext"]["requestId"] = BaseClass.DateTimeToTimestampMilliseconds(DateTime.Now).ToString(); // requestId;
|
|
foreach (var item in spuItemsBase)
|
|
{
|
|
JObject jObjDisplaySpu = new JObject();
|
|
jObjDisplaySpu["spuId"] = item.spu.id;
|
|
(getSpuItemsParams["requestContext"]["displayedSpus"] as JArray).Add(jObjDisplaySpu);
|
|
}
|
|
|
|
//{"code":0,"pageContextResp":{"hasNext":false},"requestId":"1778688044492"}
|
|
int errorCnt = 0;
|
|
int nomoreCnt = 0;
|
|
var spuItemsData = WxGetAssistant.wxGetAssistant(cookieShop, getSpuItemsParams);
|
|
for (int i = 1; i <= noNextPageRetryTimes; i++) // 重试50次
|
|
{
|
|
if (!spuItemsData.Contains("\"code\":0") || spuItemsData.Contains("\"hasNext\":false"))
|
|
{
|
|
if (!spuItemsData.Contains("\"code\":0"))
|
|
errorCnt++;
|
|
if (errorCnt > 5)
|
|
break;
|
|
|
|
if (spuItemsData.Contains("\"hasNext\":false"))
|
|
nomoreCnt++;
|
|
|
|
if (nomoreCnt > 7)
|
|
{
|
|
}
|
|
else if (nomoreCnt > 6)
|
|
{
|
|
}
|
|
else if (nomoreCnt > 5)
|
|
{
|
|
}
|
|
else if (nomoreCnt > 4)
|
|
{
|
|
}
|
|
else if (nomoreCnt > 3)
|
|
{
|
|
}
|
|
else if (nomoreCnt > 2)
|
|
{
|
|
}
|
|
|
|
sleepTime = (int)(getDetailWaitSeconds * 1000) - 100 + Randomx.GetId(101, 501);
|
|
Thread.Sleep(Math.Max(100, sleepTime));
|
|
|
|
spuItemsData = WxGetAssistant.wxGetAssistant(cookieShop, getSpuItemsParams);
|
|
}
|
|
if (i % 10 == 0 && spuItemsData.Contains("\"hasNext\":false"))
|
|
{
|
|
//if (BaseMsgForm.ShowConfirm("已连续" + i + "次未查询到下一页商品,是否继续?").DialogResult != DialogResult.OK)
|
|
// break;
|
|
}
|
|
}
|
|
if (!spuItemsData.Contains("\"code\":0"))
|
|
{
|
|
BaseMsgForm.ShowError(spuItemsData);
|
|
break;
|
|
}
|
|
if (spuItemsData.Contains("\"hasNext\":false"))
|
|
{
|
|
break;
|
|
}
|
|
|
|
pageContext = BaseRegex.GetStringJson(ref spuItemsData, "pageContext");
|
|
requestId = BaseRegex.GetStringJson(ref spuItemsData, "requestId");
|
|
|
|
var jObj = JsonHelper.JObjectParse(spuItemsData)["spuItems"];
|
|
var spuItems = JsonHelper.DeserializeJsonToList<WXSaleAssistantSpuItemInfo>(JsonHelper.SerializeObject(jObj));
|
|
spuItemsBase = spuItems;
|
|
foreach (var spuItem in spuItems)
|
|
{
|
|
// 月销
|
|
if (spuItem.spu.sales.monthlySales < filterMonthSaleCount)
|
|
continue;
|
|
// 总销
|
|
if (spuItem.spu.sales.cumulativeSales < filterTotalSaleCount)
|
|
continue;
|
|
// 已加入橱窗
|
|
if (chkSkipIsAddWindow.Checked && spuItem.shopWindow != null && spuItem.shopWindow.status == 1)
|
|
continue;
|
|
// 已存在
|
|
if (lstWxSaleAssistantSpuItemInfo.Any(s => s.spu.id == spuItem.spu.id))
|
|
continue;
|
|
|
|
lstWxSaleAssistantSpuItemInfo.Add(spuItem);
|
|
Invoke(new Action(() =>
|
|
{
|
|
var rowId = this.dgvProduct.Rows.Add(
|
|
true,
|
|
spuItem.shop.appId,
|
|
spuItem.shop.name,
|
|
spuItem.spu.id,
|
|
spuItem.spu.headImage, //.Replace("https://", "http://"),
|
|
DataGridViewExtension.defaultBitmap,
|
|
spuItem.spu.name,
|
|
spuItem.spu.sales.monthlySales,
|
|
spuItem.spu.sales.cumulativeSales,
|
|
"", // 没有类目信息,不填
|
|
spuItem.spu.price.sellingPrice * 0.01m,
|
|
"删除",
|
|
spuItem.operateMsg
|
|
);
|
|
dgvProduct.Rows[rowId].Height = 60;
|
|
}));
|
|
}
|
|
}
|
|
|
|
if (!cancellationTokenSource.IsCancellationRequested)
|
|
BaseMsgForm.ShowInfo("查询结束");
|
|
else
|
|
BaseMsgForm.ShowInfo("查询中断");
|
|
|
|
Invoke(new Action(() => { pbLoading.Visible = false; }));
|
|
|
|
}, cancellationTokenSource.Token);
|
|
}
|
|
|
|
private void btnClear_Click(object sender, EventArgs e)
|
|
{
|
|
if (BaseMsgForm.ShowConfirm("确定清除选中商品吗?清除后不可恢复!").DialogResult == DialogResult.Cancel)
|
|
return;
|
|
|
|
var rows = this.dgvProduct.Rows.Cast<DataGridViewRow>().ToList(); //Cast后Rows做foreach循环时仍会夹花跳过,所以要ToList转一个新的数组。
|
|
foreach (var row in rows)
|
|
{
|
|
if (row.Cells["colCheck"].Value.ParseToBool() == true)
|
|
{
|
|
var spuId = row.Cells["colProductId"].Value.ParseToString();
|
|
lstWxSaleAssistantSpuItemInfo.RemoveAll(p => p.spu.id.ParseToString() == spuId);
|
|
this.dgvProduct.Rows.Remove(row);
|
|
}
|
|
}
|
|
NaiBa.Util.Helper.ConfigHelper.SaveConfig("wx_sale_assistant_list_" + MainForm.ProcessCount, lstWxSaleAssistantSpuItemInfo);
|
|
}
|
|
|
|
private void txtRetryTimes_TextChanged(object sender, EventArgs e)
|
|
{
|
|
noNextPageRetryTimes = Math.Max(20, txtRetryTimes.Text.ParseToInt());
|
|
}
|
|
|
|
private void btnReload_Click(object sender, EventArgs e)
|
|
{
|
|
CEFBrowser.DeleteCookie(cefWebBrowser.GetCookieManager(null));
|
|
cefWebBrowser.Load(InitUrl);
|
|
}
|
|
}
|
|
|
|
public class WXSaleAssistantSpuItemInfo
|
|
{
|
|
public string operateMsg;
|
|
|
|
public WXSaleAssistantSpuInfo spu { get; set; }
|
|
public WXSaleAssistantPromoteInfo promote { get; set; }
|
|
public WXSaleAssistantShopInfo shop { get; set; }
|
|
public object localLife { get;set;}
|
|
// 是否已加入橱窗,不为空切status为1表示已加入
|
|
public WXSaleAssistantShopWindowInfo shopWindow { get; set; }
|
|
}
|
|
|
|
public class WXSaleAssistantShopWindowInfo
|
|
{
|
|
public int? status { get; set; } // 1
|
|
}
|
|
|
|
public class WXSaleAssistantShopInfo
|
|
{
|
|
public string name { get; set; } // "海阔文化云上图书",
|
|
public string icon { get; set; } // "http://mmbiz.qpic.cn/sz_mmbiz_png/ZWUXBFWiasldM81seiaAjqom0sK2QKAkkD4hXX3iaWLeyKmUnyNfPy1iaZ774ia29lMIj1fVEtcZqqXrv4c66ROCgpQ/0?wx_fmt=png",
|
|
public WXSaleAssistantDetailedSellerRating detailedSellerRating { get; set; }
|
|
public string appId { get; set; } // "wx1517b163194b3eaa",
|
|
public string flag { get; set; } // "3"
|
|
}
|
|
|
|
public class WXSaleAssistantDetailedSellerRating
|
|
{
|
|
public WXSaleAssistantDetailedRating detailedRating { get; set; }
|
|
public WXSaleAssistantDetailedRating detailedSpuRating { get; set; }
|
|
public WXSaleAssistantDetailedRating detailedDeliverRating { get; set; }
|
|
public WXSaleAssistantDetailedRating detailedServiceRating { get; set; }
|
|
}
|
|
|
|
public class WXSaleAssistantDetailedRating
|
|
{
|
|
public int? score { get; set; } // 482,
|
|
public int? level { get; set; } // 2,
|
|
public int? abovePercent { get; set; } // 7122
|
|
|
|
}
|
|
|
|
public class WXSaleAssistantPromoteInfo
|
|
{
|
|
public WXSaleAssistantCommissionInfo commission { get; set; }
|
|
}
|
|
|
|
public class WXSaleAssistantCommissionInfo
|
|
{
|
|
public int? commissionRate { get; set; } // 500000,
|
|
public string commissionRateDesc { get; set; } // "佣金率50%",
|
|
public int? commission { get; set; } // 1490,
|
|
public string commissionType { get; set; } // 1
|
|
|
|
}
|
|
|
|
public class WXSaleAssistantSpuInfo
|
|
{
|
|
public string id { get; set; } // "10000666530619"
|
|
public string name { get; set; } // "懒鸟效应:激发孩子的成长力 养成自律的好习惯 告别拖延与分心",
|
|
public string headImage { get; set; } // "https://wst.wxapp.tc.qq.com/161/20304/snscosdownload/SH/reserved/69d774500008a8161a1689b6ab95b01e000000a000004f50",
|
|
public WXSaleAssistantStockInfo stock { get; set; }
|
|
public WXSaleAssistantSalesInfo sales { get; set; }
|
|
public WXSaleAssistantPriceInfo price { get; set; }
|
|
public string shortName { get; set; } // "点击购买【懒鸟三生教育】"
|
|
public List<WXSaleAssistantGuaranteeShowInfo> guaranteeShows { get; set; }
|
|
public List<WXSaleAssistantBenefitInfo> benefits { get; set; }
|
|
}
|
|
|
|
public class WXSaleAssistantBenefitInfo
|
|
{
|
|
public int? benefits { get; set; } // 0,
|
|
public string name { get; set; } // "限免服务费"
|
|
|
|
}
|
|
|
|
|
|
public class WXSaleAssistantGuaranteeShowInfo
|
|
{
|
|
public string desc { get; set; } // "7天无理由",
|
|
public int? tag { get; set; } // 4
|
|
}
|
|
|
|
public class WXSaleAssistantPriceInfo
|
|
{
|
|
public int? sellingPrice { get; set; } // 2980
|
|
}
|
|
|
|
public class WXSaleAssistantStockInfo
|
|
{
|
|
public int? totalStock { get; set; } // 3929912
|
|
}
|
|
public class WXSaleAssistantSalesInfo
|
|
{
|
|
/// <summary>
|
|
/// 月销量
|
|
/// </summary>
|
|
public int? monthlySales { get; set; } // 52421
|
|
/// <summary>
|
|
/// 总销量
|
|
/// </summary>
|
|
public int? cumulativeSales { get; set; } // 71960
|
|
}
|
|
|
|
public class WxGetAssistant
|
|
{
|
|
public static string wxGetAssistant(ShopLoginInfo shop, JObject wxCateAuthParam)
|
|
{
|
|
string url = "https://store.weixin.qq.com/shop-faas/mmeckolpoolnode/ecListSelectionSpuItems?token=&lang=zh_CN";
|
|
string referer = "https://store.weixin.qq.com/talent/pool/home";
|
|
string data = JsonHelper.SerializeObject(wxCateAuthParam);
|
|
var result = WXHttpResponseBLL.WeiXinAssistantPostResponse(shop, url, data, referer);
|
|
return result;
|
|
}
|
|
|
|
// {"filter":{"spuFilter":{"monthlySalesRange":null,"goodEvaluationRatioRange":null,"shopScoreRange":null},"spuSort":{"sortOrder":0,"sortType":0},"category":null},"pageContext":{"pageContext":null,"limit":15},"requestContext":{"sessionId":"1779790694673","requestId":"1779790757479","parentSearchId":"53","displayedSpus":null},"keyword":"10000708952443"}
|
|
public static string wxGetAssistant(ShopLoginInfo shop, string prodId)
|
|
{
|
|
string url = "https://store.weixin.qq.com/shop-faas/mmeckolpoolnode/ecSearchSelectionSpuItems?token=&lang=zh_CN";
|
|
string referer = "https://store.weixin.qq.com/talent/pool/home?keyword=" + prodId;
|
|
string body = @"{""filter"":{""spuFilter"":{""monthlySalesRange"":null,""goodEvaluationRatioRange"":null,""shopScoreRange"":null},
|
|
""spuSort"":{""sortOrder"":0,""sortType"":0},""category"":null},""pageContext"":{""pageContext"":null,""limit"":15},
|
|
""requestContext"":{""sessionId"":""" + BaseClass.DateTimeToTimestampMilliseconds(DateTime.Now.AddSeconds(-Randomx.GetId(10, 100))) + @""",
|
|
""requestId"":""" + BaseClass.DateTimeToTimestampMilliseconds(DateTime.Now) + @""",""parentSearchId"":""53"",""displayedSpus"":null},
|
|
""keyword"":""" + prodId + @"""}";
|
|
|
|
var result = WXHttpResponseBLL.WeiXinAssistantPostResponse(shop, url, body, referer);
|
|
return result;
|
|
}
|
|
|
|
}
|
|
}
|