using AllBase; using AllBase.Model.Result; using AllBase.Model.Result._1688; using AllBase.Model.Result.JST; 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.Text.RegularExpressions; 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 Get1688ProductForm : BaseForms.BaseForm { List lst1688cookie = null; public bool isGetProdLst = false; Dictionary dicAfterSale = new Dictionary(); public CancellationTokenSource cancellationTokenSource { get; set; } = null; public CancellationTokenSource CancelReturn { get; set; } = null; //string InitUrl = "https://air.1688.com/app/channel-fe/search/index.html?spm=a260k.home2025.centralDoor.dyjdf.51c435972rph5F#/result?topOfferIds=673868452000"; //string InitUrl = "https://air.1688.com/app/channel-fe/search/index.html?spm=a260k.home2025.centralDoor.dyjdf.51c435972rph5F#/result"; string InitUrl = "https://air.1688.com/app/channel-fe/search/index.html?spm=a21vf6.home.0.0#/result"; public ChromiumWebBrowser cefWebBrowser = null; private string currentUrl = ""; private string currentGet1688ListParamData = ""; private string currentGet1688ListProductData = ""; private string appVersion = ""; private string currentSupplierId = ""; int getDetailWait = 1; int pageStart = 1; int pageEnd = 9999; ConcurrentList<_1688OneProductListInfo> lst1688OneProductListInfo = new ConcurrentList<_1688OneProductListInfo>(); public Get1688ProductForm() { InitializeComponent(); } private void GetJuShuitanProdForm_Load(object sender, EventArgs e) { this.splitContainer1.SplitterDistance = 472; this.dgvProduct.AddSelectorColumn("colCheck"); this.dgvProduct.AddImgColumn("colImg", "colImgUrl"); lst1688cookie = NaiBa.Util.Helper.ConfigHelper.LoadConfig>("1688_cookies"); if (lst1688cookie == null) lst1688cookie = new List(); lst1688OneProductListInfo = NaiBa.Util.Helper.ConfigHelper.LoadConfig>("1688_product_list_" + MainForm.ProcessCount); if (lst1688OneProductListInfo == null) lst1688OneProductListInfo = new ConcurrentList<_1688OneProductListInfo>(); var _1688AddressForm = new GetAddressForm() { AddressType = "1688" }; _1688AddressForm.cmbType.Enabled = false; _1688AddressForm.cmbTypeFilter.Enabled = false; _1688AddressForm.TopLevel = false; _1688AddressForm.FormBorderStyle = FormBorderStyle.None; _1688AddressForm.Dock = DockStyle.Fill; this.panel1.Controls.Add(_1688AddressForm); _1688AddressForm.Show(); pbLoading.Visible = true; Task.Run(() => { int id = 0; foreach (var prod in lst1688OneProductListInfo) { id++; if (id % 50 == 0) Thread.Sleep(1); Invoke(new Action(() => { var rowId = this.dgvProduct.Rows.Add( true, prod.sellerId, prod.memberInfo.companyName, prod.offerId, prod.title, prod?.dbProduct?.cat_name != null ? prod?.dbProduct?.cat_name : prod?.dbProduct?.cat_id, prod.offerPic.ParseToString().Replace("https://", "http://"), DataGridViewExtension.defaultBitmap, //"", //prod.skuId, //"", //prod.color + ";" + prod.spec, prod?.dbProduct?.price_text == null ? prod?.dbProduct?.price_text : prod.price.ParseToString(), "", //prod.stock, prod.saleInfo.blurDfSales, prod.saleInfo.blurDfSales7d, prod.fullfillInfo.pickupRate48H, prod.proxyAdvice.outDistributeCnt, TemuKJD.Properties.Resources.wang_wang_icon, "删除", prod.getProductMsg ); ; dgvProduct.Rows[rowId].Height = 60; //if (chanceProductResult.dbProduct != null) //{ // var dbProd = chanceProductResult.dbProduct; // var row = dgvChanceProduct.Rows[rowId]; // row.Cells["colGoodsName"].Value = dbProd.product_name; // row.Cells["colCate"].Value = dbProd.cat_name; // row.Cells["colPrice"].Value = dbProd.price_text; //} })); } 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(() => { //string serverCookie = ""; //var url = BaseClass.BuildPDDObjString("user/get_scm121_cookie"); //var data = UserLogin.GetSignaturex(); //var result = GetHtml.PostUtf8(url, data); //if (!result.Contains("\"code\":200")) // result = GetHtml.PostUtf8(url, data); //List cookieLst = new List(); //try //{ // serverCookie = JsonHelper.SerializeObject(JsonHelper.JObjectParse(result)["cookie"]); // cookieLst = JsonHelper.DeserializeJsonToList(serverCookie); // if (cookieLst == null) // cookieLst = new List(); //} //catch //{ //} List cookieLst = lst1688cookie; // 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) { } public string currentDetailData = ""; private void RequestHandler_ResourceLoadComplete(object sender, string url, string postData, string responseData, IRequest request) { //if (url.Contains("api/goods/buyer/supplier/goods/list")) //{ // if (request.Headers.AllKeys.Contains("App-Version")) // appVersion = request.Headers["App-Version"]; // Task.Run(() => { GetCurrent1688SearchData(postData, responseData, request); }); //} //if (url.Contains("https://sc.scm121.com/api/goods/buyer/supplier/goods/skuList")) //{ // if (request.Headers.AllKeys.Contains("App-Version")) // appVersion = request.Headers["App-Version"]; // Task.Run(() => { GetCurrentSupplierSearchSkuData(postData, responseData, request); }); //} if (url.Contains("https://h5api.m.1688.com/h5/mtop.alibaba.1688.distribution.buyer.selection.search")) { Task.Run(() => { GetCurrent1688SearchData(postData, responseData, request); }); } if (url.Contains("https://detail.1688.com/offer/")) { currentDetailData = responseData; } if (responseData.Contains("赛龙宠物")) { } } void GetCurrent1688SearchData(string postData, string responseData, IRequest request) { currentGet1688ListParamData = GetHtml.UrlDecode(postData.Replace("data=", "")); currentGet1688ListProductData = responseData; if (isGetProdLst) { } } 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(() => { 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) { if (!txtCookie.Text.Contains("_tb_token_")) { BaseMsgForm.ShowError("导入的cookie无效,请重新输入"); return; } Task.Run(() => { var t = CEFBrowser.SetCookieAsync(".1688.com", txtCookie.Text, cefWebBrowser.GetCookieManager(null)); t.Wait(5000); cefWebBrowser.Load(InitUrl); }); } private void btnSaveCookie_Click(object sender, EventArgs e) { List cookieList = CEFBrowser.GetCookieList(".1688.com", cefWebBrowser.GetCookieManager(null)); NaiBa.Util.Helper.ConfigHelper.SaveConfig("1688_cookies", cookieList); BaseMsgForm.ShowInfo("保存成功"); //var url = BaseClass.BuildPDDObjString("user/update_scm121_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 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 = lst1688OneProductListInfo.FirstOrDefault(p => p.offerId.ParseToString() == prodId); var row = dgvProduct.Rows[e.RowIndex]; switch (headerText) { case "删除": //if (BaseMsgForm.ShowConfirm("确定删除商品吗?删除后不可恢复!").DialogResult == DialogResult.Cancel) // return; //DeleteProduct(dbId); dgvProduct.Rows.Remove(row); lst1688OneProductListInfo.Remove(prod); NaiBa.Util.Helper.ConfigHelper.SaveConfig("1688_product_list_" + MainForm.ProcessCount, lst1688OneProductListInfo); break; case "图片": var imgUrl = dgvProduct.Rows[e.RowIndex].Cells["colImgUrl"].Value.ParseToString(); Dictionary dic = new Dictionary(); dic[imgUrl] = imgUrl; 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; case "旺旺聊天": //https://air.1688.com/app/ocms-fusion-components-1688/def_cbu_web_im/index.html?touid=cnalichn%E8%B5%9B%E9%BE%99%E5%AE%A0%E7%89%A9&siteid=cnalichn&status=1&portalId=&gid=&offerId=757406440159#/ var url = "https://air.1688.com/app/ocms-fusion-components-1688/def_cbu_web_im/index.html?touid=cnalichn" + prod.memberInfo.companyName + "&siteid=cnalichn&status=1&portalId=&gid=&offerId=" + prod.offerId + "#/"; //WebForm url = "https://detail.1688.com/offer/" + prod.offerId + ".html?spm=a21vf6.result.0.0.5a8a12ffMLgKMw&fxcv=2&sk=consign"; List cookieList = CEFBrowser.GetCookieList(".1688.com", cefWebBrowser.GetCookieManager(null)); var shop = new ShopLoginInfo(); shop.Cookies = JsonHelper.SerializeObject(cookieList); if (WebForm.instance != null) { WebForm.instance.InitUrl = url; WebForm.instance.Show(); WebForm.instance.initCefAndMainShop(); } else { WebForm webForm = new WebForm(shop, url); webForm.Show(); } Task.Run(() => { Thread.Sleep(Randomx.GetId(1000, 2000)); WebForm.instance.ClickWangwang(); }); break; default: break; } } private void btnCollectSupplier_Click(object sender, EventArgs e) { if (string.IsNullOrEmpty(currentGet1688ListParamData) || string.IsNullOrEmpty(currentGet1688ListProductData)) { BaseMsgForm.ShowError("请在网页上选择一件代发商品列表页面"); return; } if (dgvProduct.Rows.Count > 0) { if (BaseMsgForm.ShowConfirm("当前列表已有采集数据,是否重新采集?").DialogResult == DialogResult.Cancel) { return; } } this.pbLoading.Visible = true; dgvProduct.Rows.Clear(); lst1688OneProductListInfo.Clear(); if (cancellationTokenSource != null && cancellationTokenSource.IsCancellationRequested) cancellationTokenSource.Cancel(); cancellationTokenSource = new CancellationTokenSource(); Task.Run(() => { try { Get1688GoodsList(); } catch (Exception ex) { BaseMsgForm.ShowError(ex.Message); } Invoke(new Action(() => { this.pbLoading.Visible = false; //this.statusBar.lblTaskStatus.Text = "正在删除..."; })); }, cancellationTokenSource.Token); } void Get1688GoodsList() { List cookieList = CEFBrowser.GetCookieList(".1688.com", cefWebBrowser.GetCookieManager(null)); var shop = new ShopLoginInfo(); shop.Cookies = JsonHelper.SerializeObject(cookieList); int totalPage = 99999999; var JobjStr = JsonHelper.JObjectParse(currentGet1688ListParamData)["sceneSearchParamStr"].ParseToString(); var Jobj = JsonHelper.JObjectParse(JobjStr); pageStart = Jobj["pageIndex"].ParseToInt(); int page = pageStart; while (page < pageEnd && page < totalPage) { if (cancellationTokenSource.IsCancellationRequested) break; JobjStr = JsonHelper.JObjectParse(currentGet1688ListParamData)["sceneSearchParamStr"].ParseToString(); Jobj = JsonHelper.JObjectParse(JobjStr); page = Jobj["pageIndex"].ParseToInt(); totalPage = BaseRegex.GetIntJson(ref currentGet1688ListProductData, "totalPage"); if (page % 10 == 9) NaiBa.Util.Helper.ConfigHelper.SaveConfig("1688_product_list_" + MainForm.ProcessCount, lst1688OneProductListInfo); //Jobj["pageNum"] = page; Invoke(new Action(() => { this.statusBar.lblTaskStatus.Text = "正在采集第 " + page + " 页"; })); Thread.Sleep(Randomx.GetId(100, 200)); List<_1688OneProductListInfo> _1688Lst = new List<_1688OneProductListInfo>(); try { foreach (var jItem in JsonHelper.JObjectParse(currentGet1688ListProductData)["data"]["data"]) { _1688OneProductListInfo _1688Prod = JsonHelper.DeserializeJsonToObject<_1688OneProductListInfo>(JsonHelper.SerializeObject(jItem)); _1688Prod._1688ProductJson = JsonHelper.SerializeObject(jItem); _1688Prod.dbProduct = new KJDDBProduct(); _1688Prod.dbProduct.from_shop_id = _1688Prod.sellerId.ParseToString(); _1688Prod.dbProduct.from_shop_name = _1688Prod.memberInfo.companyName; //_1688Prod.dbProduct.offline_supplier_id = ""; //_1688Prod.dbProduct.offline_supplier_name = ""; _1688Prod.dbProduct.spu_id = _1688Prod.offerId.ParseToString(); _1688Prod.dbProduct.skc_id = ""; _1688Prod.dbProduct.price_text = _1688Prod.price.ParseToString(); //_1688Prod.dbProduct.main_cat_id = ""; //_1688Prod.dbProduct.main_cat_name = ""; //_1688Prod.dbProduct.cat_id = ""; //_1688Prod.dbProduct.cat_name = ""; //_1688Prod.dbProduct.ext_code = ""; _1688Prod.dbProduct.product_name = _1688Prod.title; _1688Prod.dbProduct.product_json = ""; _1688Prod.dbProduct.size_json = "{}"; _1688Prod.dbProduct.main_img = _1688Prod.offerPic; _1688Prod.dbProduct.sale_count = _1688Prod.saleInfo.dfSales; _1688Prod.dbProduct.sale_count_text = _1688Prod.saleInfo.blurDfSales; _1688Prod.dbProduct.product_get_type_text = "1688厂家"; _1688Lst.Add(_1688Prod); } if (_1688Lst.Count <= 0) break; //_1688Lst = _1688Lst.Where(p => !lst1688OneProductListInfo.Any(pr => pr.offerId == p.offerId)).ToList(); lst1688OneProductListInfo.AddRange(_1688Lst); } catch (Exception ex) { Invoke(new Action(() => { this.statusBar.lblTaskStatus.Text = "发生错误 " + ex.Message; })); Thread.Sleep(2000); } Invoke(new Action(() => { foreach (var prod in _1688Lst) { var id = dgvProduct.Rows.Add( true, prod.sellerId, prod.memberInfo.companyName, prod.offerId, prod.title, prod?.dbProduct?.cat_name != null ? prod?.dbProduct?.cat_name : prod?.dbProduct?.cat_id, prod.offerPic.ParseToString().Replace("https://", "http://"), DataGridViewExtension.defaultBitmap, //"", //prod.skuId, //"", //prod.color + ";" + prod.spec, prod?.dbProduct?.price_text == null ? prod?.dbProduct?.price_text : prod.price.ParseToString(), "", //prod.stock, prod.saleInfo.blurDfSales, prod.saleInfo.blurDfSales7d, prod.fullfillInfo.pickupRate48H, prod.proxyAdvice.outDistributeCnt, TemuKJD.Properties.Resources.wang_wang_icon, "删除", prod.getProductMsg ); dgvProduct.Rows[id].Height = 60; } })); var jsStr = "window.scrollTo(0, document.body.scrollHeight); " + "document.getElementsByClassName('ant-pagination-item-link')[document.getElementsByClassName('ant-pagination-item-link').length - 1].click();"; var response = cefWebBrowser.GetBrowser().MainFrame.EvaluateScriptAsync(jsStr); response.Wait(2000); Thread.Sleep(Randomx.GetId(3000, 5000)); } NaiBa.Util.Helper.ConfigHelper.SaveConfig("1688_product_list_" + MainForm.ProcessCount, lst1688OneProductListInfo); Invoke(new Action(() => { BaseMsgForm.ShowInfo("采集完成"); })); } private void btnGetDetail_Click(object sender, EventArgs e) { this.pbLoading.Visible = true; List cookieList = CEFBrowser.GetCookieList(".1688.com", cefWebBrowser.GetCookieManager(null)); var shop = new ShopLoginInfo(); shop.Cookies = JsonHelper.SerializeObject(cookieList); List rowLst = new List(); rowLst.AddRange(dgvProduct.Rows.Cast().Where(r => r.Cells["colCheck"].Value.ParseToBool() == true)); if(rowLst.Count == 0) { BaseMsgForm.ShowError("请选择要采集详情的商品"); return; } if (cancellationTokenSource != null) cancellationTokenSource.Cancel(); cancellationTokenSource = new CancellationTokenSource(); Task.Run(() => { foreach (var row in rowLst) { if (cancellationTokenSource.IsCancellationRequested) break; if (row.Index % 20 == 0) NaiBa.Util.Helper.ConfigHelper.SaveConfig("1688_product_list_" + MainForm.ProcessCount, lst1688OneProductListInfo); Invoke(new Action(() => { this.statusBar.lblTaskStatus.Text = "正在采集表格第 " + (row.Index + 1) + " 行详情数据"; })); var prodId = row.Cells["colProductId"].Value.ParseToString(); var prod = lst1688OneProductListInfo.FirstOrDefault(c => c.offerId.ParseToString() == prodId); if (chkSkip.Checked) { // 不存在或已经采集过 if (prod == null || prod?.dbProduct?.product_json?.ParseToString().Length > 10) continue; if (prod.getProductMsg == "商品已存在,跳过详情采集") continue; if (prod.getProductMsg.ParseToString().Contains("入库成功") || prod.getProductMsg.ParseToString().Contains("已存在相同id商品")) continue; bool isExist = false; var existUrl = BaseClass.BuildPDDObjString("product/get_product_spu_id_list"); string existData = UserLogin.GetSignaturex() + "&search_spu_ids=" + prod.offerId; string html = GetHtml.PostUtf8(existUrl, existData); if (string.IsNullOrEmpty(html) || !html.Contains("\"code\":200")) html = GetHtml.PostUtf8(existUrl, existData); if (string.IsNullOrEmpty(html) || !html.Contains("\"code\":200")) { prod.getProductMsg = "采集详情失败,产品数据库连接失败"; try { row.Cells["colMsg"].Value = prod.getProductMsg; } catch { } continue; } else { if (html.Contains("\"data\":[") && !html.Contains("\"data\":[]")) isExist = true; } prod.getProductMsg = "商品已存在,跳过详情采集"; if (isExist) { try { row.Cells["colMsg"].Value = prod.getProductMsg; } catch { } continue; } } Thread.Sleep(Randomx.GetId(500, 1500)); // 采集商品详情 currentDetailData = ""; //var get1688DetailRst = Get1688DetailData(shop, prod); string url = "https://detail.1688.com/offer/" + prod.offerId + ".html?fxcv=2&sk=consign"; this.cefWebBrowser.Load(url); // 额外休眠 Thread.Sleep(Math.Max(3, getDetailWait) * 1000); string get1688DetailRst = currentDetailData; //Invoke(new Action(() => { this.ucTabControlMetro1.SelectedIndex = 0; })); if (!get1688DetailRst.Contains("\"success\":true")) { if (get1688DetailRst.Contains("___tmd___") || get1688DetailRst.Contains("___TMD___")) { Invoke(new Action(() => { this.ucTabControlMetro1.SelectedIndex = 0; })); Thread.Sleep(5000); } var errMsg = BaseRegex.GetStringJson(ref get1688DetailRst, "message"); if (string.IsNullOrEmpty(errMsg)) errMsg = get1688DetailRst; prod.getProductMsg = "采集失败 " + errMsg; Invoke(new Action(() => { try { row.Cells["colMsg"].Value = prod.getProductMsg; } catch { } })); continue; } try { _1688ClientProductInfo _1688ProdDetail = new _1688ClientProductInfo(); // 视频 var videoStrs = BaseRegex.GetJsonObjStrJson(ref get1688DetailRst, "video"); _1688ProdDetail.video = JsonHelper.DeserializeJsonToObjectNullable<_1688video>(videoStrs.FirstOrDefault()); // 主图详情图 var mainImgStrs = BaseRegex.GetJsonArrStrJson(ref get1688DetailRst, "mainImage"); _1688ProdDetail.mainImage = JsonHelper.DeserializeJsonToListNullable(mainImgStrs.FirstOrDefault()); var detailImgStrs = BaseRegex.GetJsonArrStrJson(ref get1688DetailRst, "offerImgList"); _1688ProdDetail.offerImgList = JsonHelper.DeserializeJsonToListNullable(detailImgStrs.FirstOrDefault()); var skuModelRst = BaseRegex.GetJsonObjStrJson(ref get1688DetailRst, "skuModel"); _1688ProdDetail.skuModel = JsonHelper.DeserializeJsonToObjectNullable<_1688skuModel>(skuModelRst.FirstOrDefault()); var offerBaseInfoRst = BaseRegex.GetJsonObjStrJson(ref get1688DetailRst, "offerBaseInfo"); _1688ProdDetail.offerBaseInfo = JsonHelper.DeserializeJsonToObjectNullable<_1688offerBaseInfo>(offerBaseInfoRst.FirstOrDefault()); var tempModelRst = BaseRegex.GetJsonObjStrJson(ref get1688DetailRst, "tempModel"); _1688ProdDetail.tempModel = JsonHelper.DeserializeJsonToObjectNullable<_1688tempModel>(tempModelRst.FirstOrDefault()); var offerDetailRst = BaseRegex.GetJsonObjStrJson(ref get1688DetailRst, "offerDetail"); if (offerDetailRst.Count == 0) { var get1688DetailRstTmp = Regex.Unescape(get1688DetailRst); offerDetailRst = BaseRegex.GetJsonObjStrJson(ref get1688DetailRstTmp, "offerDetail"); } _1688ProdDetail.offerDetail = JsonHelper.DeserializeJsonToObjectNullable<_1688offerDetail>(offerDetailRst.FirstOrDefault()); if (_1688ProdDetail.offerDetail == null) { //var offerDomainRst = BaseRegex.GetJsonObjStrJson(ref get1688DetailRst, "offerDomain", 1); //var offerDomainStr = offerDomainRst.FirstOrDefault(); //if (offerDomainStr.Contains("\\\"")) // offerDomainStr = Regex.Unescape(offerDomainRst.FirstOrDefault()); //if (!string.IsNullOrEmpty(offerDomainStr)) //{ // _1688ProdDetail.offerDetail = new _1688offerDetail(); //} } _1688ProdDetail.postFeeValue = BaseRegex.GetDecimalJson(ref get1688DetailRst, "postFeeValue"); if (_1688ProdDetail.offerDetail == null || _1688ProdDetail.offerDetail.featureAttributes == null || _1688ProdDetail.offerDetail.featureAttributes.Count == 0 || _1688ProdDetail.mainImage == null || _1688ProdDetail.mainImage.Count == 0 || _1688ProdDetail.offerImgList == null || _1688ProdDetail.skuModel == null || _1688ProdDetail.skuModel.skuInfoMap == null || _1688ProdDetail.skuModel.skuInfoMap.Count == 0 || _1688ProdDetail.skuModel.skuProps == null || _1688ProdDetail.skuModel.skuProps.Count == 0) { prod.getProductMsg = "解析1688商品详情失败,丢失商品信息"; Invoke(new Action(() => { try { row.Cells["colMsg"].Value = prod.getProductMsg; } catch { } })); continue; } if (_1688ProdDetail.offerBaseInfo == null || _1688ProdDetail.tempModel == null) { prod.getProductMsg = "解析1688商品详情失败,丢失基础信息"; Invoke(new Action(() => { try { row.Cells["colMsg"].Value = prod.getProductMsg; } catch { } })); continue; } var prodDataJson = JsonHelper.SerializeObject(_1688ProdDetail); prod.dbProduct.cat_id = _1688ProdDetail.offerDetail.leafCategoryId.ParseToString(); // 获取属性 if (prod.dbProduct.cat_id.IsNullOrEmpty()) prod.dbProduct.cat_id = "1"; prod.dbProduct.cat_name = _1688ProdDetail.offerDetail.leafCategoryName; prod.dbProduct.main_cat_id = _1688ProdDetail.offerDetail.topCategoryId.ParseToString(); var priceMin = _1688ProdDetail.skuModel.skuInfoMap.Values.Min(x => x.discountPrice.ParseToDecimal()); if (priceMin == 0) priceMin = _1688ProdDetail.skuModel.skuInfoMap.Values.Min(x => x.price.ParseToDecimal()); var priceMax = _1688ProdDetail.skuModel.skuInfoMap.Values.Max(x => x.discountPrice.ParseToDecimal()); if (priceMax == 0) priceMax = _1688ProdDetail.skuModel.skuInfoMap.Values.Max(x => x.price.ParseToDecimal()); priceMin += _1688ProdDetail.postFeeValue == null ? 0 : _1688ProdDetail.postFeeValue.ParseToDecimal(); priceMax += _1688ProdDetail.postFeeValue == null ? 0 : _1688ProdDetail.postFeeValue.ParseToDecimal(); prod.dbProduct.price_text = priceMin + "-" + priceMax; prod.dbProduct.product_json = "{\"_1688DetailData\":" + prodDataJson + ",\"_1688ListProd\":" + prod._1688ProductJson + "}"; prod.getProductMsg = "采集成功"; MainForm.instance.Invoke(new Action(() => { row.Cells["colMsg"].Value = prod.getProductMsg; row.Cells["colCate"].Value = prod.dbProduct.cat_name.IsNullOrEmpty() ? prod.dbProduct.cat_id : prod.dbProduct.cat_name; row.Cells["colPrice"].Value = prod.dbProduct.price_text; })); } catch (Exception ex) { prod.getProductMsg = "解析1688商品详情失败 " + ex.Message; Invoke(new Action(() => { try { row.Cells["colMsg"].Value = prod.getProductMsg; } catch { } })); continue; } } NaiBa.Util.Helper.ConfigHelper.SaveConfig("1688_product_list_" + MainForm.ProcessCount, lst1688OneProductListInfo); Invoke(new Action(() => { BaseMsgForm.ShowInfo("采集完成"); this.pbLoading.Visible = false; })); }, cancellationTokenSource.Token); } 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(); Task.Run(() => { Thread.Sleep(3000); Invoke(new Action(() => { if (cancellationTokenSource == null || cancellationTokenSource.IsCancellationRequested) pbLoading.Visible = false; })); }); } private void btnSaveDb_Click(object sender, EventArgs e) { //"&product_get_type=" + HttpUtility.UrlEncode("厂商直采", Encoding.UTF8); List cookieList = CEFBrowser.GetCookieList(".scm121.com", cefWebBrowser.GetCookieManager(null)); var shop = new ShopLoginInfo(); shop.Cookies = JsonHelper.SerializeObject(cookieList); List rowLst = new List(); rowLst.AddRange(dgvProduct.Rows.Cast().Where(r => r.Cells["colCheck"].Value.ParseToBool() == true)); if (cancellationTokenSource != null && cancellationTokenSource.IsCancellationRequested) cancellationTokenSource.Cancel(); cancellationTokenSource = new CancellationTokenSource(); this.pbLoading.Visible = true; var t = Task.Run(() => { int success = 0; int total = rowLst.Count; foreach (var row in rowLst) { if (cancellationTokenSource.IsCancellationRequested) break; Invoke(new Action(() => { row.Cells["colMsg"].Value = ""; })); Invoke(new Action(() => { this.statusBar.lblTaskStatus.Text = "正在入库表格第 " + (row.Index + 1) + " 行数据 成功 " + success + " 条"; })); var prodId = row.Cells["colProductId"].Value.ParseToString(); var prod = lst1688OneProductListInfo.FirstOrDefault(c => c.offerId.ParseToString() == prodId); if (prod == null || prod.dbProduct == null || prod.dbProduct.product_json.Length < 10) continue; var dbProd = prod.dbProduct; if (!chkOverride.Checked && !prod.getProductMsg.IsNullOrEmpty()) { if (prod.getProductMsg.Contains("已存在相同Id商品") || prod.getProductMsg.Contains("商品覆盖成功") || prod.getProductMsg.Contains("商品入库成功")) { //已存在相同Id商品,跳过 //商品覆盖成功! //商品入库成功! prod.getProductMsg = "已存在相同Id商品,跳过"; Invoke(new Action(() => { row.Cells["colMsg"].Value = prod.getProductMsg; })); success++; continue; } } Thread.Sleep(25); if (row.Index % 20 == 0) NaiBa.Util.Helper.ConfigHelper.SaveConfig("1688_product_list_" + MainForm.ProcessCount, lst1688OneProductListInfo); bool isExist = false; var existUrl = BaseClass.BuildPDDObjString("product/get_product_spu_id_list"); string existData = UserLogin.GetSignaturex() + "&search_spu_ids=" + prod.offerId; string html = GetHtml.PostUtf8(existUrl, existData); if (string.IsNullOrEmpty(html) || !html.Contains("\"code\":200")) html = GetHtml.PostUtf8(existUrl, existData); if (string.IsNullOrEmpty(html) || !html.Contains("\"code\":200")) { Invoke(new Action(() => { row.Cells["colMsg"].Value = "入库失败,产品数据库连接失败"; })); continue; } else { if (html.Contains("\"data\":[") && !html.Contains("\"data\":[]")) isExist = true; } //var SetPartnerSpuRst = ""; var url = BaseClass.BuildPDDObjString("product/add_product"); if (isExist) { if (chkOverride.Checked) { url = BaseClass.BuildPDDObjString("product/mdy_product"); } else { //入库成功 已存在相同id商品 prod.getProductMsg = "已存在相同SkuId,跳过"; Invoke(new Action(() => { row.Cells["colMsg"].Value = prod.getProductMsg; })); success++; continue; } } var data = Work.UserLogin.GetSignaturex() + "&from_shop_id=" + prod.dbProduct.from_shop_id + "&from_shop_name=" + prod.dbProduct.from_shop_name + //"&offline_supplier_id=" + prod.dbProduct.offline_supplier_id + //"&offline_supplier_name=" + prod.dbProduct.offline_supplier_name + "&spu_id=" + prod.dbProduct.spu_id.ParseToString() + "&skc_id=" + prod.dbProduct.skc_id.ParseToString() + "&price_text=" + prod.dbProduct.price_text + "&ext_code=" + HttpUtility.UrlEncode(prod.dbProduct.ext_code, Encoding.UTF8) + "&product_name=" + HttpUtility.UrlEncode(prod.dbProduct.product_name, Encoding.UTF8) + "&product_json=" + HttpUtility.UrlEncode(dbProd.product_json, Encoding.UTF8) + "&size_json=" + HttpUtility.UrlEncode(dbProd.size_json, Encoding.UTF8) + "&sale_count=" + dbProd.sale_count + "&sale_count_text=" + HttpUtility.UrlEncode(dbProd.sale_count_text, Encoding.UTF8) + "&main_img=" + HttpUtility.UrlEncode(dbProd.main_img, Encoding.UTF8) + "&wx_safe_status=" + HttpUtility.UrlEncode("未校验", Encoding.UTF8) + "&product_get_type=" + HttpUtility.UrlEncode("1688厂家", Encoding.UTF8); if (!isExist) { data += "&main_cat_id=" + prod.dbProduct.main_cat_id + "&main_cat_name=" + HttpUtility.UrlEncode(prod.dbProduct.main_cat_name.ParseToString(), Encoding.UTF8) + "&cat_id=" + prod.dbProduct.cat_id + "&cat_name=" + HttpUtility.UrlEncode((prod.dbProduct.cat_name ?? prod.dbProduct.cat_name).ParseToString(), Encoding.UTF8); } if (1 == 1) { //1688没有分销,但是聚水潭上货条件要判断1是否类目识别 2是否服务端加密 3是否分销 //作为1688和聚水潭一致的上货必备条件,此处1688分销直接设置为1 prod.dbProduct.distribution_set = 1; data += "&distribution_set=1"; } html = GetHtml.PostUtf8(url, data); if (string.IsNullOrEmpty(html) || !html.Contains("\"code\":200")) html = GetHtml.PostUtf8(url, data); if (string.IsNullOrEmpty(html) || !html.Contains("\"code\":200")) { string msg = "商品入库失败!请检查网络连接:" + BaseRegex.GetStringJson(ref html, "msg"); Invoke(new Action(() => { row.Cells["colMsg"].Value = msg; })); } else { success++; prod.getProductMsg = "商品入库成功!"; if (url == BaseClass.BuildPDDObjString("product/mdy_product")) prod.getProductMsg = "商品覆盖成功!"; Invoke(new Action(() => { row.Cells["colMsg"].Value = prod.getProductMsg; })); } } NaiBa.Util.Helper.ConfigHelper.SaveConfig("1688_product_list_" + MainForm.ProcessCount, lst1688OneProductListInfo); Invoke(new Action(() => { this.pbLoading.Visible = false; BaseMsgForm.ShowInfo("商品入库完毕!"); })); }, cancellationTokenSource.Token); } public string GetGoodsLst(ShopLoginInfo shop, JObject searchDataObj) { string url = "https://sc.scm121.com/api/goods/buyer/supplier/goods/list"; string referer = "https://sc.scm121.com/manage/goods/qualitySupplier/detail/" + searchDataObj["supplierId"] + "?showErpList=1"; var lstRst = JSTHttpResponseBLL.JSTPostResponse(shop, url, JsonHelper.SerializeObject(searchDataObj), referer, appVersion); for (int i = 0; i < 3 && !lstRst.Contains("\"success\":true"); i++) { Thread.Sleep(Randomx.GetId(1000, 2000)); lstRst = JSTHttpResponseBLL.JSTPostResponse(shop, url, JsonHelper.SerializeObject(searchDataObj), referer, appVersion); } return lstRst; } public string GetProdLst(ShopLoginInfo shop, JObject searchDataObj, string supplierId) { string url = "https://sc.scm121.com/api/goods/buyer/supplier/goods/skuList"; string referer = "https://sc.scm121.com/manage/goods/qualitySupplier/detail/" + supplierId + "?showErpList=1"; var lstRst = JSTHttpResponseBLL.JSTPostResponse(shop, url, JsonHelper.SerializeObject(searchDataObj), referer, appVersion); for (int i = 0; i < 3 && !lstRst.Contains("\"success\":true"); i++) { Thread.Sleep(Randomx.GetId(1000, 2000)); lstRst = JSTHttpResponseBLL.JSTPostResponse(shop, url, JsonHelper.SerializeObject(searchDataObj), referer, appVersion); } return lstRst; } public string GetSkuPriceLst(ShopLoginInfo shop, JObject searchDataObj, string supplierId) { string url = "https://sc.scm121.com/api/goods/buyer/supplier/asyncQuerySkuAdditional"; string referer = "https://sc.scm121.com/manage/goods/qualitySupplier/detail/" + supplierId + "?showErpList=1"; var lstRst = JSTHttpResponseBLL.JSTPostResponse(shop, url, JsonHelper.SerializeObject(searchDataObj), referer, appVersion); for (int i = 0; i < 3 && !lstRst.Contains("\"success\":true"); i++) { Thread.Sleep(Randomx.GetId(1000, 2000)); lstRst = JSTHttpResponseBLL.JSTPostResponse(shop, url, JsonHelper.SerializeObject(searchDataObj), referer, appVersion); } return lstRst; } public string GetHotLst(ShopLoginInfo shop, JObject searchDataObj) { string url = "https://sc.ttdahuo.com/api/goods/freshman/mall/goods/list"; string referer = "https://sc.ttdahuo.com/findCooperation/newlywedZone"; var lstRst = JSTHttpResponseBLL.JSTPostResponse(shop, url, JsonHelper.SerializeObject(searchDataObj), referer, appVersion); for (int i = 0; i < 3 && !lstRst.Contains("\"success\":true"); i++) { Thread.Sleep(Randomx.GetId(1000, 2000)); lstRst = JSTHttpResponseBLL.JSTPostResponse(shop, url, JsonHelper.SerializeObject(searchDataObj), referer, appVersion); } return lstRst; } public string Get1688DetailData(ShopLoginInfo shop, _1688OneProductListInfo _1688prod) { //string url = "https://detail.1688.com/offer/1024976470101.html?spm=a21vf6.result.0.0.30b812ff1rz1M0&fxcv=2&sk=consign"; string url = "https://detail.1688.com/offer/" + _1688prod.offerId + ".html?fxcv=2&sk=consign"; this.cefWebBrowser.Load(url); //url = "https://detail.1688.com/offer/" + _1688prod.offerId + ".html?spm=a21vf6.result.0.0.30b812fftV88TJ&fxcv=2&sk=consign"; string referer = ""; var getDetailRst = _1688HttpResponseBLL._1688GetResponse(shop, url, referer, appVersion); for (int i = 0; i< 3 && !getDetailRst.Contains("\"success\":true"); i++) { Thread.Sleep(Randomx.GetId(1000, 2000)); getDetailRst = _1688HttpResponseBLL._1688GetResponse(shop, url, referer, appVersion); } return getDetailRst; } private void btnSearchTitle_Click(object sender, EventArgs e) { pbLoading.Visible = true; Task.Run(() => { 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 btnCancelSelect_Click(object sender, EventArgs e) { Task.Run(() => { foreach(DataGridViewRow row in dgvProduct.Rows) { if (row.Cells["colMsg"].Value.ParseToString().Contains("入库成功") || row.Cells["colMsg"].Value.ParseToString().Contains("已存在相同id商品")) { Invoke(new Action(() => { row.Cells["colcheck"].Value = false; })); } } }); } private void txtWaitSeconds_TextChanged(object sender, EventArgs e) { getDetailWait = txtWaitSeconds.Text.ParseToInt(); } private void btnExportCookie_Click(object sender, EventArgs e) { List cookieList = CEFBrowser.GetCookieList(".scm121.com", cefWebBrowser.GetCookieManager(null)); var shop = new ShopLoginInfo(); shop.Cookies = JsonHelper.SerializeObject(cookieList); List cooks = null; try { cooks = JsonHelper.DeserializeJsonToList(shop.Cookies); } catch (Exception ex) { } if (cooks == null) cooks = new List(); string cookJs = ""; var keys = new string[] { "acw_tc", "DISTRYBUTION_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=.scm121.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='https://sc.scm121.com/suppliersManage/suppliersList/onlineSuppliers'; }, 200)"; Clipboard.SetDataObject(cookJs); BaseMsgForm.ShowInfo("复制成功"); } private void btnStop_Click(object sender, EventArgs e) { if (CancelReturn != null) CancelReturn.Cancel(); } } }