using AllBase; using AllBase.Helper; using AllBase.Model.Result; using CefSharp; using CefSharp.WinForms; //using TemuKJD.DashBoardForms; using TemuKJD.Helper; using TemuKJD.KJDForms.BaseForms; using Microsoft.Win32; using NaiBa.CefHelper; using NaiBa.CefHelper.Handler; 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.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; //using System.Web.Hosting; using System.Windows.Forms; using Work; using Work.BLL.Tools; namespace TemuKJD.PDDForms.ShopForms { public enum EnumOpenType { login, manage, } public partial class PDDShopLoginForm : LRBaseForm { public static PDDShopLoginForm shopLoginInstance { get; set; } = null; public int CloseAfterSecond { get; set; } public EnumOpenType openType = EnumOpenType.manage; public bool isMultiLogin = false; public string MultiLoginCookieName = ""; public string InitUrl = ""; private string shopCookieHead = "pinduoduo.com"; private string shopCookieHead2 = "temu.com"; private string shopLoginUrl = "https://mms.pinduoduo.com/login"; private string shopMainUrl = "https://mms.pinduoduo.com/home"; private ChromiumWebBrowser cefWebBrowser = null; private ShopLoginInfo shop = null; private List lstShopCompany = new List(); private string currentUrl = ""; private long currentSupplierId = 0; public PDDShopLoginForm(ShopLoginInfo shopInfo) { if (shopLoginInstance != null && !shopLoginInstance.IsDisposed) { shopLoginInstance.Dispose(); } shopLoginInstance = this; InitializeComponent(); this.shop = shopInfo; this.txtUserName.Text = shopInfo.LoginName; this.txtPassWord.Text = DataOpenSSL.DecryptString(shopInfo.Password); } private void ShopLoginForm_Load(object sender, EventArgs e) { //this.splitContainer1.SplitterDistance = 674; if (openType == EnumOpenType.login) { //this.shop.ShopId = ""; //this.shop.ShopAccount = ""; } if (isMultiLogin && shop != null) { this.pnlMultiLogin.Visible = true; InitMultiLoginCookies(); } if (CloseAfterSecond > 0) { Task.Run(() => { Thread.Sleep(1000 * CloseAfterSecond); if (this.Created) { Invoke(new Action(() => { this.Close(); })); } }); } if (!isMultiLogin) AutoLogin(); CheckAndSaveShop(); //判断登录是否成功,成功则保存店铺信息和店铺cookie //ClosePopWindow(); //自动关闭弹窗 } /// /// 判断登录,保存店铺 /// private void CheckAndSaveShop() { Task.Run(() => { // 自动判断是否登录成功,登录成功后记录cookie保存到服务端。 while (this.Created) { Thread.Sleep(3000); //continue; if (!this.Created) break; if (this.shop != null && currentUrl.TrimEnd('/') == shopMainUrl) { if (!cefWebBrowser.GetBrowser().MainFrame.IsValid) continue; if (openType!= EnumOpenType.login) continue; if (!lstShopCompany.Any(c => c.LoginName == shop.LoginName)) continue; string cookies = ""; List cookieList = CEFBrowser.GetCookieList(shopCookieHead, cefWebBrowser.GetCookieManager(null)); if (cookieList != null && cookieList.Count > 0) { foreach (var cookie in cookieList) { //SUB_PASS_ID同时出现两个,domain是seller.kuajingmaihuo.com才是能登录店铺后台的 if (cookie.Name == "PASS_ID" && cookie.Domain != "mms.pinduoduo.com" && cookieList.Any(c=>c.Name== "PASS_ID" && c.Domain == "mms.pinduoduo.com")) continue; cookies += cookie.Name + "=" + cookie.Value + "; "; } cookies = cookies.Trim().TrimEnd(';'); } if (!string.IsNullOrEmpty(cookies) && lstShopCompany.Any(c => c.LoginName == shop.LoginName)) { var lstShopCompanyCopy = lstShopCompany.ToList(); lstShopCompanyCopy = lstShopCompanyCopy.Where(l => l.LoginName == shop.LoginName).ToList(); foreach (ShopCompany sc in lstShopCompanyCopy) { ShopLoginInfo newShop = new ShopLoginInfo() { LoginName = shop.LoginName, Password = shop.Password, GroupName = shop.GroupName, ShopAccount = sc.AccountName, ShopId = sc.AccountId, SubUserName = shop.SubUserName, Notes = shop.Notes, }; var oldShop = GlobalConfig.ShopLoginList.FirstOrDefault(l => l.LoginName == newShop.LoginName); if (oldShop == null) { GlobalConfig.ShopLoginList.Add(newShop); PDDShopListForm.AddServerDouShop(newShop); // 店铺写入到服务端 } else { oldShop.LoginName = newShop.LoginName; oldShop.Password = newShop.Password; oldShop.GroupName = newShop.GroupName; oldShop.ShopAccount = newShop.ShopAccount; oldShop.ShopId = newShop.ShopId; oldShop.SubUserName = newShop.SubUserName; oldShop.Notes = newShop.Notes; } } var lstShop = GlobalConfig.ShopLoginList.Where(l => l.LoginName == shop.LoginName).ToList(); foreach(var s in lstShop) { s.LoginStatus = "登录成功"; s.Cookies = cookies; s.LastRefreshDate = DateTime.Now.ToString("yyyyMMdd"); } StartUp.SaveLocalShopLoginInfo(); // 店铺保存到本地 PDDShopListForm.UpdateServerShopCookies(shop); // 店铺cookie写入服务端,多店共用一个登录账号一组cookie OnSaveComplete(shop); if (this.Created && this.chkCloseAfterLogin.Checked) { Invoke(new Action(() => { this.Close(); })); } else break; } } } }); } /// /// 自动关闭弹窗 /// private void ClosePopWindow() { // 关闭弹窗 Task.Run(() => { var sleepTime = 2500; int i = 0; while (true && i++ < 50) { try { Thread.Sleep(sleepTime); var jsStr1 = "function ClosePopWindow(txt) {\r\n" + " var result = 'no_pop'\r\n" + " var item = document.getElementsByClassName(txt);\r\n" + " for(i = 0; i < item.length; i++) {\r\n" + " item[i].click();\r\n" + " result = 'success'\r\n" + " }\r\n" + " return result;\r\n" + "}\r\n" + "ClosePopWindow('anticon-close-circle');\r\n" + "ClosePopWindow('ant-modal-close-x');\r\n"; var jsStr2 = "function clickPopWindow(txt) {\r\n" + "var child = document.body.firstElementChild;\r\n" + "var element1 = null;\r\n" + " while (child) {\r\n" + " if (child.innerHTML.indexOf(txt) >= 0) {\r\n" + " element1 = child;\r\n" + " if (child.firstElementChild) {\r\n" + " child = child.firstElementChild; continue;\r\n" + " } else break;\r\n" + " }\r\n" + " child = child.nextElementSibling;\r\n" + " }\r\n" + " if (element1) {\r\n" + " element1.click(); return 'success';\r\n" + " } else return 'no_pop';\r\n" + "}\r\n" + "clickPopWindow('我知道了');\r\n" + "clickPopWindow('知道了');\r\n"; if (cefWebBrowser != null && cefWebBrowser.IsBrowserInitialized) { var t1 = cefWebBrowser.GetMainFrame().EvaluateScriptAsync(jsStr1); t1.Wait(); var t2 = cefWebBrowser.GetMainFrame().EvaluateScriptAsync(jsStr2); t2.Wait(); if (t1.Result?.Result?.ToString() == "success" || t2.Result?.Result?.ToString() == "success") sleepTime = Randomx.GetId(550, 650); else sleepTime = Randomx.GetId(1500, 2000); } } catch (Exception ex) { } } }); } /// /// 自动登录店铺后台 /// private void AutoLogin() { if (shop == null) return; if (cefWebBrowser == null) { //cefWebBrowser = CEFBrowser.CreateChromiumWebBrowser("about:blank", false); if (!string.IsNullOrEmpty(InitUrl)) //temu国际版不支持无痕模式多开,此处改为true,每次创建cefwebbrowser时删除cookie cefWebBrowser = CEFBrowser.CreateChromiumWebBrowser(InitUrl, true); else cefWebBrowser = CEFBrowser.CreateChromiumWebBrowser(shopMainUrl, true); CustomResourceRequestHandlerLocal resourceRequestHandler = new CustomResourceRequestHandlerLocal(); resourceRequestHandler.ResourceLoadCompleteEvent += RequestHandler_ResourceLoadComplete; 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; //js绑定C#对象 ShopBrowserObject shopObj = new ShopBrowserObject(); shopObj.OnInfoReceived += ShopObj_OnInfoReceived; CefSharpSettings.WcfEnabled = true; cefWebBrowser.JavascriptObjectRepository.Register( name: "shopObj", objectToBind: shopObj, isAsync: false, options: new BindingOptions { Binder = BindingOptions.DefaultBinder.Binder /*CamelCaseJavascriptNames = false*/ /*cef79*/ } ); if (shop.Cookies == null) shop.Cookies = ""; if (shop.Cookies2 == null) shop.Cookies2 = ""; var cookie = shop.Cookies; if (isMultiLogin) cookie = shop.DictMultiCookies.Keys.Contains(MultiLoginCookieName) ? shop.DictMultiCookies[MultiLoginCookieName] : ""; Task.Run(() => { Invoke(new Action(() => { splitContainer1.Panel1.Controls.Add(cefWebBrowser); //cefWebBrowser.Load(shopMainUrl); })); // cef138必须init后方可设置或删除cookie while (!cefWebBrowser.IsBrowserInitialized || !cefWebBrowser.GetBrowser().MainFrame.IsValid) Thread.Sleep(20); CEFBrowser.DeleteCookie(cefWebBrowser.GetCookieManager(null)); //cef 138 如果没有设置RequestContext 可能为空,直接getCookieManager var t = CEFBrowser.SetCookieAsync(shopCookieHead, cookie, cefWebBrowser.GetCookieManager(null)); t.Wait(5000); if (this.openType != EnumOpenType.login) { //var cookie2 = shop.Cookies2; //var t2 = CEFBrowser.SetCookieAsync(shopCookieHead2, cookie2, cefWebBrowser.GetCookieManager(null)); //t2.Wait(5000); } //根据登录的具体店铺设置local storage if (!string.IsNullOrEmpty(shop.ShopId)) { //var storageJsCode = "window.localStorage.setItem('" + "mall-info-id" + "', '" + shop.ShopId + "');\r\n"; //storageJsCode += "window.localStorage.setItem('" + "agentseller-mall-info-id" + "', '" + shop.ShopId + "');\r\n"; //while (!cefWebBrowser.IsBrowserInitialized || !cefWebBrowser.GetBrowser().MainFrame.IsValid) // Thread.Sleep(20); //cefWebBrowser.GetBrowser().MainFrame.ExecuteJavaScriptAsync(storageJsCode); } if (!string.IsNullOrEmpty(InitUrl)) cefWebBrowser.Load(InitUrl); //不是登录的话就此返回 if (openType != EnumOpenType.login) { Invoke(new Action(() => { chkCloseAfterLogin.Visible = false; btnLoginAgain.Visible = false; })); return; } for (int i = 0; i < 50; i++) { if (cefWebBrowser.IsLoading) Thread.Sleep(100); } Thread.Sleep(Randomx.GetId(1500,2000)); //设置 local storage //if (GlobalConfig.dicLocalStorage != null) //{ // Thread.Sleep(500); // string jsCode = "function setStorage() {"; // foreach (var item in GlobalConfig.dicLocalStorage) // { // if (item.Key == "$TCC_CONFIG" || item.Key == "$TCC_CONFIG_operate_config" || item.Key == "menuStyleStr") // continue; // jsCode += "window.localStorage.setItem('" + item.Key + "', '" + item.Value + "');\r\n"; // } // jsCode += "}"; // jsCode += "setStorage();"; // if (cefWebBrowser.GetBrowser().MainFrame.IsValid) // cefWebBrowser.GetBrowser().MainFrame.ExecuteJavaScriptAsync(jsCode); //} if (!this.Created) return; InputUserNameAndPassword(cefWebBrowser, shop.LoginName, DataOpenSSL.DecryptString(shop.Password)); }); } } private void ShopObj_OnInfoReceived(string information) { //BaseMsgForm.ShowInfo(information); if (!string.IsNullOrEmpty(information)) cefWebBrowser.GetBrowser().MainFrame.EvaluateScriptAsync("alert('" + information + "');"); } private void CefWebBrowser_LoadError(object sender, CefSharp.LoadErrorEventArgs e) { } private void CefWebBrowser_AddressChanged(object sender, CefSharp.AddressChangedEventArgs e) { if (this.Created) Invoke(new Action(() => { currentUrl = e.Address; txtAddress.Text = e.Address; })); } private void CefWebBrowser_FrameLoadEnd(object sender, CefSharp.FrameLoadEndEventArgs e) { //if (!cefWebBrowser.IsBrowserInitialized) return; //currentUrl = e.Url; //if (currentUrl.StartsWith("https://fxg.jinritemai.com/ffa/multiShop")) //{ // Thread.Sleep(Randomx.GetId(500, 800)); //} //if (currentUrl.StartsWith("https://fxg.jinritemai.com/ffa/mshop/homepage/index")) //{ // Task.Run(() => // { // // }); //} //js绑定C#对象 html页面内声明绑定的C#对象 StringBuilder sb = new StringBuilder(); sb.Append("(function(){"); sb.Append("CefSharp.BindObjectAsync('shopObj');"); sb.Append("})();"); cefWebBrowser.GetBrowser().MainFrame.EvaluateScriptAsync(sb.ToString()); } private void RequestHandler_ResourceLoadComplete(object sender, string url, string postData, string responseData, IRequest request) { Task.Run(() => { var data = responseData; var uri = url; if (data.Contains("球球小小")) { } if (data.Contains("supplierId") && data.Contains("\"success\":true")) { var supplierIds = BaseRegex.GetMatchRegex(ref data, "\"supplierId\":\\d{5,20}"); if (supplierIds.Count > 0 && supplierIds[0].Groups.Count > 0) { var supplierId = supplierIds[0].Groups[0].Value.Replace("\"supplierId\":", "").ParseToLong(); if (supplierId > 0) this.currentSupplierId = supplierId; } } }); if (url.StartsWith("https://seller.kuajingmaihuo.com/settle/site-main")) { cefWebBrowser.Load(shopMainUrl); } //if (url == shopMainUrl) if (url == "https://mms.pinduoduo.com/janus/api/userinfo") { Task.Run(() => { var data = responseData; if (this.shop != null && data.Contains("\"success\":true")) { var maskMobile = BaseRegex.GetStringJson(ref data, "mobile"); maskMobile = maskMobile.Split('*').Last(); if (shop.LoginName.EndsWith(maskMobile)) { lstShopCompany.Clear(); var jObj = JObject.Parse(data); var jArr = jObj["result"] as JArray; if (jArr == null) jArr = new JArray(); Thread.Sleep(500); //foreach (var productObj in jArr) //{ // var prod = JsonHelper.SerializeObject(productObj); // ShopCompany sc = new ShopCompany() // { // AccountId = BaseRegex.GetStringJson(ref prod, "mallId"), // AccountName = BaseRegex.GetStringJson(ref prod, "mallName"), // LoginName = shop.LoginName, // UserName = BaseClass.UserName, // LoginStatus = "登录成功", // }; // this.lstShopCompany.Add(sc); //} ShopCompany sc = new ShopCompany() { //AccountId = BaseRegex.GetStringJson(ref data, "mallId"), AccountId = BaseRegex.GetStringJson(ref data, "username"), AccountName = BaseRegex.GetStringJson(ref data, "mall_name"), LoginName = shop.LoginName, UserName = BaseClass.UserName, LoginStatus = "登录成功", }; this.lstShopCompany.Add(sc); } } }); } //if (url.Contains("_signature")) //{ // var re = request; // if ((re.Headers != null && re.Headers.AllKeys.Contains("x-secsdk-csrf-token"))) // { // } // Task.Run(() => // { // var _url = url; // var data = responseData; // var signature = url.Substring(url.IndexOf("_signature=") + "_signature=".Length).Split('&')[0]; // if (shop != null) // { // shop.Signature = signature; // } // if (url.Contains("x-secsdk-csrf-token") || postData.Contains("x-secsdk-csrf-token") || data.Contains("x-secsdk-csrf-token")) // { // } // }); //} // 库存上传按钮 if (currentUrl.StartsWith("https://seller.kuajingmaihuo.com/goods/product/list") || currentUrl.StartsWith("https://agentseller.temu.com/goods/list")) { Task.Run(() => { string sAddInputJs = @" document.addEventListener('wheel', function(event) { // 检查滚动方向 //if (event.deltaY < 0) { // console.log('向上滚动'); //} else { // console.log('向下滚动'); //} // 或者使用 event.deltaX 来检查水平滚动 //if (event.deltaX < 0) { // console.log('向左滚动'); //} else if (event.deltaX > 0) { // console.log('向右滚动'); //} // 阻止默认的滚动行为(如果有需要) //event.preventDefault(); addGetProdButton(); }); addGetProdButton(); function addGetProdButton() { var productLst = document.getElementsByClassName('product-info_idContent__iDukx'); for(i=0; i= 0) { var sSpuId = productLst[i].innerText.replace('\r','').replace('\n','').replace('SPU ID:', ''); productLst[i].innerHTML = productLst[i].innerHTML.replace("">"", "">""); } } }"; cefWebBrowser.GetBrowser().MainFrame.EvaluateScriptAsync(sAddInputJs); }); } } /// /// 自动登录 /// /// /// /// private void InputUserNameAndPassword(ChromiumWebBrowser webBrowser, string _account, string _password) { webBrowser.GetBrowser().MainFrame.EvaluateScriptAsync(sGetElementWithText); var jsStr0 = "var clickBox1 = getElementWithText('账号登录'); clickBox1.click()"; var response0 = webBrowser.GetBrowser().MainFrame.EvaluateScriptAsync(jsStr0); response0.Wait(1000); Thread.Sleep(Randomx.GetId(500, 1000)); string jsStr1 = "function getInputItem () {var usernameId = document.getElementById('usernameId'); if (usernameId) return 'true';} getInputItem();"; Task response1 = null; while (response1?.Result?.Result == null || !response1.Result.Result.ParseToString().Contains("true")) { Thread.Sleep(250); if (!this.Created) return; response1 = webBrowser.GetBrowser().MainFrame.EvaluateScriptAsync(jsStr1); response1.Wait(5000); if (!this.Created) return; } webBrowser.GetBrowser().MainFrame.EvaluateScriptAsync(sInputValueChange2); jsStr1 = "var usernameId = document.getElementById('usernameId'); " + "changeReactInputValue(usernameId,'" + _account + "');"; response1 = webBrowser.GetBrowser().MainFrame.EvaluateScriptAsync(jsStr1); response1.Wait(1000); Thread.Sleep(Randomx.GetId(500, 1000)); string jsStr = "var passwordId = document.getElementById('passwordId'); "+ "changeReactInputValue(passwordId,'" + _password + "');"; var response = webBrowser.GetBrowser().MainFrame.EvaluateScriptAsync(jsStr); response.Wait(1000); Thread.Sleep(Randomx.GetId(500, 1000)); jsStr = "var clickBox = getElementWithText('我已阅读并同意'); " + "clickBox.click()"; response = webBrowser.GetBrowser().MainFrame.EvaluateScriptAsync(jsStr); response.Wait(1000); Thread.Sleep(Randomx.GetId(500, 1000)); jsStr = "var clickBox = getElementWithText('登录'); " + "clickBox.click()"; response = webBrowser.GetBrowser().MainFrame.EvaluateScriptAsync(jsStr); response.Wait(1000); Thread.Sleep(Randomx.GetId(500, 1000)); return; //下面代码原抖音使用,废弃 #region 输入用js string jsSetValue = @" function keyboardInput(dom, st) { var evt = new InputEvent('input', { //var evt = new Event('input', { // cef57 inputType: 'insertText', data: st, dataTransfer: null, isComposing: false }); dom.value = st; dom.dispatchEvent(evt); dom.focus(); };"; string jsInputKey = @" function fireKeyEvent(el, evtType, keyCode) { var evtObj; if (document.createEvent) { if (window.KeyEvent) { //firefox 浏览器下模拟事件 evtObj = document.createEvent('KeyEvents'); evtObj.initKeyEvent(evtType, true, true, window, true, false, false, false, keyCode, 0); } else { //chrome 浏览器下模拟事件 evtObj = document.createEvent('UIEvents'); evtObj.initUIEvent(evtType, true, true, window, 1); delete evtObj.keyCode; if (typeof evtObj.keyCode === 'undefined') { //为了模拟keycode Object.defineProperty(evtObj, 'keyCode', { value: keyCode }); } else { evtObj.key = String.fromCharCode(keyCode); } if (typeof evtObj.ctrlKey === 'undefined') { //为了模拟ctrl键 Object.defineProperty(evtObj, 'ctrlKey', { value: true }); } else { evtObj.ctrlKey = true; } } el.dispatchEvent(evtObj); } else if (document.createEventObject) { //IE 浏览器下模拟事件 evtObj = document.createEventObject(); evtObj.keyCode = keyCode el.fireEvent('on' + evtType, evtObj); } }"; #endregion #region 输入用户名 jsStr = @"var txt1 = document.getElementsByName('email')[0]; txt1.focus(); txt1.click(); keyboardInput(txt1, '" + _account + "');" + "var uname = '" + _account + "';" + "for(var i = 0; i < uname.length; i++) {" + " cCode = uname.charCodeAt(i);" + " fireKeyEvent(txt1, 'keydown', cCode);" + " fireKeyEvent(txt1, 'keypress', cCode);" + " fireKeyEvent(txt1, 'keyup', cCode);" + "}"; response = webBrowser.GetBrowser().MainFrame.EvaluateScriptAsync(jsSetValue + jsInputKey + jsStr); response.Wait(2000); Thread.Sleep(Randomx.GetId(400, 800)); #endregion #region 输入密码 jsStr = @"var txt2 = document.getElementsByName('password')[0]; txt2.focus(); txt2.click(); keyboardInput(txt2, '" + _password + "');" + "var pwd = '" + _password + "';" + "for(var i = 0; i < pwd.length; i++) {" + " cCode = pwd.charCodeAt(i);" + " fireKeyEvent(txt2, 'keydown', cCode);" + " fireKeyEvent(txt2, 'keypress', cCode);" + " fireKeyEvent(txt2, 'keyup', cCode);" + "}"; response = webBrowser.GetBrowser().MainFrame.EvaluateScriptAsync(jsInputKey + jsStr); response.Wait(2000); Thread.Sleep(Randomx.GetId(400, 800)); #endregion #region 点击登录按钮 jsStr = "var btn = document.getElementsByClassName('account-center-action-button')[0]; btn.click(); //btn.dispatchEvent(new Event('change'));"; response = webBrowser.GetBrowser().MainFrame.EvaluateScriptAsync(jsStr); response.Wait(2000); Thread.Sleep(1500 + Randomx.GetId(1000)); #endregion #region 获取验证码 int getImageCount = 0; getImageAgain: if (!this.Created) return; jsStr = "function getImg() { return document.getElementsByClassName('captcha_verify_img--wrapper')[0].innerHTML; }"; jsStr += "getImg();"; response = webBrowser.GetBrowser().MainFrame.EvaluateScriptAsync(jsStr); response.Wait(2000); if (response.Result?.Result == null) { if (getImageCount < 50) { Thread.Sleep(2500); getImageCount++; goto getImageAgain; } } if (response.Result?.Result != null) { var imgStr = response.Result.Result.ToString(); var src = BaseRegex.GetMatchRegexString(ref imgStr, "src=\"([\\s\\S]*?)\""); Bitmap bt = (Bitmap)GetHtml.LoadImage(src); if (bt != null) { int Stopxt = 0; int dragButtonWidth = 53; //Stopxt = new Base64ChangeImgUrl().CalculateNick(bt, dragButtonWidth); Thread.Sleep(500 + Randomx.GetId(1000)); Stopxt = new Base64ChangeImgUrl().CalculateNickNew(bt, dragButtonWidth); if (Stopxt > 0) { jsStr = "function getImgPos() { return document.getElementsByClassName('secsdk-captcha-drag-icon')[0].getBoundingClientRect().left + '|' " + " + document.getElementsByClassName('secsdk-captcha-drag-icon')[0].getBoundingClientRect().top;} getImgPos();"; response = webBrowser.GetBrowser().MainFrame.EvaluateScriptAsync(jsStr); response.Wait(2000); if (response.Result?.Result != null) { var xy = response.Result?.Result.ToString(); var xyArr = xy.Split('|'); if (xyArr.Length == 2) { try { int x = (int)Convert.ToDecimal(xyArr[0]) + 25; int y = (int)Convert.ToDecimal(xyArr[1]) + 25; // 自动滑块图形验证 if (GlobalConfig.DouShopSettingParam.IsAutoDragLogin) { PDDShopLoginForm.CefMouseDragDou(cefWebBrowser, x, y, Convert.ToInt32((x + Stopxt * 340m / 552m) - 15), y); for (int i = 0; i < 1; i++) Thread.Sleep(2000 + Randomx.GetId(1000)); response = webBrowser.GetBrowser().MainFrame.EvaluateScriptAsync(jsStr); response.Wait(2000); if (response.Result?.Result != null && getImageCount < 50) { getImageCount++; goto getImageAgain; } } } catch { } } } for (int i = 0; i < 1; i++) Thread.Sleep(2000 + Randomx.GetId(1000)); } } } Thread.Sleep(1500 + Randomx.GetId(1000)); #endregion } // 鼠标左键按下,移动,移动...左键抬起。 public static void CefMouseDragDou(ChromiumWebBrowser webBrowser, int x1, int y1, int x2, int y2) { Thread.Sleep(100); var host = webBrowser.GetBrowser().GetHost(); var rx = -6 + Randomx.GetId(13); x2 = x2 + rx; // 随机按下点的位置(正负6像素),提高仿真性 int x = x1 + rx; int y = y1 - 6 + Randomx.GetId(13); // 按下鼠标左键 host.SendMouseClickEvent(x, y, MouseButtonType.Left, false, 1, CefEventFlags.None); Thread.Sleep(100 + Randomx.GetId(300)); // 滑动光标 int times = -20; while (x < x2 + 4 - Randomx.GetId(9)) { times++; x += (15 + Randomx.GetId(15)) / 8; if (times % 5 == 0) y = y - 1 + Randomx.GetId(3); Thread.Sleep(6 + Math.Abs(times) / 5 + Randomx.GetId(16)); host.SendMouseMoveEvent((int)x, (int)y, false, CefEventFlags.LeftMouseButton); } if (x < x2 - 1) while (x < x2) { times++; x += (8 + Randomx.GetId(8)) / 8; if (times % 5 == 0) y = y - 1 + Randomx.GetId(3); Thread.Sleep(6 + Math.Abs(times) / 5 + Randomx.GetId(16)); host.SendMouseMoveEvent((int)x, (int)y, false, CefEventFlags.LeftMouseButton); } else if (x > x2 + 1) while (x > x2) { times++; x -= (8 + Randomx.GetId(8)) / 8; if (times % 5 == 0) y = y - 1 + Randomx.GetId(3); Thread.Sleep(6 + Math.Abs(times) / 5 + Randomx.GetId(16)); host.SendMouseMoveEvent((int)x, (int)y, false, CefEventFlags.LeftMouseButton); } // 如果最后位置偏差较多,再做一次调整 x = x2 - 1 + Randomx.GetId(3); x = x2; Thread.Sleep(18 + Math.Abs(times) / 5 + Randomx.GetId(16)); Thread.Sleep(18 + Math.Abs(times) / 5 + Randomx.GetId(16)); host.SendMouseMoveEvent((int)x, (int)y, false, CefEventFlags.LeftMouseButton); // 抬起鼠标左键 Thread.Sleep(300 + Randomx.GetId(500)); host.SendMouseClickEvent(x, y, MouseButtonType.Left, true, 1, CefEventFlags.None); host.SendMouseClickEvent(x, y, MouseButtonType.Left, true, 1, CefEventFlags.None); } private void btnStop_Click(object sender, EventArgs e) { } private void btnCopyUserName_Click(object sender, EventArgs e) { if (!string.IsNullOrEmpty(txtUserName.Text)) Clipboard.SetDataObject(txtUserName.Text); } private void btnCopyPassword_Click(object sender, EventArgs e) { if (!string.IsNullOrEmpty(txtPassWord.Text)) Clipboard.SetDataObject(txtPassWord.Text); } private void btnReload_Click(object sender, EventArgs e) { if (cefWebBrowser != null) { if (txtAddress.Text != "about:blank") cefWebBrowser.Load(txtAddress.Text); else cefWebBrowser.Load(shopMainUrl); } } private void ShopLoginForm_FormClosed(object sender, FormClosedEventArgs e) { //OnSaveComplete(shop); } private void txtAddress_KeyDown(object sender, KeyEventArgs e) { if (e.KeyCode == Keys.Enter) { if (cefWebBrowser != null) { cefWebBrowser.Load(txtAddress.Text); } } } private void btnMultiLogin_Click(object sender, EventArgs e) { MultiLoginCookieName = cmbMultiCookieName.Text; AutoLogin(); } private void btnDel_Click(object sender, EventArgs e) { if (shop != null) { shop.DictMultiCookies.Remove(cmbMultiCookieName.Text); StartUp.SaveLocalShopLoginInfo(); InitMultiLoginCookies(); } } private void InitMultiLoginCookies() { this.cmbMultiCookieName.Items.Clear(); foreach (var cookieKey in shop.DictMultiCookies.Keys) { this.cmbMultiCookieName.Items.Add(cookieKey); } int i = 1; foreach (var item in this.cmbMultiCookieName.Items) { if (i <= item.ToString().Replace("cookie", "").ParseToInt()) { i = item.ToString().Replace("cookie", "").ParseToInt() + 1; } } this.cmbMultiCookieName.Items.Insert(0, "cookie" + i); this.cmbMultiCookieName.Text = "cookie" + i; } string sInputValueChange = @" let usernameId = document.getElementById('usernameId'); usernameId.value = '1'; var event = document.createEvent('HTMLEvents'); event.initEvent('input', true, true); event.eventType = 'message'; usernameId.dispatchEvent(event); "; string sInputValueChange2 = @" function changeReactInputValue(inputDom,newText){ let lastValue = inputDom.value; inputDom.value = newText; let event = new Event('input', { bubbles: true }); event.simulated = true; let tracker = inputDom._valueTracker; if (tracker) { tracker.setValue(lastValue); } inputDom.dispatchEvent(event); } "; string sGetElementWithText = @" function getElementWithText(sText) { var elem=null; const elements = document.querySelectorAll('*'); // 选择所有元素 elements.forEach(element => { if (element.textContent.includes(sText)) { // 对每个匹配的元素执行操作 //console.log(element); elem=element; } }); return elem; }; "; private void btnLoginAgain_Click(object sender, EventArgs e) { if (this.currentUrl != shopLoginUrl) this.cefWebBrowser.Load(shopLoginUrl); Task.Run(() => { InputUserNameAndPassword(cefWebBrowser, shop.LoginName, DataOpenSSL.DecryptString(shop.Password)); }); } } }