diff --git a/客户端/齐越慧眼/齐越慧眼/ApiHelper.cs b/客户端/齐越慧眼/齐越慧眼/ApiHelper.cs index eb455c6..d9c1bfd 100644 --- a/客户端/齐越慧眼/齐越慧眼/ApiHelper.cs +++ b/客户端/齐越慧眼/齐越慧眼/ApiHelper.cs @@ -21,7 +21,7 @@ namespace 齐越慧眼 public static string JwtToken { get { - + return "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiIxNDA1MTUxNjE5NTk0NTg4MTYwIiwidGVhbUlkIjoiMTQzOTg5OTEyMzk1NTI3MzcyOCIsImV4cCI6MTY3MDQ3MDkyNX0.iUkxjlPOsuLSuoUG9-O7VIkI33fDlu9AmPdqJBTBa-w"; if (string.IsNullOrEmpty(jwtToken)) { jwtToken = GetMemoryToken().Replace("\r\n",""); diff --git a/客户端/齐越慧眼/齐越慧眼/App.xaml.cs b/客户端/齐越慧眼/齐越慧眼/App.xaml.cs index f8b3c2b..92c7f0e 100644 --- a/客户端/齐越慧眼/齐越慧眼/App.xaml.cs +++ b/客户端/齐越慧眼/齐越慧眼/App.xaml.cs @@ -23,6 +23,12 @@ namespace 齐越慧眼 /// public static bool IsPriceTaskUser { get; set; } + /// + /// 京东Cookie + /// + public static string JdCookie { get; set; } + + public App() { diff --git a/客户端/齐越慧眼/齐越慧眼/Helpers/JdApiHelper.cs b/客户端/齐越慧眼/齐越慧眼/Helpers/JdApiHelper.cs new file mode 100644 index 0000000..c5da174 --- /dev/null +++ b/客户端/齐越慧眼/齐越慧眼/Helpers/JdApiHelper.cs @@ -0,0 +1,106 @@ +using Newtonsoft.Json.Linq; +using System; +using System.Collections; +using System.Collections.Generic; +using System.IO; +using System.Net; +using System.Net.Http; +using System.Net.Http.Headers; +using System.Text; + +namespace 齐越慧眼.Helpers +{ + public class JdApiHelper + { + string boundary = ""; + + public string UploadFile(byte[] file, string cookie) + { + + using (System.Net.WebClient webClient = new System.Net.WebClient()) + { + + webClient.Headers.Add("cookie", "__jdv=76161171|direct|-|none|-|1638869805933; __jdu=16388698059328286849; areaId=19; ipLoc-djd=19-1666-0-0; PCSYCityID=CN_440000_440600_0; _pst=16927647-35691944; unick=%E7%BC%BA%E9%98%B3%E5%85%89%E7%9A%84%E5%90%8A%E5%85%B0; pin=16927647-35691944; _tp=XgOfMtPFh92ZbKpmUXyiKkww9vdhsCgPikOUZsSQog8%3D; shshshfpa=6791a0cf-5a8f-7694-426b-368379ec439f-1638869824; shshshfpb=jb35ePu5DchO3Y4rjX%20xERA%3D%3D; qrsc=3; shshshfp=1f964b3df427da1779b7c5745b5cbddb; thor=015C6984E52D7AA6F54B79351F45CECCAA86F5B71F7807178D7E5044B5B8C528095D1EC065B7BB3B3478716F0193B94DCA09CD8C24E4EF5B8FEF4E26CA166E59681381AF92538D12DD17E89019060216036A0F30231A3CA47AD2B56A508B462F2651A1976D997C9A16073A0DA758F3DDF61B41359BED5A7FC84C16677B4FE6CA75A472DB8A772628BDBCB39A9B39ADA97072F2268D249D74E955B0F17A413D89; pinId=xpLDZpChZphYLUlvWdbaKvwZj9lbjz-c; __jda=76161171.16388698059328286849.1638869806.1638869806.1638879362.2; __jdb=76161171.4.16388698059328286849|2.1638879362; __jdc=76161171; shshshsID=d20602783dcaaffcb5355ea48291319c_2_1638879385194; 3AB9D23F7A4B3C9B=RMPGIHATPH4SBVV7LECL6XAHEWL242U2UZT6MW2CFKUCKQVVMS7HKIU7GT2O63I5A3SUEKPWBSHOLYCUQ3N7HMKZ5E"); + webClient.Headers.Add("origin", "https://www.jd.com"); + webClient.Headers.Add("referer", "https://www.jd.com"); + webClient.Headers.Add("sec-fetch-dest", "iframe"); + webClient.Headers.Add("sec-fetch-mode", "navigate"); + webClient.Headers.Add("sec-fetch-site", "same-site"); + webClient.Headers.Add("sec-fetch-user", "?1"); + webClient.Headers.Add("upgrade-insecure-requests", "1"); + webClient.Headers.Add("accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9"); + webClient.Headers.Add("accept-encoding", " deflate, br"); + webClient.Headers.Add("accept-language", "zh-CN,zh;q=0.9"); + webClient.Headers.Add("cache-control", "no-cache"); + // 边界符 + var boundary = "---------------" + DateTime.Now.Ticks.ToString("x"); + + webClient.Headers.Add("content-type", $"multipart/form-data; boundary={boundary}"); + + + var b = GetFileData("upload.jpg", new MemoryStream(file), boundary: boundary); + var result = webClient.UploadData("https://search.jd.com/image?op=upload", b.ToArray()); + string json = Encoding.Default.GetString(result); + + return json; + } + return string.Empty; + } + + + + public static MemoryStream GetFileData(string fileName, MemoryStream file, string fileKeyName = "file", string boundary = "") + { + + + MemoryStream memStream = new MemoryStream(); + + // 边界符 + var beginBoundary = Encoding.ASCII.GetBytes("--" + boundary + "\r\n"); + // 最后的结束符 + var endBoundary = Encoding.ASCII.GetBytes("--" + boundary + "--\r\n"); + + + //// 写入字符串的Key + //var stringKeyHeader = "--" + boundary + + // "\r\nContent-Disposition: form-data; name=\"{0}\"" + + // "\r\n\r\n{1}\r\n"; + + + // 写入文件 + const string filePartHeader = + "Content-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"\r\n" + + "Content-Type: image/jpeg\r\n\r\n"; + var header = string.Format(filePartHeader, fileKeyName, fileName); + var headerbytes = Encoding.UTF8.GetBytes(header); + + memStream.Write(beginBoundary, 0, beginBoundary.Length); + memStream.Write(headerbytes, 0, headerbytes.Length); + + var buffer = new byte[1024]; + int bytesRead; // =0 + file.Seek(0, SeekOrigin.Begin); + while ((bytesRead = file.Read(buffer, 0, buffer.Length)) != 0) + { + memStream.Write(buffer, 0, bytesRead); + } + + // 写入换行 + var contentLine = Encoding.ASCII.GetBytes("\r\n"); + memStream.Write(contentLine, 0, contentLine.Length); + + // 写入最后的结束边界符 + memStream.Write(endBoundary, 0, endBoundary.Length); + + + + memStream.Position = 0; + return memStream; + //memStream.Close(); + + + //requestStream.Close(); + + } + } +} diff --git a/客户端/齐越慧眼/齐越慧眼/MainWindow.xaml.cs b/客户端/齐越慧眼/齐越慧眼/MainWindow.xaml.cs index 92d4358..ad8e494 100644 --- a/客户端/齐越慧眼/齐越慧眼/MainWindow.xaml.cs +++ b/客户端/齐越慧眼/齐越慧眼/MainWindow.xaml.cs @@ -13,6 +13,7 @@ using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; using HandyControl.Controls; +using 齐越慧眼.Helpers; namespace 齐越慧眼 { @@ -37,11 +38,18 @@ namespace 齐越慧眼 public static MainWindow Main; public MainWindow() { + Test(); + InitializeComponent(); Main = this; Loaded += MainWindow_Loaded; } + private void Test() + { + new JdApiHelper().UploadFile(System.IO.File.ReadAllBytes(@"C:\Users\feng\Desktop\4cd3c6af18ba9ed9.jpg"),""); + } + private void MainWindow_Loaded(object sender, RoutedEventArgs e) { diff --git a/客户端/齐越慧眼/齐越慧眼/UserControls/BrowerControl.xaml.cs b/客户端/齐越慧眼/齐越慧眼/UserControls/BrowerControl.xaml.cs index 82fbc68..8493e61 100644 --- a/客户端/齐越慧眼/齐越慧眼/UserControls/BrowerControl.xaml.cs +++ b/客户端/齐越慧眼/齐越慧眼/UserControls/BrowerControl.xaml.cs @@ -2,6 +2,7 @@ using CefSharp.Wpf; using System; using System.Collections.Generic; +using System.Net.Http; using System.Text.RegularExpressions; using System.Threading; using System.Threading.Tasks; @@ -19,9 +20,22 @@ namespace 齐越慧眼.UserControls { public HandyControl.Controls.TabItem Tab { get; set; } public ExtChromiumBrowser web; + + /// + /// 是否登录京东 + /// + public bool IsJustLoginJd { get; set; } + public BrowerControl(string url, HandyControl.Controls.TabItem tabItem) { InitializeComponent(); + + + if (url.Contains("ltype=logout&ReturnUrl=https://home.jd.com")) + { + IsJustLoginJd = true; + } + Tab = tabItem; web = new ExtChromiumBrowser(url) { @@ -38,29 +52,75 @@ namespace 齐越慧眼.UserControls //RequestHandler =new MyRequestHandler() }; - MyResourceRequestHandlerFactory myResourceRequestHandlerFactory = new MyResourceRequestHandlerFactory(this); - myResourceRequestHandlerFactory.Handlers.TryAdd("test", null); - - web.ResourceRequestHandlerFactory = myResourceRequestHandlerFactory; + if (!IsJustLoginJd) + { + MyResourceRequestHandlerFactory myResourceRequestHandlerFactory = new MyResourceRequestHandlerFactory(this); + myResourceRequestHandlerFactory.Handlers.TryAdd("test", null); + web.ResourceRequestHandlerFactory = myResourceRequestHandlerFactory; + } grid.Children.Add(web); Loaded += BrowerControl_Loaded; - web.JavascriptObjectRepository.Settings.LegacyBindingEnabled = true; - var cjs = new CefAsyncJS(); - cjs.Brower = this; - web.JavascriptObjectRepository.Register("hyCoreModel", cjs, BindingOptions.DefaultBinder); - web.StartNewWindow += Web_StartNewWindow; - web.TitleChanged += Web_TitleChanged; + + if (!IsJustLoginJd) + { + web.JavascriptObjectRepository.Settings.LegacyBindingEnabled = true; + var cjs = new CefAsyncJS(); + cjs.Brower = this; + web.JavascriptObjectRepository.Register("hyCoreModel", cjs, BindingOptions.DefaultBinder); + web.StartNewWindow += Web_StartNewWindow; + web.TitleChanged += Web_TitleChanged; + } web.AddressChanged += Web_AddressChanged; + } + private void Visitor_SendCookie(Cookie obj) + { + string cookies = obj.Name + ":" + obj.Value + ";"; + App.JdCookie += cookies; } private void Web_AddressChanged(object sender, DependencyPropertyChangedEventArgs e) { - Application.Current.Dispatcher.Invoke(()=> { + Application.Current.Dispatcher.Invoke(() => + { txtUrl.Text = e.NewValue.ToString(); }); + + + if (IsJustLoginJd) + { + if (e.NewValue.ToString().StartsWith("https://home.jd.com")) + { + CookieVisitor visitor = new CookieVisitor(); + visitor.SendCookie += Visitor_SendCookie; + ICookieManager cookieManager = web.GetCookieManager(); + cookieManager.VisitAllCookies(visitor); + + WpfNoticeMsg.NoticeMessage.Show("请稍后,正在登录中..."); + + Task.Factory.StartNew(() => + { + while (IsJustLoginJd) + { + Thread.Sleep(5000); + + using (HttpClient http = new HttpClient()) + { + http.DefaultRequestHeaders.Add("Cookie", App.JdCookie); + var result = http.GetAsync("https://passport.jd.com/user/petName/getUserInfoForMiniJd.action?callback=jQuery3218901&_=0").Result; + if (result.IsSuccessStatusCode) + { + WpfNoticeMsg.NoticeMessage.Show("登录成功,请返回重试!"); + break; + } + } + + } + }); + } + } } public void Exit() diff --git a/客户端/齐越慧眼/齐越慧眼/UserControls/BrowerTabPanelControl.xaml.cs b/客户端/齐越慧眼/齐越慧眼/UserControls/BrowerTabPanelControl.xaml.cs index 4ee78b9..aa18312 100644 --- a/客户端/齐越慧眼/齐越慧眼/UserControls/BrowerTabPanelControl.xaml.cs +++ b/客户端/齐越慧眼/齐越慧眼/UserControls/BrowerTabPanelControl.xaml.cs @@ -10,6 +10,7 @@ using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; +using 齐越慧眼.Helpers; namespace 齐越慧眼.UserControls { @@ -86,5 +87,32 @@ namespace 齐越慧眼.UserControls tab.Items.Add(item); }); } + + public void OpenSomePicItemForJd(byte[] imgFile) + { + + string json = new JdApiHelper().UploadFile(imgFile, App.JdCookie); + string path = System.Text.RegularExpressions.Regex.Match(json, ".callback\\('(.*?)'\\);").Groups[1].Value; + + string url = $"https://search.jd.com/image?path={System.Web.HttpUtility.UrlEncode(path)}&op=search"; + //https://search.jd.com/image?path={}&op=search + + Application.Current.Dispatcher.Invoke(() => + { + MainWindow.Main.tab.SelectedIndex = 2; + var item = new HandyControl.Controls.TabItem() { IsSelected = true }; + item.Closed += (e, s) => + { + var obj = e as HandyControl.Controls.TabItem; + var brower = obj.Content as SomeBrowerControl; + brower.Exit(); + + }; + SomeBrowerControl browerControl = new SomeBrowerControl(url, true, item); + item.Content = browerControl; + tab.Items.Add(item); + }); + } + } } diff --git a/客户端/齐越慧眼/齐越慧眼/UserControls/ItemControl.xaml.cs b/客户端/齐越慧眼/齐越慧眼/UserControls/ItemControl.xaml.cs index 71b900f..5900dc3 100644 --- a/客户端/齐越慧眼/齐越慧眼/UserControls/ItemControl.xaml.cs +++ b/客户端/齐越慧眼/齐越慧眼/UserControls/ItemControl.xaml.cs @@ -111,7 +111,28 @@ namespace 齐越慧眼.UserControls { byte[] arr = client.DownloadData(url.Replace("_.webp", "")); arr = GetSmallImgArr(arr); - BrowerTabPanelControl.Main.OpenSomePicItem(Convert.ToBase64String(arr)); + + if (url.Contains("jd.com")||url.Contains("360buyimg.com")) + { + if (string.IsNullOrEmpty(App.JdCookie)) + { + Application.Current.Dispatcher.Invoke(() => + { + BrowerTabPanelControl.Main.NewTab("https://passport.jd.com/uc/login?ltype=logout&ReturnUrl=https://home.jd.com/"); + }); + } + else { + + + BrowerTabPanelControl.Main.OpenSomePicItemForJd(arr); + + } + + } + else + { + BrowerTabPanelControl.Main.OpenSomePicItem(Convert.ToBase64String(arr)); + } return String.Empty; } catch (Exception ex) diff --git a/客户端/齐越慧眼/齐越慧眼/UserControls/SomeBrowerControl.xaml.cs b/客户端/齐越慧眼/齐越慧眼/UserControls/SomeBrowerControl.xaml.cs index 4e9fd58..d1f5ea3 100644 --- a/客户端/齐越慧眼/齐越慧眼/UserControls/SomeBrowerControl.xaml.cs +++ b/客户端/齐越慧眼/齐越慧眼/UserControls/SomeBrowerControl.xaml.cs @@ -20,6 +20,7 @@ namespace 齐越慧眼.UserControls { public HandyControl.Controls.TabItem Tab { get; set; } public string Base64Img { get; set; } + public byte[] ImgBytes { get; set; } public ExtChromiumBrowser web; public SomeBrowerControl(string base64, HandyControl.Controls.TabItem tabItem) { @@ -61,6 +62,49 @@ namespace 齐越慧眼.UserControls this.KeyDown += BrowerControl_KeyDown; } + public SomeBrowerControl(string url,bool isJd, HandyControl.Controls.TabItem tabItem) + { + InitializeComponent(); + Tab = tabItem; + + web = new ExtChromiumBrowser(url) + { + BrowserSettings = + { + DefaultEncoding = "UTF-8", + Plugins = CefState.Enabled, + //关于跨域限制 + //WebSecurity = CefState.Disabled, + ApplicationCache = CefState.Enabled, + LocalStorage = CefState.Enabled + + }, + + //RequestHandler =new MyRequestHandler() + }; + + MyResourceRequestHandlerFactory myResourceRequestHandlerFactory = new MyResourceRequestHandlerFactory(this); + myResourceRequestHandlerFactory.Handlers.TryAdd("test", null); + + web.ResourceRequestHandlerFactory = myResourceRequestHandlerFactory; + + + grid.Children.Add(web); + Loaded += BrowerControl_Loaded; + + + //web.JavascriptObjectRepository.Settings.LegacyBindingEnabled = true; + //var cjs = new Cef2AsyncJS(); + //cjs.Brower = this; + //web.JavascriptObjectRepository.Register("hyCoreModel", cjs, BindingOptions.DefaultBinder); + //web.StartNewWindow += Web_StartNewWindow; + //web.TitleChanged += Web_TitleChanged; + //web.AddressChanged += Web_AddressChanged; + //web.ExecuteScriptAsyncWhenPageLoaded("hyCoreModel.onLoad()"); + //this.KeyDown += BrowerControl_KeyDown; + } + + private void BrowerControl_KeyDown(object sender, System.Windows.Input.KeyEventArgs e) { if (e.Key == Key.F12) @@ -119,6 +163,7 @@ namespace 齐越慧眼.UserControls private void BrowerControl_Loaded(object sender, RoutedEventArgs e) { + tip.Visibility = Visibility.Collapsed; Thread t = new Thread(() => { IWebBrowser webBrowser = null; diff --git a/客户端/齐越慧眼/齐越慧眼/cefhelper/CefLifeSpanHandler.cs b/客户端/齐越慧眼/齐越慧眼/cefhelper/CefLifeSpanHandler.cs index 48b407d..cc7e2c8 100644 --- a/客户端/齐越慧眼/齐越慧眼/cefhelper/CefLifeSpanHandler.cs +++ b/客户端/齐越慧眼/齐越慧眼/cefhelper/CefLifeSpanHandler.cs @@ -46,4 +46,28 @@ namespace 齐越慧眼.cefhelper return true; } } + + public class CookieVisitor : CefSharp.ICookieVisitor + { + public event Action SendCookie; + public void Dispose() + { + + } + + public bool Visit(Cookie cookie, int count, int total, ref bool deleteCookie) + { + deleteCookie = false; + if (SendCookie != null) + { + SendCookie(cookie); + } + + return true; + + } + + + + } }