From 20bfd2c22cc3de8c0797839f558a13fe25c69fd3 Mon Sep 17 00:00:00 2001 From: chfei Date: Tue, 1 Sep 2026 14:55:43 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E7=99=BB=E5=BD=95=20UI?= =?UTF-8?q?=E7=BA=BF=E7=A8=8Bbug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ViewModels/PddMobileLoginViewModel.cs | 978 +++++++++--------- 1 file changed, 493 insertions(+), 485 deletions(-) diff --git a/29WxOrderWpf/ViewModels/PddMobileLoginViewModel.cs b/29WxOrderWpf/ViewModels/PddMobileLoginViewModel.cs index f12b92f..c1eeac2 100644 --- a/29WxOrderWpf/ViewModels/PddMobileLoginViewModel.cs +++ b/29WxOrderWpf/ViewModels/PddMobileLoginViewModel.cs @@ -23,489 +23,497 @@ using Work._29Tools.CefTools; namespace _29WxOrderWpf.ViewModels { - - - /// - /// 拼多多买手移动版登录窗口 视图模型(WPF 版 PddMobileLoginForm) - /// - public class PddMobileLoginViewModel : PropertyNotifyObject - { - // 拼多多买手退货退款售后地址 - // https://mobile.yangkeduo.com/complaint.html?order_sn=260718-101481213440980&after_sales_reason=0&after_sales_type=2&after_sales_code=1002 - - public static PddMobileLoginViewModel PddMobileLoginInstance { get; set; } = null; - - /// 浏览器创建完成后触发(视图在此把浏览器加入可视树) - public event Action BrowserCreated; - - /// 请求关闭窗口 - public event Action RequestClose; - - public int CloseAfterSecond { get; set; } - - private EnumOpenType _openType = EnumOpenType.manage; - public EnumOpenType OpenType - { - get { return _openType; } - set - { - _openType = value; - OnPropertyChanged(nameof(OpenType)); - OnPropertyChanged(nameof(IsLoginMode)); - } - } - - public string InitUrl { get; set; } = ""; - - private string shopCookieHead = "yangkeduo.com"; - private string shopLoginUrl = "https://mobile.yangkeduo.com/login.html?from=https%3A%2F%2Fmobile.yangkeduo.com%2Fpersonal.html"; - private string shopMainUrl = "https://mobile.yangkeduo.com/index.html"; - - public ChromiumWebBrowser CefWebBrowser { get; private set; } - private BuyerLoginInfo buyer = null; - private List lstShopCompany = new List(); - private string currentUrl = ""; - private volatile bool _isWindowLoaded = false; - - #region 界面绑定属性 - - /// 用户名 - public string UserName - { - get { return this.GetValue(x => x.UserName); } - set { this.SetValue(x => x.UserName, value); } - } - - /// 密码 - public string PassWord - { - get { return this.GetValue(x => x.PassWord); } - set { this.SetValue(x => x.PassWord, value); } - } - - /// 地址栏 - public string Address - { - get { return this.GetValue(x => x.Address); } - set { this.SetValue(x => x.Address, value); } - } - - /// 登录成功后关闭窗口 - public bool IsCloseAfterLogin - { - get { return this.GetValue(x => x.IsCloseAfterLogin); } - set { this.SetValue(x => x.IsCloseAfterLogin, value); } - } - - /// 登录模式(显示扫码提示和导入PDDAccessToken面板) - public bool IsLoginMode - { - get { return this.GetValue(x => x.IsLoginMode); } - set { this.SetValue(x => x.IsLoginMode, value); } - } - - /// 导入的PDDAccessToken - public string AccessToken - { - get { return this.GetValue(x => x.AccessToken); } - set { this.SetValue(x => x.AccessToken, value); } - } - - #endregion - - #region 命令 - - public ICommand ReloadCommand { get; } - public ICommand LoginAgainCommand { get; } - public ICommand StopCommand { get; } - public ICommand CopyUserNameCommand { get; } - public ICommand CopyPasswordCommand { get; } - public ICommand SaveCookieCommand { get; } - - #endregion - - public PddMobileLoginViewModel(BuyerLoginInfo buyerInfo) - { - PddMobileLoginInstance = this; - - buyer = buyerInfo; - UserName = buyerInfo?.buyer_name; - PassWord = ""; //DataOpenSSL.DecryptString(buyerInfo.Password); - IsCloseAfterLogin = true; - IsLoginMode = OpenType == EnumOpenType.login; - - ReloadCommand = new DelegateCommand(Reload); - LoginAgainCommand = new DelegateCommand(LoginAgain); - StopCommand = new DelegateCommand(StopButton); - CopyUserNameCommand = new DelegateCommand(CopyUserName); - CopyPasswordCommand = new DelegateCommand(CopyPassword); - SaveCookieCommand = new DelegateCommand(SaveCookie); - } - - /// - /// 窗口加载完成时调用 - /// - public void Start() - { - IsLoginMode = OpenType == EnumOpenType.login; - _isWindowLoaded = true; - - if (CloseAfterSecond > 0) - { - Task.Run(() => - { - Thread.Sleep(1000 * CloseAfterSecond); - if (_isWindowLoaded) - { - Application.Current?.Dispatcher.Invoke(new Action(() => - { - if (_isWindowLoaded) - RequestClose?.Invoke(); - })); - } - }); - } - - AutoLogin(); - } - - /// - /// 窗口关闭时调用,停止后台任务 - /// - public void Stop() - { - _isWindowLoaded = false; - } - - /// - /// 自动登录店铺后台 - /// - private void AutoLogin() - { - if (OpenType != EnumOpenType.login && buyer == null) - return; - - if (CefWebBrowser == null) - { - if (!string.IsNullOrEmpty(InitUrl)) - CefWebBrowser = WPFCEFBrowser.CreateChromiumWebBrowser(InitUrl, false); - else - CefWebBrowser = WPFCEFBrowser.CreateChromiumWebBrowser(shopMainUrl, false); - - LocalResourceRequestHandler resourceRequestHandler = new LocalResourceRequestHandler(); - resourceRequestHandler.ResourceLoadCompleteEvent += RequestHandler_ResourceLoadComplete; - resourceRequestHandler.BeforeResourceLoadEvent += RequestHandler_BeforeResourceLoad; - CefWebBrowser.RequestHandler = new LocalRequestHandler(resourceRequestHandler); - var lifeSapnHandler = new LocalLifeSpanHandler(PopWindowType.SelfWindow); - CefWebBrowser.LifeSpanHandler = lifeSapnHandler; - CefWebBrowser.KeyboardHandler = new KeyboardHandler(); - CefWebBrowser.FrameLoadEnd += CefWebBrowser_FrameLoadEnd; - CefWebBrowser.AddressChanged += CefWebBrowser_AddressChanged; - CefWebBrowser.LoadError += CefWebBrowser_LoadError; - - // 通知视图把浏览器加入可视树(必须在等待浏览器初始化之前完成) - BrowserCreated?.Invoke(CefWebBrowser); - - List cookieLst = new List(); - try - { - if (buyer != null) - { - cookieLst = JsonHelper.DeserializeJsonToList(buyer?.cookie); - if (cookieLst == null) - cookieLst = new List(); - } - } - catch - { - } - - Task.Run(() => - { - // cef138必须init后方可设置或删除cookie - while (!CefWebBrowser.IsBrowserInitialized || !CefWebBrowser.GetBrowser().MainFrame.IsValid) - Thread.Sleep(20); - WPFCEFBrowser.DeleteCookie(CefWebBrowser.GetCookieManager(null)); - - //cef 138 如果没有设置RequestContext 可能为空,直接getCookieManager - var t = WPFCEFBrowser.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); - } - - //根据登录的具体店铺设置local storage - if (!string.IsNullOrEmpty(buyer?.buyer_id)) - { - //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); - else - CefWebBrowser.Load(shopMainUrl); - - //不是登录的话就此返回 - if (OpenType != EnumOpenType.login) - { - return; - } - - for (int i = 0; i < 50; i++) - { - if (CefWebBrowser.IsLoading) - Thread.Sleep(100); - } - Thread.Sleep(Randomx.GetId(1500, 2000)); - - if (!_isWindowLoaded) - return; - - while (!CefWebBrowser.Address.StartsWith(shopLoginUrl)) - { - Thread.Sleep(1000); - if (!_isWindowLoaded) - return; - } - }); - } - } - - private void CefWebBrowser_LoadError(object sender, CefSharp.LoadErrorEventArgs e) - { - } - - private void CefWebBrowser_AddressChanged(object sender, DependencyPropertyChangedEventArgs e) - { - if (Application.Current?.Dispatcher != null) - { - Application.Current.Dispatcher.Invoke(new Action(() => - { - currentUrl = e.NewValue.ParseToString(); - Address = e.NewValue.ParseToString(); - })); - } - } - - private void CefWebBrowser_FrameLoadEnd(object sender, CefSharp.FrameLoadEndEventArgs e) - { - //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 bool RequestHandler_BeforeResourceLoad(object sender, string url, string postData, IRequest request) - { - return false; - } - - private void RequestHandler_ResourceLoadComplete(object sender, string url, string postData, string responseData, IRequest request) - { - if (url.Contains("https://mobile.yangkeduo.com/index.html") && OpenType == EnumOpenType.login) - { - Task.Run(() => { CefWebBrowser.Load("https://mobile.yangkeduo.com/personal.html"); }); - } - - if (url.Contains("https://mobile.yangkeduo.com/personal.html")) - { - if (OpenType == EnumOpenType.login) - { - Task.Run(() => - { - var data = responseData; - if (data.Contains("\"success\":true") || data.Contains("nickname")) - { - var uid = BaseRegex.GetStringJson(ref data, "uid"); - var nickname = BaseRegex.GetStringJson(ref data, "nickname"); - var username = nickname; - - if (!string.IsNullOrEmpty(nickname) && !string.IsNullOrEmpty(uid)) - { - Thread.Sleep(2000); - - List cookieList = WPFCEFBrowser.GetCookieList(shopCookieHead, CefWebBrowser.GetCookieManager(null)); - - var buyerUrl = BaseClass.Build29PDDObjString("user/add_buyer"); - - if (this.buyer == null || this.buyer.buyer_id != uid) - this.buyer = GlobalConfig.PDDBuyerLoginList.FirstOrDefault(b => b.buyer_id == uid); - if (this.buyer != null) - { - this.buyer.user_name = username; - this.buyer.buyer_nick = nickname; - this.buyer.cookie = JsonHelper.SerializeObject(cookieList); - buyerUrl = BaseClass.Build29PDDObjString("user/mdy_buyer"); - } - - var buyerData = UserLogin.GetSignaturex() - + "&buyer_id=" + uid - + "&buyer_name=" + username - + "&buyer_nick=" + nickname; - var result = GetHtml.PostUtf8(buyerUrl, buyerData); - if (string.IsNullOrEmpty(result) || !result.Contains("\"code\":200")) - result = GetHtml.PostUtf8(buyerUrl, buyerData); - - buyerUrl = BaseClass.Build29PDDObjString("user/mdy_buyer_cookie"); - buyerData = UserLogin.GetSignaturex() - + "&buyer_id=" + uid - + "&status=" + "在线" - + "&cookie=" + GetHtml.UrlEncodeUtf8(JsonHelper.SerializeObject(cookieList)); - result = GetHtml.PostUtf8(buyerUrl, buyerData); - if (string.IsNullOrEmpty(result) || !result.Contains("\"code\":200")) - result = GetHtml.PostUtf8(buyerUrl, buyerData); - - Application.Current?.Dispatcher.Invoke(new Action(() => - { - try - { - if (IsCloseAfterLogin) - RequestClose?.Invoke(); - } - catch (Exception ex) - { } - })); - } - } - }); - } - } - } - - private void StopButton() - { - } - - private void CopyUserName() - { - if (!string.IsNullOrEmpty(UserName)) - Clipboard.SetDataObject(UserName); - } - - private void CopyPassword() - { - if (!string.IsNullOrEmpty(PassWord)) - Clipboard.SetDataObject(PassWord); - } - - private void Reload() - { - if (CefWebBrowser != null) - { - if (Address != "about:blank") - CefWebBrowser.Load(Address); - else - CefWebBrowser.Load(shopMainUrl); - } - } - - private void LoginAgain() - { - if (this.currentUrl != shopLoginUrl) - this.CefWebBrowser?.Load(shopLoginUrl); - } - - private void SaveCookie() - { - Cookie cookie = new Cookie(); - cookie.Name = "PDDAccessToken"; - cookie.Domain = "mobile.yangkeduo.com"; - cookie.Expires = DateTime.Now.AddDays(465); - cookie.HttpOnly = true; - cookie.Secure = true; - cookie.Value = AccessToken.Trim(); - - if (this.CefWebBrowser != null) - { - var t = WPFCEFBrowser.SetCookieAsync(JsonHelper.SerializeObject(new List { cookie }), CefWebBrowser.GetCookieManager(null)); - t.Wait(2000); - CefWebBrowser.Load("https://mobile.yangkeduo.com/personal.html"); - } - } - - #region 静态方法(检测/更新买手登录状态) - - public static void CheckBuyerLogin(List checkBuyers, bool isShowProgress = true) - { - for (int i = 0; i < checkBuyers.Count; i++) - { - var buyer = GlobalConfig.PDDBuyerLoginList.FirstOrDefault(v => v.buyer_id == checkBuyers[i].buyer_id); - var buys = GlobalConfig.PDDBuyerLoginList.Where(v => v.buyer_id == checkBuyers[i].buyer_id).ToList(); - if (buyer == null) - continue; - - // 先从服务端取最新cookie - var url = BaseClass.Build29PDDObjString("user/get_buyer"); - var data = UserLogin.GetSignaturex(); - data += "&buyer_ids=" + buyer.buyer_id; - data += "&page_size=1"; - var result = GetHtml.PostUtf8(url, data); - if (string.IsNullOrEmpty(result) || !result.Contains("\"code\":200")) - result = GetHtml.PostUtf8(url, data); - if (!result.Contains("\"code\":200")) - continue; - List loginInfoLst = JsonHelper.DeserializeJsonToList(JsonHelper.JObjectParse(result)["data"].ParseToString()); - - var serverBuyer = loginInfoLst.FirstOrDefault(); - if (buyer != null && serverBuyer != null) - { - buyer.cookie = serverBuyer.cookie; - foreach (var buy in buys) - { - buy.cookie = serverBuyer.cookie; - } - } - - if (buyer != null) - { - var loginResult = CheckBuyerLogin(buyer); - if (!loginResult.Contains("\"success\":true") && !loginResult.Contains("\"login\":true") && !loginResult.Contains("\"nickname\"")) - { - buyer.cookie = "[]"; - foreach (var buy in buys) - { - buy.status = "掉线"; - buy.cookie = "[]"; - } - } - else - { - foreach (var buy in buys) - { - buy.status = "在线"; - } - } - UpdateServerBuyerCookies(buyer); // 店铺cookie和状态写入服务端 - } - } - } - - public static string CheckBuyerLogin(BuyerLoginInfo buyer, string refere = "https://mobile.yangkeduo.com/goods.html") - { - string url = "https://mobile.yangkeduo.com/proxy/api/api/apollo/v3/user/me?pdduid=" + buyer.buyer_id; - return HttpResponseYkdBLL.YangkeduoGetResponse(buyer, url, refere); - } - - public static string UpdateServerBuyerCookies(BuyerLoginInfo buyer, string fromTool = null) - { - var url = BaseClass.Build29PDDObjString("user/mdy_buyer_cookie"); - var data = UserLogin.GetSignaturex() - + "&status=" + buyer.status - + "&cookie=" + GetHtml.UrlEncodeUtf8(buyer.cookie) - + "&buyer_id=" + buyer.buyer_id; - var result = GetHtml.PostUtf8(url, data); - if (!result.Contains("\"code\":200")) - result = GetHtml.PostUtf8(url, data); - return result; - } - - #endregion - } + + + /// + /// 拼多多买手移动版登录窗口 视图模型(WPF 版 PddMobileLoginForm) + /// + public class PddMobileLoginViewModel : PropertyNotifyObject + { + // 拼多多买手退货退款售后地址 + // https://mobile.yangkeduo.com/complaint.html?order_sn=260718-101481213440980&after_sales_reason=0&after_sales_type=2&after_sales_code=1002 + + public static PddMobileLoginViewModel PddMobileLoginInstance { get; set; } = null; + + /// 浏览器创建完成后触发(视图在此把浏览器加入可视树) + public event Action BrowserCreated; + + /// 请求关闭窗口 + public event Action RequestClose; + + public int CloseAfterSecond { get; set; } + + private EnumOpenType _openType = EnumOpenType.manage; + public EnumOpenType OpenType + { + get { return _openType; } + set + { + _openType = value; + OnPropertyChanged(nameof(OpenType)); + OnPropertyChanged(nameof(IsLoginMode)); + } + } + + public string InitUrl { get; set; } = ""; + + private string shopCookieHead = "yangkeduo.com"; + private string shopLoginUrl = "https://mobile.yangkeduo.com/login.html?from=https%3A%2F%2Fmobile.yangkeduo.com%2Fpersonal.html"; + private string shopMainUrl = "https://mobile.yangkeduo.com/index.html"; + + public ChromiumWebBrowser CefWebBrowser { get; private set; } + private BuyerLoginInfo buyer = null; + private List lstShopCompany = new List(); + private string currentUrl = ""; + private volatile bool _isWindowLoaded = false; + + #region 界面绑定属性 + + /// 用户名 + public string UserName + { + get { return this.GetValue(x => x.UserName); } + set { this.SetValue(x => x.UserName, value); } + } + + /// 密码 + public string PassWord + { + get { return this.GetValue(x => x.PassWord); } + set { this.SetValue(x => x.PassWord, value); } + } + + /// 地址栏 + public string Address + { + get { return this.GetValue(x => x.Address); } + set { this.SetValue(x => x.Address, value); } + } + + /// 登录成功后关闭窗口 + public bool IsCloseAfterLogin + { + get { return this.GetValue(x => x.IsCloseAfterLogin); } + set { this.SetValue(x => x.IsCloseAfterLogin, value); } + } + + /// 登录模式(显示扫码提示和导入PDDAccessToken面板) + public bool IsLoginMode + { + get { return this.GetValue(x => x.IsLoginMode); } + set { this.SetValue(x => x.IsLoginMode, value); } + } + + /// 导入的PDDAccessToken + public string AccessToken + { + get { return this.GetValue(x => x.AccessToken); } + set { this.SetValue(x => x.AccessToken, value); } + } + + #endregion + + #region 命令 + + public ICommand ReloadCommand { get; } + public ICommand LoginAgainCommand { get; } + public ICommand StopCommand { get; } + public ICommand CopyUserNameCommand { get; } + public ICommand CopyPasswordCommand { get; } + public ICommand SaveCookieCommand { get; } + + #endregion + + public PddMobileLoginViewModel(BuyerLoginInfo buyerInfo) + { + PddMobileLoginInstance = this; + + buyer = buyerInfo; + UserName = buyerInfo?.buyer_name; + PassWord = ""; //DataOpenSSL.DecryptString(buyerInfo.Password); + IsCloseAfterLogin = true; + IsLoginMode = OpenType == EnumOpenType.login; + + ReloadCommand = new DelegateCommand(Reload); + LoginAgainCommand = new DelegateCommand(LoginAgain); + StopCommand = new DelegateCommand(StopButton); + CopyUserNameCommand = new DelegateCommand(CopyUserName); + CopyPasswordCommand = new DelegateCommand(CopyPassword); + SaveCookieCommand = new DelegateCommand(SaveCookie); + } + + /// + /// 窗口加载完成时调用 + /// + public void Start() + { + IsLoginMode = OpenType == EnumOpenType.login; + _isWindowLoaded = true; + + if (CloseAfterSecond > 0) + { + Task.Run(() => + { + Thread.Sleep(1000 * CloseAfterSecond); + if (_isWindowLoaded) + { + Application.Current?.Dispatcher.Invoke(new Action(() => + { + if (_isWindowLoaded) + RequestClose?.Invoke(); + })); + } + }); + } + Task.Run(() => + { + + AutoLogin(); + }); + } + + /// + /// 窗口关闭时调用,停止后台任务 + /// + public void Stop() + { + _isWindowLoaded = false; + } + + /// + /// 自动登录店铺后台 + /// + private async void AutoLogin() + { + if (OpenType != EnumOpenType.login && buyer == null) + return; + _ = Application.Current.Dispatcher.InvokeAsync(async () => + { + if (CefWebBrowser == null) + { + if (!string.IsNullOrEmpty(InitUrl)) + CefWebBrowser = WPFCEFBrowser.CreateChromiumWebBrowser(InitUrl, false); + else + CefWebBrowser = WPFCEFBrowser.CreateChromiumWebBrowser(shopMainUrl, false); + + LocalResourceRequestHandler resourceRequestHandler = new LocalResourceRequestHandler(); + resourceRequestHandler.ResourceLoadCompleteEvent += RequestHandler_ResourceLoadComplete; + resourceRequestHandler.BeforeResourceLoadEvent += RequestHandler_BeforeResourceLoad; + CefWebBrowser.RequestHandler = new LocalRequestHandler(resourceRequestHandler); + var lifeSapnHandler = new LocalLifeSpanHandler(PopWindowType.SelfWindow); + CefWebBrowser.LifeSpanHandler = lifeSapnHandler; + CefWebBrowser.KeyboardHandler = new KeyboardHandler(); + CefWebBrowser.FrameLoadEnd += CefWebBrowser_FrameLoadEnd; + CefWebBrowser.AddressChanged += CefWebBrowser_AddressChanged; + CefWebBrowser.LoadError += CefWebBrowser_LoadError; + + // 通知视图把浏览器加入可视树(必须在等待浏览器初始化之前完成) + BrowserCreated?.Invoke(CefWebBrowser); + + List cookieLst = new List(); + try + { + if (buyer != null) + { + cookieLst = JsonHelper.DeserializeJsonToList(buyer?.cookie); + if (cookieLst == null) + cookieLst = new List(); + } + } + catch + { + } + + + // cef138必须init后方可设置或删除cookie + + while (!CefWebBrowser.IsBrowserInitialized || !CefWebBrowser.GetBrowser().MainFrame.IsValid) + await Task.Delay(20); + WPFCEFBrowser.DeleteCookie(CefWebBrowser.GetCookieManager(null)); + + //cef 138 如果没有设置RequestContext 可能为空,直接getCookieManager + var t = WPFCEFBrowser.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); + } + + //根据登录的具体店铺设置local storage + if (!string.IsNullOrEmpty(buyer?.buyer_id)) + { + //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); + else + CefWebBrowser.Load(shopMainUrl); + + //不是登录的话就此返回 + if (OpenType != EnumOpenType.login) + { + return; + } + + for (int i = 0; i < 50; i++) + { + if (CefWebBrowser.IsLoading) + await Task.Delay(100); + //Thread.Sleep(100); + } + await Task.Delay(Randomx.GetId(1500, 2000)); + if (!_isWindowLoaded) + return; + + while (!CefWebBrowser.Address?.StartsWith(shopLoginUrl) ?? false) + { + await Task.Delay(1000); + if (!_isWindowLoaded) + return; + } + + } + }); + } + + + + + private void CefWebBrowser_LoadError(object sender, CefSharp.LoadErrorEventArgs e) + { + } + + private void CefWebBrowser_AddressChanged(object sender, DependencyPropertyChangedEventArgs e) + { + if (Application.Current?.Dispatcher != null) + { + Application.Current.Dispatcher.Invoke(new Action(() => + { + currentUrl = e.NewValue.ParseToString(); + Address = e.NewValue.ParseToString(); + })); + } + } + + private void CefWebBrowser_FrameLoadEnd(object sender, CefSharp.FrameLoadEndEventArgs e) + { + //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 bool RequestHandler_BeforeResourceLoad(object sender, string url, string postData, IRequest request) + { + return false; + } + + private void RequestHandler_ResourceLoadComplete(object sender, string url, string postData, string responseData, IRequest request) + { + if (url.Contains("https://mobile.yangkeduo.com/index.html") && OpenType == EnumOpenType.login) + { + Task.Run(() => { CefWebBrowser.Load("https://mobile.yangkeduo.com/personal.html"); }); + } + + if (url.Contains("https://mobile.yangkeduo.com/personal.html")) + { + if (OpenType == EnumOpenType.login) + { + Task.Run(() => + { + var data = responseData; + if (data.Contains("\"success\":true") || data.Contains("nickname")) + { + var uid = BaseRegex.GetStringJson(ref data, "uid"); + var nickname = BaseRegex.GetStringJson(ref data, "nickname"); + var username = nickname; + + if (!string.IsNullOrEmpty(nickname) && !string.IsNullOrEmpty(uid)) + { + Thread.Sleep(2000); + + List cookieList = WPFCEFBrowser.GetCookieList(shopCookieHead, CefWebBrowser.GetCookieManager(null)); + + var buyerUrl = BaseClass.Build29PDDObjString("user/add_buyer"); + + if (this.buyer == null || this.buyer.buyer_id != uid) + this.buyer = GlobalConfig.PDDBuyerLoginList.FirstOrDefault(b => b.buyer_id == uid); + if (this.buyer != null) + { + this.buyer.user_name = username; + this.buyer.buyer_nick = nickname; + this.buyer.cookie = JsonHelper.SerializeObject(cookieList); + buyerUrl = BaseClass.Build29PDDObjString("user/mdy_buyer"); + } + + var buyerData = UserLogin.GetSignaturex() + + "&buyer_id=" + uid + + "&buyer_name=" + username + + "&buyer_nick=" + nickname; + var result = GetHtml.PostUtf8(buyerUrl, buyerData); + if (string.IsNullOrEmpty(result) || !result.Contains("\"code\":200")) + result = GetHtml.PostUtf8(buyerUrl, buyerData); + + buyerUrl = BaseClass.Build29PDDObjString("user/mdy_buyer_cookie"); + buyerData = UserLogin.GetSignaturex() + + "&buyer_id=" + uid + + "&status=" + "在线" + + "&cookie=" + GetHtml.UrlEncodeUtf8(JsonHelper.SerializeObject(cookieList)); + result = GetHtml.PostUtf8(buyerUrl, buyerData); + if (string.IsNullOrEmpty(result) || !result.Contains("\"code\":200")) + result = GetHtml.PostUtf8(buyerUrl, buyerData); + + Application.Current?.Dispatcher.Invoke(new Action(() => + { + try + { + if (IsCloseAfterLogin) + RequestClose?.Invoke(); + } + catch (Exception ex) + { } + })); + } + } + }); + } + } + } + + private void StopButton() + { + } + + private void CopyUserName() + { + if (!string.IsNullOrEmpty(UserName)) + Clipboard.SetDataObject(UserName); + } + + private void CopyPassword() + { + if (!string.IsNullOrEmpty(PassWord)) + Clipboard.SetDataObject(PassWord); + } + + private void Reload() + { + if (CefWebBrowser != null) + { + if (Address != "about:blank") + CefWebBrowser.Load(Address); + else + CefWebBrowser.Load(shopMainUrl); + } + } + + private void LoginAgain() + { + if (this.currentUrl != shopLoginUrl) + this.CefWebBrowser?.Load(shopLoginUrl); + } + + private void SaveCookie() + { + Cookie cookie = new Cookie(); + cookie.Name = "PDDAccessToken"; + cookie.Domain = "mobile.yangkeduo.com"; + cookie.Expires = DateTime.Now.AddDays(465); + cookie.HttpOnly = true; + cookie.Secure = true; + cookie.Value = AccessToken.Trim(); + + if (this.CefWebBrowser != null) + { + var t = WPFCEFBrowser.SetCookieAsync(JsonHelper.SerializeObject(new List { cookie }), CefWebBrowser.GetCookieManager(null)); + t.Wait(2000); + CefWebBrowser.Load("https://mobile.yangkeduo.com/personal.html"); + } + } + + #region 静态方法(检测/更新买手登录状态) + + public static void CheckBuyerLogin(List checkBuyers, bool isShowProgress = true) + { + for (int i = 0; i < checkBuyers.Count; i++) + { + var buyer = GlobalConfig.PDDBuyerLoginList.FirstOrDefault(v => v.buyer_id == checkBuyers[i].buyer_id); + var buys = GlobalConfig.PDDBuyerLoginList.Where(v => v.buyer_id == checkBuyers[i].buyer_id).ToList(); + if (buyer == null) + continue; + + // 先从服务端取最新cookie + var url = BaseClass.Build29PDDObjString("user/get_buyer"); + var data = UserLogin.GetSignaturex(); + data += "&buyer_ids=" + buyer.buyer_id; + data += "&page_size=1"; + var result = GetHtml.PostUtf8(url, data); + if (string.IsNullOrEmpty(result) || !result.Contains("\"code\":200")) + result = GetHtml.PostUtf8(url, data); + if (!result.Contains("\"code\":200")) + continue; + List loginInfoLst = JsonHelper.DeserializeJsonToList(JsonHelper.JObjectParse(result)["data"].ParseToString()); + + var serverBuyer = loginInfoLst.FirstOrDefault(); + if (buyer != null && serverBuyer != null) + { + buyer.cookie = serverBuyer.cookie; + foreach (var buy in buys) + { + buy.cookie = serverBuyer.cookie; + } + } + + if (buyer != null) + { + var loginResult = CheckBuyerLogin(buyer); + if (!loginResult.Contains("\"success\":true") && !loginResult.Contains("\"login\":true") && !loginResult.Contains("\"nickname\"")) + { + buyer.cookie = "[]"; + foreach (var buy in buys) + { + buy.status = "掉线"; + buy.cookie = "[]"; + } + } + else + { + foreach (var buy in buys) + { + buy.status = "在线"; + } + } + UpdateServerBuyerCookies(buyer); // 店铺cookie和状态写入服务端 + } + } + } + + public static string CheckBuyerLogin(BuyerLoginInfo buyer, string refere = "https://mobile.yangkeduo.com/goods.html") + { + string url = "https://mobile.yangkeduo.com/proxy/api/api/apollo/v3/user/me?pdduid=" + buyer.buyer_id; + return HttpResponseYkdBLL.YangkeduoGetResponse(buyer, url, refere); + } + + public static string UpdateServerBuyerCookies(BuyerLoginInfo buyer, string fromTool = null) + { + var url = BaseClass.Build29PDDObjString("user/mdy_buyer_cookie"); + var data = UserLogin.GetSignaturex() + + "&status=" + buyer.status + + "&cookie=" + GetHtml.UrlEncodeUtf8(buyer.cookie) + + "&buyer_id=" + buyer.buyer_id; + var result = GetHtml.PostUtf8(url, data); + if (!result.Contains("\"code\":200")) + result = GetHtml.PostUtf8(url, data); + return result; + } + + #endregion + } } \ No newline at end of file