diff --git a/29WxOrderWpf/Ctrls/BuyerCtrls/PDDBuyerSelectCtrl.xaml b/29WxOrderWpf/Ctrls/BuyerCtrls/PDDBuyerSelectCtrl.xaml index 77fe485..5f47513 100644 --- a/29WxOrderWpf/Ctrls/BuyerCtrls/PDDBuyerSelectCtrl.xaml +++ b/29WxOrderWpf/Ctrls/BuyerCtrls/PDDBuyerSelectCtrl.xaml @@ -1,49 +1,211 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + diff --git a/29WxOrderWpf/Ctrls/BuyerCtrls/PDDBuyerSelectCtrl.xaml.cs b/29WxOrderWpf/Ctrls/BuyerCtrls/PDDBuyerSelectCtrl.xaml.cs index f79f0ca..2566724 100644 --- a/29WxOrderWpf/Ctrls/BuyerCtrls/PDDBuyerSelectCtrl.xaml.cs +++ b/29WxOrderWpf/Ctrls/BuyerCtrls/PDDBuyerSelectCtrl.xaml.cs @@ -40,6 +40,7 @@ namespace _29WxOrderWpf.Ctrls.BuyerCtrls private void UserControl_Loaded(object sender, RoutedEventArgs e) { cmbPddBuyer.ItemsSource = GlobalConfig.PDDBuyerLoginList; + cmbTaobaoBuyer.ItemsSource = GlobalConfig.TaobaoBuyerLoginList; } private void btnLoginPdd_Click(object sender, RoutedEventArgs e) @@ -145,48 +146,143 @@ namespace _29WxOrderWpf.Ctrls.BuyerCtrls }); } } - //var pddBuyer = - - //var ids = dgvBuyer.Rows.Cast().Where(r => r.Cells["colSelect"].Value.ParseToBool() == true).Select(s => s.Cells["colBuyerId"].Value.ParseToString()).ToList(); - //var buyers = GlobalConfig.PDDBuyerLoginList.Where(b => ids.Contains(b.buyer_id)).ToList(); - //this.statusBar.pgbTaskProgress.Maximum = buyers.Count; - //pbLoading.Visible = true; - - //Task.Run(() => - //{ - // int i = 0; - // foreach (var buyer in buyers) - // { - // i++; - // this.Invoke(new Action(() => - // { - // this.statusBar.lblTaskStatus.Text = "正在删除..."; - // this.statusBar.pgbTaskProgress.Value = i; - // this.statusBar.pgbTaskProgress.Text = i + "/" + buyers.Count; - // })); - - - - // Thread.Sleep(100); - // } - // this.Invoke(new Action(() => - // { - // this.statusBar.lblTaskStatus.Text = "删除完成"; - // this.statusBar.pgbTaskProgress.Value = buyers.Count; - // this.statusBar.pgbTaskProgress.Text = buyers.Count + "/" + buyers.Count; - // })); - // GetPddBuyer(); - //}); } private void Image_MouseLeftButtonUp(object sender, MouseButtonEventArgs e) { - if (MainWindow.Instance.gridPddBuyerOrderReadCtrl.Visibility != Visibility.Visible) - MainWindow.Instance.gridPddBuyerOrderReadCtrl.Visibility = Visibility.Visible; - if (Panel.GetZIndex(MainWindow.Instance.gridPddBuyerOrderReadCtrl) < 1) - Panel.SetZIndex(MainWindow.Instance.gridPddBuyerOrderReadCtrl, 1); + if (wpPddBuyer.Visibility == Visibility.Visible) + { + if (MainWindow.Instance.gridPddBuyerOrderReadCtrl.Visibility != Visibility.Visible) + MainWindow.Instance.gridPddBuyerOrderReadCtrl.Visibility = Visibility.Visible; + if (Panel.GetZIndex(MainWindow.Instance.gridPddBuyerOrderReadCtrl) < 1) + Panel.SetZIndex(MainWindow.Instance.gridPddBuyerOrderReadCtrl, 1); + else + Panel.SetZIndex(MainWindow.Instance.gridPddBuyerOrderReadCtrl, -1); + } else + { Panel.SetZIndex(MainWindow.Instance.gridPddBuyerOrderReadCtrl, -1); + } + + } + + private void btnSwitch_Click(object sender, RoutedEventArgs e) + { + if (wpPddBuyer.Visibility == Visibility.Visible) + { + wpPddBuyer.Visibility = Visibility.Collapsed; + wpTaobaoBuyer.Visibility = Visibility.Visible; + } + else + { + wpPddBuyer.Visibility = Visibility.Visible; + wpTaobaoBuyer.Visibility = Visibility.Collapsed; + } + } + + private void btnLoginTaobao_Click(object sender, RoutedEventArgs e) + { + BuyerLoginInfo buyer = null; + if (cmbTaobaoBuyer.SelectedItem != null) + { + buyer = cmbTaobaoBuyer.SelectedItem as BuyerLoginInfo; + } + + TaobaoLoginView taobaoBuyerForm = new TaobaoLoginView(buyer); + taobaoBuyerForm.ViewModel.OpenType = EnumOpenType.login; + taobaoBuyerForm.ViewModel.InitUrl = "https://login.taobao.com/havanaone/login/login.htm"; + new DialogWindow() + { + Title = "淘宝买手登录", + Content = taobaoBuyerForm, + }.ShowDialog(); + + MainWindow.Instance.GetTaobaoBuyer(); + + } + + private void cmbTaobao_SelectionChanged(object sender, SelectionChangedEventArgs e) + { + BuyerLoginInfo buyer = null; + if (cmbTaobaoBuyer.SelectedItem != null) + { + buyer = cmbTaobaoBuyer.SelectedItem as BuyerLoginInfo; + } + GlobalConfig.CurrentTaobaoBuyer = buyer; + } + + private void cmbTaobao_MouseLeftButtonUp(object sender, MouseButtonEventArgs e) + { + if (e.GetPosition(sender as IInputElement).X > cmbTaobaoBuyer.ActualWidth - 18) + return; + + BuyerLoginInfo buyer = null; + if (cmbTaobaoBuyer.SelectedItem != null) + { + buyer = cmbTaobaoBuyer.SelectedItem as BuyerLoginInfo; + } + if (buyer == null) + return; + + bool islogin = false; + TaobaoLoginViewModel.CheckBuyerLogin(new List { buyer }, false); + TaobaoLoginView buyerLoginForm = new TaobaoLoginView(buyer); + if (buyer.status == "在线") + { + buyerLoginForm.ViewModel.OpenType = EnumOpenType.manage; + buyerLoginForm.ViewModel.InitUrl = "https://buyertrade.taobao.com/trade/itemlist/list_bought_items.htm?"; + + new DialogWindow() + { + Width = 1280, + Height = 800, + Title = "买手主页", + Content = buyerLoginForm, + }.Show(); + } + else + { + buyerLoginForm.ViewModel.OpenType = EnumOpenType.login; + buyerLoginForm.ViewModel.InitUrl = "https://login.taobao.com/havanaone/login/login.htm"; + + new DialogWindow() + { + Width = 1280, + Height = 800, + Title = "买手登录", + Content = buyerLoginForm, + }.ShowDialog(); + } + if (islogin) + MainWindow.Instance.GetTaobaoBuyer(); + } + + private void btnDeleteTaobaoItem_Click(object sender, RoutedEventArgs e) + { + if (BaseMsgWindow.ShowConfirm("确定删除吗?删除后不可恢复!").DialogResult != true) + return; + + if (sender is Button btn) + { + if (btn.DataContext is BuyerLoginInfo buyer) + { + Task.Run(() => + { + var url = BaseClass.Build29WxObjString("user/del_taobao_buyer"); + var data = UserLogin.GetSignaturex() + + "&buyer_id=" + buyer.buyer_id; + var result = GetHtml.PostUtf8(url, data); + if (result.Contains("\"code\":200")) + { + Dispatcher.Invoke(new Action(() => + { + GlobalConfig.TaobaoBuyerLoginList.Remove(buyer); + this.cmbPddBuyer.SelectedIndex = 0; + })); + } + }); + } + } } } } diff --git a/29WxOrderWpf/MainWindow.xaml b/29WxOrderWpf/MainWindow.xaml index 3a26ba2..b3e51c2 100644 --- a/29WxOrderWpf/MainWindow.xaml +++ b/29WxOrderWpf/MainWindow.xaml @@ -111,10 +111,12 @@ @@ -130,16 +132,17 @@ Width="1200" HorizontalAlignment="Right" Panel.ZIndex="-1" + d:Visibility="Visible" Visibility="Collapsed" /> { GetPddBuyer(); - }); + GetTaobaoBuyer(); + }); } } protected virtual void OnPropertyChanged(string propertyName) @@ -435,9 +436,74 @@ namespace _29WxOrderWpf isGetPddBuyer = false; hasGetPddBuyer = true; } - #endregion + #endregion - private void lblBalance_MouseLeftButtonUp(object sender, MouseButtonEventArgs e) + #region 读取拼多多买手号 + public bool isGetTaobaoBuyer = false; + public bool hasGetTaobaoBuyer = false; + + /// + /// 读取拼多多买手 + /// + public void GetTaobaoBuyer() + { + if (isGetTaobaoBuyer) + return; + + isGetTaobaoBuyer = true; + + try + { + var url = BaseClass.Build29WxObjString("user/get_taobao_buyer"); + var data = UserLogin.GetSignaturex(); + data += "&page_size=200"; + + var result = GetHtml.PostUtf8(url, data); + if (string.IsNullOrEmpty(result) || !result.Contains("\"code\":200")) + result = GetHtml.PostUtf8(url, data); + + if (result.Contains("\"code\":200")) + { + List loginInfoLst = JsonHelper.DeserializeJsonToList(JsonHelper.JObjectParse(result)["data"].ParseToString()); + + foreach (var buyer in GlobalConfig.TaobaoBuyerLoginList.Where(bu => !loginInfoLst.Any(b => b.buyer_id == bu.buyer_id)).ToList()) + { + Dispatcher.Invoke(new Action(() => { GlobalConfig.TaobaoBuyerLoginList.Remove(buyer); })); + } + + foreach (var b in loginInfoLst) + { + Dispatcher.Invoke(new Action(() => + { + var buyer = GlobalConfig.TaobaoBuyerLoginList.FirstOrDefault(bu => bu.buyer_id == b.buyer_id); + if (buyer == null) + GlobalConfig.TaobaoBuyerLoginList.Add(b); + else + { + buyer.add_time = b.add_time; + buyer.buyer_id = b.buyer_id; + buyer.buyer_name = b.buyer_name; + buyer.buyer_nick = b.buyer_nick; + buyer.cookie = b.cookie; + buyer.mdy_time = b.mdy_time; + buyer.notes = b.notes; + buyer.status = b.status; + buyer.user_name = b.user_name; + } + })); + } + } + } + catch + { + } + + isGetTaobaoBuyer = false; + hasGetTaobaoBuyer = true; + } + #endregion + + private void lblBalance_MouseLeftButtonUp(object sender, MouseButtonEventArgs e) { WXGetBalanceQrCodeForm balanceQrCodeForm = new WXGetBalanceQrCodeForm(StartUp.UpdateBalance); balanceQrCodeForm.ShowDialog(); diff --git a/29WxOrderWpf/ViewModels/TaobaoLoginViewModel.cs b/29WxOrderWpf/ViewModels/TaobaoLoginViewModel.cs new file mode 100644 index 0000000..5705ba6 --- /dev/null +++ b/29WxOrderWpf/ViewModels/TaobaoLoginViewModel.cs @@ -0,0 +1,562 @@ +using _29WxOrderWpf.CefHelper; +using _29WxOrderWpf.Commands; +using AllBase; +using AllBase.Helper; +using AllBase.Model.DBModel; +using AllBase.Model.MvvmBaseClasses; +using CefSharp; +using CefSharp.Handler; +using CefSharp.Wpf; +using NaiBa.Util.Extension; +using Org.BouncyCastle.Asn1.Ocsp; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Security.Policy; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Input; +using TemuKJD.ToolForms; +using Work; +using Work._29Tools.BLL; +using Work._29Tools.CefTools; +using static System.Windows.Forms.VisualStyles.VisualStyleElement.StartPanel; + +namespace _29WxOrderWpf.ViewModels +{ + + + /// + /// 拼多多买手移动版登录窗口 视图模型(WPF 版 TaobaoLoginForm) + /// + public class TaobaoLoginViewModel : 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 TaobaoLoginViewModel TaobaoLoginInstance { 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 = "taobao.com"; + private string buyerLoginUrl = "https://login.taobao.com/havanaone/login/login.htm"; + private string buyerMainUrl = "https://i.taobao.com/my_itaobao"; //"https://buyertrade.taobao.com/trade/itemlist/list_bought_items.htm?"; + + 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); } + } + + /// 登录模式 + public bool IsLoginMode + { + get { return this.GetValue(x => x.IsLoginMode); } + set { this.SetValue(x => x.IsLoginMode, value); } + } + + #endregion + + #region 命令 + + public ICommand ReloadCommand { get; } + public ICommand LoginAgainCommand { get; } + public ICommand StopCommand { get; } + public ICommand CopyUserNameCommand { get; } + public ICommand CopyPasswordCommand { get; } + + #endregion + + public TaobaoLoginViewModel(BuyerLoginInfo buyerInfo) + { + TaobaoLoginInstance = 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); + } + + /// + /// 窗口加载完成时调用 + /// + 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(buyerMainUrl, 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.KeyboardHandler = new CefKeyboardHandler(); + 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(buyerMainUrl); + + //不是登录的话就此返回 + if (OpenType != EnumOpenType.login) + { + return; + } + + for (int i = 0; i < 50; i++) + { + if (CefWebBrowser.IsLoading) + await Task.Delay(100); + } + await Task.Delay(Randomx.GetId(1500, 2000)); + if (!_isWindowLoaded) + return; + + while (!CefWebBrowser.Address?.StartsWith(buyerLoginUrl) ?? 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 async void RequestHandler_ResourceLoadComplete(object sender, string url, string postData, string responseData, IRequest request) + { + await DoResourceLoadComplete(url, responseData); + } + + private async Task DoResourceLoadComplete(string url, string responseData) + { + //if (url.Contains(buyerLoginUrl) && OpenType == EnumOpenType.login) + //{ + // Task.Run(() => { CefWebBrowser.Load(buyerLoginUrl); }); + //} + var data = responseData; + if (data.Contains("karl_malone_32") || data.Contains("jtt_fan")) + { + + //https://h5api.m.taobao.com/h5/mtop.user.getusersimple/1.0/?jsv=2.7.2&appKey=12574478&t=1789984970076&sign=6bb7d3b5cd8bd3ab32bd97c1a0df1c0f&jsonpIncPrefix=tbnavnew&api=mtop.user.getUserSimple&v=1.0&dataType=json&type=originaljson&data=%7B%7D + //{"api":"mtop.user.getUserSimple","v":"1.0","ret":["SUCCESS::调用成功"],"data":{"nick":"jtt_fan","userNumId":440631048,"displayNick":"jtt_fan"}} + } + + if (url.Contains(buyerMainUrl) || (data.Contains("\"displayNick\"") && data.Contains("\"nick\"") && data.Contains("\"userNumId\""))) + { + if (OpenType == EnumOpenType.login) + { + await Task.Run(async () => + { + if (data.Contains("\"ret\":[\"SUCCESS::调用成功\"]")) + { + var uid = BaseRegex.GetStringJson(ref data, "userNumId"); + var nickname = BaseRegex.GetStringJson(ref data, "displayNick"); + var username = nickname; + + if (!string.IsNullOrEmpty(nickname) && !string.IsNullOrEmpty(uid) && !isAddOrUpdateBuyer) + { + isAddOrUpdateBuyer = true; + try + { + AddOrUpdateBuyer(uid, username, nickname); + } + catch + { + } + isAddOrUpdateBuyer = false; + } + } + }); + } + } + } + + bool isAddOrUpdateBuyer = false; + + void AddOrUpdateBuyer(string uid, string username, string nickname) + { + Thread.Sleep(2000); + + List cookieList = WPFCEFBrowser.GetCookieList(shopCookieHead, CefWebBrowser.GetCookieManager(null)); + + var buyerUrl = BaseClass.Build29WxObjString("user/add_taobao_buyer"); + + if (this.buyer == null || this.buyer.buyer_id != uid) + this.buyer = GlobalConfig.TaobaoBuyerLoginList.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.Build29WxObjString("user/mdy_taobao_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.Build29WxObjString("user/mdy_taobao_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(buyerMainUrl); + } + } + + private void LoginAgain() + { + if (this.currentUrl != buyerLoginUrl) + this.CefWebBrowser?.Load(buyerLoginUrl); + } + + #region 静态方法(检测/更新买手登录状态) + + public static void CheckBuyerLogin(List checkBuyers, bool isShowProgress = true) + { + for (int i = 0; i < checkBuyers.Count; i++) + { + var buyer = GlobalConfig.TaobaoBuyerLoginList.FirstOrDefault(v => v.buyer_id == checkBuyers[i].buyer_id); + var buys = GlobalConfig.TaobaoBuyerLoginList.Where(v => v.buyer_id == checkBuyers[i].buyer_id).ToList(); + if (buyer == null) + continue; + + // 先从服务端取最新cookie + var url = BaseClass.Build29WxObjString("user/get_taobao_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) + { + return; + + 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.Build29WxObjString("user/mdy_taobao_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 + } + + + + internal class CefKeyboardHandler : IKeyboardHandler + { + public bool OnKeyEvent(IWebBrowser browserControl, IBrowser browser, KeyType type, int windowsKeyCode, int nativeKeyCode, CefEventFlags modifiers, bool isSystemKey) + { + if (type == KeyType.KeyUp && Enum.IsDefined(typeof(System.Windows.Forms.Keys), windowsKeyCode)) + { + var key = (System.Windows.Forms.Keys)windowsKeyCode; + switch (key) + { + case System.Windows.Forms.Keys.F12: + browser.ShowDevTools(); + break; + + case System.Windows.Forms.Keys.F5: + + if (modifiers == CefEventFlags.ControlDown) + { + //MessageBox.Show("ctrl+f5"); + browser.Reload(true); //强制忽略缓存 + } + else + { + //MessageBox.Show("f5"); + browser.Reload(); + } + break; + } + } + return false; + } + + public bool OnPreKeyEvent(IWebBrowser browserControl, IBrowser browser, KeyType type, int windowsKeyCode, int nativeKeyCode, CefEventFlags modifiers, bool isSystemKey, ref bool isKeyboardShortcut) + { + return false; + } + } +} \ No newline at end of file diff --git a/29WxOrderWpf/Views/TaobaoLoginView.xaml b/29WxOrderWpf/Views/TaobaoLoginView.xaml new file mode 100644 index 0000000..e0079b3 --- /dev/null +++ b/29WxOrderWpf/Views/TaobaoLoginView.xaml @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/29WxOrderWpf/Views/TaobaoLoginView.xaml.cs b/29WxOrderWpf/Views/TaobaoLoginView.xaml.cs new file mode 100644 index 0000000..3031914 --- /dev/null +++ b/29WxOrderWpf/Views/TaobaoLoginView.xaml.cs @@ -0,0 +1,63 @@ +using _29WxOrderWpf.BaseWindows; +using _29WxOrderWpf.ViewModels; +using AllBase.Model.DBModel; +using CefSharp.Wpf; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Input; +using System.Windows.Media; + +namespace _29WxOrderWpf.Views +{ + /// + /// 淘宝买手登录窗口(WPF 版 TaobaoLoginView) + /// + public partial class TaobaoLoginView : UserControl + { + /// 视图模型 + public TaobaoLoginViewModel ViewModel { get; } + + public TaobaoLoginView(BuyerLoginInfo buyerInfo) + { + + InitializeComponent(); + + ViewModel = new TaobaoLoginViewModel(buyerInfo); + ViewModel.BrowserCreated += ViewModel_BrowserCreated; + ViewModel.RequestClose += ViewModel_RequestClose; + DataContext = ViewModel; + } + + private void TaobaoLoginView_Loaded(object sender, RoutedEventArgs e) + { + ViewModel.Start(); + } + + private void TaobaoLoginView_Closed(object sender, System.EventArgs e) + { + ViewModel.Stop(); + } + + private void ViewModel_BrowserCreated(ChromiumWebBrowser browser) + { + Grid.SetRow(browser, 0); + Grid.SetColumn(browser, 0); + BrowserHost.Children.Add(browser); + } + + private void ViewModel_RequestClose() + { + Window parentWindow = Window.GetWindow(this); + if (this.IsLoaded && parentWindow != null) + parentWindow.Close(); + } + + private void txtAddress_KeyDown(object sender, KeyEventArgs e) + { + if (e.Key == Key.Enter) + { + ViewModel.ReloadCommand.Execute(null); + } + } + } +} \ No newline at end of file diff --git a/AllBase/Helper/GlobalConfig.cs b/AllBase/Helper/GlobalConfig.cs index 2904b39..622a48f 100644 --- a/AllBase/Helper/GlobalConfig.cs +++ b/AllBase/Helper/GlobalConfig.cs @@ -33,10 +33,18 @@ namespace AllBase.Helper /// 拼多多买手列表 /// public static ObservableCollectionThreadSafe PDDBuyerLoginList { get; set; } = new ObservableCollectionThreadSafe(); - /// - /// 当前拼多多买手 - /// - public static BuyerLoginInfo CurrentPddBuyer { get; set; } + /// + /// 淘宝买手列表 + /// + public static ObservableCollectionThreadSafe TaobaoBuyerLoginList { get; set; } = new ObservableCollectionThreadSafe(); + /// + /// 当前拼多多买手 + /// + public static BuyerLoginInfo CurrentPddBuyer { get; set; } + /// + /// 当前淘宝买手 + /// + public static BuyerLoginInfo CurrentTaobaoBuyer { get; set; } /// /// 支付宝密码 /// diff --git a/AllBase/Model/DBModel/user_payment_record.cs b/AllBase/Model/DBModel/user_payment_record.cs index 00295eb..435ed6c 100644 --- a/AllBase/Model/DBModel/user_payment_record.cs +++ b/AllBase/Model/DBModel/user_payment_record.cs @@ -84,6 +84,8 @@ namespace AllBase.Model.DBModel 支付宝在线充值 = 30, 云仓退货支出 = 31, 礼物单退费 = 34, + 额外订单创建 = 35, + 额外订单作废 = 36, } /* diff --git a/Work/KJDServer.API/WXOrder/WxOrderServiceApi.cs b/Work/KJDServer.API/WXOrder/WxOrderServiceApi.cs index 8d87644..de382d2 100644 --- a/Work/KJDServer.API/WXOrder/WxOrderServiceApi.cs +++ b/Work/KJDServer.API/WXOrder/WxOrderServiceApi.cs @@ -31,7 +31,7 @@ namespace Work.KJDServer.API.WXOrder NamingStrategy = new SnakeCaseNamingStrategy() } }); - if (ret.Code == 200) + if (ret?.Code == 200) { return ret.Data; }