diff --git a/客户端/齐越慧眼/齐越慧眼/ApiHelper.cs b/客户端/齐越慧眼/齐越慧眼/ApiHelper.cs index 933b678..661443c 100644 --- a/客户端/齐越慧眼/齐越慧眼/ApiHelper.cs +++ b/客户端/齐越慧眼/齐越慧眼/ApiHelper.cs @@ -24,7 +24,7 @@ namespace 齐越慧眼 public static string JwtToken { get { - // return "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiIxNDM5OTA3NDY1MDMzNDIwODAwIiwidGVhbUlkIjoiMTQzNjI4ODUwMDIzNTI0MzUyMCIsImV4cCI6MTY3MTAwOTkyM30.p3yLjbeUilDZxkfRv4GaCvIYJ_jFoe_8Sw8hY18swdA"; + return "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiIxNDM5OTA3NDY1MDMzNDIwODAwIiwidGVhbUlkIjoiMTQzNjI4ODUwMDIzNTI0MzUyMCIsImV4cCI6MTY3MTAwOTkyM30.p3yLjbeUilDZxkfRv4GaCvIYJ_jFoe_8Sw8hY18swdA"; if (string.IsNullOrEmpty(jwtToken)) { diff --git a/客户端/齐越慧眼/齐越慧眼/App.xaml.cs b/客户端/齐越慧眼/齐越慧眼/App.xaml.cs index 92c7f0e..8aa9288 100644 --- a/客户端/齐越慧眼/齐越慧眼/App.xaml.cs +++ b/客户端/齐越慧眼/齐越慧眼/App.xaml.cs @@ -48,6 +48,8 @@ namespace 齐越慧眼 settings.CefCommandLineArgs.Add("enable-media-stream", "0"); settings.CefCommandLineArgs.Add("--ignore-urlfetcher-cert-requests", "1"); settings.CefCommandLineArgs.Add("--ignore-certificate-errors", "1"); + settings.CefCommandLineArgs.Add("--disable-web-security", ""); + settings.CefCommandLineArgs.Add("disable-gpu", "0"); diff --git a/客户端/齐越慧眼/齐越慧眼/Helpers/JdApiHelper.cs b/客户端/齐越慧眼/齐越慧眼/Helpers/JdApiHelper.cs index a93e09e..8807383 100644 --- a/客户端/齐越慧眼/齐越慧眼/Helpers/JdApiHelper.cs +++ b/客户端/齐越慧眼/齐越慧眼/Helpers/JdApiHelper.cs @@ -7,6 +7,7 @@ using System.Net; using System.Net.Http; using System.Net.Http.Headers; using System.Text; +using System.Windows; namespace 齐越慧眼.Helpers { @@ -14,8 +15,98 @@ namespace 齐越慧眼.Helpers { string boundary = ""; + + private string HttpPostData(string url, string cookie, byte[] files, string fileKeyName="file") + { + string responseContent; + var memStream = new MemoryStream(); + var webRequest = (HttpWebRequest)WebRequest.Create(url); + // 边界符 + var boundary = "---------------" + DateTime.Now.Ticks.ToString("x"); + // 边界符 + var beginBoundary = Encoding.ASCII.GetBytes("--" + boundary + "\r\n"); + + // 最后的结束符 + var endBoundary = Encoding.ASCII.GetBytes("--" + boundary + "--\r\n"); + + // 设置属性 + webRequest.Method = "POST"; + webRequest.ContentType = "multipart/form-data; boundary=" + boundary; + + // 写入文件 + 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, "aaa.jpg"); + var headerbytes = Encoding.UTF8.GetBytes(header); + + memStream.Write(beginBoundary, 0, beginBoundary.Length); + memStream.Write(headerbytes, 0, headerbytes.Length); + + memStream.Write(files); + + //// 写入字符串的Key + //var stringKeyHeader = "\r\n--" + boundary + + // "\r\nContent-Disposition: form-data; name=\"{0}\"" + + // "\r\n\r\n{1}\r\n"; + + //foreach (byte[] formitembytes in from string key in stringDict.Keys + // select string.Format(stringKeyHeader, key, stringDict[key]) + // into formitem + // select Encoding.UTF8.GetBytes(formitem)) + //{ + // memStream.Write(formitembytes, 0, formitembytes.Length); + //} + + // 写入最后的结束边界符 + memStream.Write(endBoundary, 0, endBoundary.Length); + + webRequest.ContentLength = memStream.Length; + + var requestStream = webRequest.GetRequestStream(); + + memStream.Position = 0; + var tempBuffer = new byte[memStream.Length]; + memStream.Read(tempBuffer, 0, tempBuffer.Length); + memStream.Close(); + + requestStream.Write(tempBuffer, 0, tempBuffer.Length); + requestStream.Close(); + + webRequest.Headers.Add("cookie", cookie); + webRequest.Headers.Add("origin", "https://www.jd.com"); + webRequest.Headers.Add("referer", "https://www.jd.com"); + webRequest.Headers.Add("sec-fetch-dest", "iframe"); + webRequest.Headers.Add("sec-fetch-mode", "navigate"); + webRequest.Headers.Add("sec-fetch-site", "same-site"); + webRequest.Headers.Add("sec-fetch-user", "?1"); + webRequest.Headers.Add("upgrade-insecure-requests", "1"); + webRequest.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"); + webRequest.Headers.Add("accept-encoding", " deflate, br"); + webRequest.Headers.Add("accept-language", "zh-CN,zh;q=0.9"); + webRequest.Headers.Add("cache-control", "no-cache"); + + var httpWebResponse = (HttpWebResponse)webRequest.GetResponse(); + + using (var httpStreamReader = new StreamReader(httpWebResponse.GetResponseStream(), + Encoding.GetEncoding("utf-8"))) + { + responseContent = httpStreamReader.ReadToEnd(); + } + + httpWebResponse.Close(); + webRequest.Abort(); + + return responseContent; + } + public string UploadFile(byte[] file, string cookie) { + // 边界符 + var boundary = "---------------" + DateTime.Now.Ticks.ToString("x"); + var b = GetFileData("upload.jpg", new MemoryStream(file), boundary: boundary); + // return HttpPostData("https://search.jd.com/image?op=upload", cookie, file); + //return ""; using (System.Net.WebClient webClient = new System.Net.WebClient()) { @@ -33,19 +124,26 @@ namespace 齐越慧眼.Helpers 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; } - catch(Exception ex) { + catch(WebException ex) + { + string responseText; + + using (var reader = new StreamReader(ex.Response.GetResponseStream())) + { + responseText = reader.ReadToEnd(); + } + + MessageBox.Show(responseText); WpfNoticeMsg.NoticeMessage.Show("请退出重新登录京东后重试!"); } } diff --git a/客户端/齐越慧眼/齐越慧眼/UserControls/BrowerTabPanelControl.xaml.cs b/客户端/齐越慧眼/齐越慧眼/UserControls/BrowerTabPanelControl.xaml.cs index 05a4319..5822c4d 100644 --- a/客户端/齐越慧眼/齐越慧眼/UserControls/BrowerTabPanelControl.xaml.cs +++ b/客户端/齐越慧眼/齐越慧眼/UserControls/BrowerTabPanelControl.xaml.cs @@ -88,18 +88,18 @@ namespace 齐越慧眼.UserControls }); } - public void OpenSomePicItemForJd(byte[] imgFile) + public void OpenSomePicItemForJd(string imgBase64) { - string json = new JdApiHelper().UploadFile(imgFile, App.JdCookie); - string path = System.Text.RegularExpressions.Regex.Match(json, ".callback\\('(.*?)'\\);").Groups[1].Value; + //string json = new JdApiHelper().UploadFile(imgFile, App.JdCookie); + //string path = System.Text.RegularExpressions.Regex.Match(json, ".callback\\('(.*?)'\\);").Groups[1].Value; - if (string.IsNullOrEmpty(path)) - { - WpfNoticeMsg.NoticeMessage.Show("图片上传失败", "搜图失败"); - } + //if (string.IsNullOrEmpty(path)) + //{ + // WpfNoticeMsg.NoticeMessage.Show("图片上传失败", "搜图失败"); + //} - string url = $"https://search.jd.com/image?path={path}&op=search"; + //string url = $"https://search.jd.com/image?path={path}&op=search"; //https://search.jd.com/image?path={}&op=search Application.Current.Dispatcher.Invoke(() => @@ -113,7 +113,7 @@ namespace 齐越慧眼.UserControls brower.Exit(); }; - SomeBrowerControl browerControl = new SomeBrowerControl(url, true, item); + SomeBrowerControl browerControl = new SomeBrowerControl(imgBase64, true, item); item.Content = browerControl; tab.Items.Add(item); }); diff --git a/客户端/齐越慧眼/齐越慧眼/UserControls/ItemControl.xaml.cs b/客户端/齐越慧眼/齐越慧眼/UserControls/ItemControl.xaml.cs index dec0baa..89c2591 100644 --- a/客户端/齐越慧眼/齐越慧眼/UserControls/ItemControl.xaml.cs +++ b/客户端/齐越慧眼/齐越慧眼/UserControls/ItemControl.xaml.cs @@ -115,8 +115,10 @@ namespace 齐越慧眼.UserControls } byte[] arr = client.DownloadData(url.Replace("_.webp", "")); - arr = GetSmallImgArr(arr); - + if (arr.Length > 10000) + { + arr = GetSmallImgArr(arr); + } //京东搜图 if (type=="2") { @@ -130,8 +132,7 @@ namespace 齐越慧眼.UserControls } else { - - BrowerTabPanelControl.Main.OpenSomePicItemForJd(arr); + BrowerTabPanelControl.Main.OpenSomePicItemForJd(Convert.ToBase64String(arr)); } diff --git a/客户端/齐越慧眼/齐越慧眼/UserControls/SomeBrowerControl.xaml.cs b/客户端/齐越慧眼/齐越慧眼/UserControls/SomeBrowerControl.xaml.cs index 85c7491..a86b941 100644 --- a/客户端/齐越慧眼/齐越慧眼/UserControls/SomeBrowerControl.xaml.cs +++ b/客户端/齐越慧眼/齐越慧眼/UserControls/SomeBrowerControl.xaml.cs @@ -37,12 +37,14 @@ namespace 齐越慧眼.UserControls //WebSecurity = CefState.Disabled, ApplicationCache = CefState.Enabled, LocalStorage = CefState.Enabled - + }, - //RequestHandler =new MyRequestHandler() + // RequestHandler =new MyRequestHandler() }; + //web.CefCommandLineArgs.Add("--disable-web-security", ""); + MyResourceRequestHandlerFactory myResourceRequestHandlerFactory = new MyResourceRequestHandlerFactory(this); myResourceRequestHandlerFactory.Handlers.TryAdd("test",null); @@ -65,12 +67,13 @@ namespace 齐越慧眼.UserControls public bool IsJd { get; set; } - public SomeBrowerControl(string url,bool isJd, HandyControl.Controls.TabItem tabItem) + public SomeBrowerControl(string base64, bool isJd, HandyControl.Controls.TabItem tabItem) { InitializeComponent(); Tab = tabItem; IsJd = isJd; - web = new ExtChromiumBrowser(url) + Base64Img = base64; + web = new ExtChromiumBrowser("https://www.jd.com/") { BrowserSettings = { @@ -79,8 +82,9 @@ namespace 齐越慧眼.UserControls //关于跨域限制 //WebSecurity = CefState.Disabled, ApplicationCache = CefState.Enabled, - LocalStorage = CefState.Enabled - + LocalStorage = CefState.Enabled, + + }, //RequestHandler =new MyRequestHandler() @@ -94,16 +98,15 @@ namespace 齐越慧眼.UserControls 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.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; + web.ExecuteScriptAsyncWhenPageLoaded("hyCoreModel.onLoad()"); + this.KeyDown += BrowerControl_KeyDown; } @@ -154,6 +157,8 @@ namespace 齐越慧眼.UserControls StartPage(); }); } + + } private void Web_StartNewWindow(object sender, NewWindowEventArgs e) @@ -166,10 +171,6 @@ namespace 齐越慧眼.UserControls private void BrowerControl_Loaded(object sender, RoutedEventArgs e) { - if(IsJd) - tip.Visibility = Visibility.Collapsed; - - Thread t = new Thread(() => { IWebBrowser webBrowser = null; @@ -433,7 +434,43 @@ namespace 齐越慧眼.UserControls public void RunSomeAction() { - DoJavaScript(@$" + if (IsJd) { + string js = @$" + + var bytes=window.atob(""{Base64Img}""); + + var ab = new ArrayBuffer(bytes.length); + var ia = new Uint8Array(ab); + for (var i = 0; i < bytes.length; i++) {{ + ia[i] = bytes.charCodeAt(i); + }} + var lob=new Blob( [ab] , {{type : 'image/png'}}); + + var form= document.getElementById(""search-img-upload""); + var formData = new FormData(); + + formData.append(""file"",lob, Date.now() + '.jpg'); + + $.ajax({{ + url : form.action, + type : ""POST"", + data : formData, + contentType : false, + processData : false, + success:function(data){{ +hyCoreModel.onSomePicRes(""err""); + $(document.head).append(data); +console.log(data); + }}, +error:function(err){{alert('出错');window.errAjax=err;console.log(err);hyCoreModel.onSomePicRes(""err"");}} + }}); + "; + + DoJavaScript(js); + } + else + { + DoJavaScript(@$" window.lib.mtop.request({{ api: ""mtop.1688.imageService.putImage"", data: JSON.stringify({{ @@ -448,6 +485,7 @@ namespace 齐越慧眼.UserControls hyCoreModel.onSomePicRes(res) }}) "); + } } private bool AddCss() @@ -667,18 +705,30 @@ namespace 齐越慧眼.UserControls public void onSomePicRes(dynamic data) { - string json = Newtonsoft.Json.JsonConvert.SerializeObject(data); - //{"imageId":"0","requestId":"a837075218924fd6a6969eb1d0596c64","sessionId":"6c4a3e67343c41dcbfb3ac0b2fb82abd"} - string imgId = data.data.imageId; - string requestId = data.data.requestId; - string sessionId= data.data.sessionId; - Application.Current.Dispatcher.Invoke(() => + if (Brower.IsJd) + { + Application.Current.Dispatcher.Invoke(() => + { + Brower.tip.Visibility = Visibility.Collapsed; + }); + + } + else { - Brower.web.Load($"https://s.1688.com/youyuan/index.htm?tab=imageSearch&imageAddress=&imageId={imgId}&spm=a260k.dacugeneral.search.0&imageIdList={imgId}"); - Brower.tip.Visibility = Visibility.Collapsed; - }); + string json = Newtonsoft.Json.JsonConvert.SerializeObject(data); + //{"imageId":"0","requestId":"a837075218924fd6a6969eb1d0596c64","sessionId":"6c4a3e67343c41dcbfb3ac0b2fb82abd"} + + string imgId = data.data.imageId; + string requestId = data.data.requestId; + string sessionId = data.data.sessionId; + Application.Current.Dispatcher.Invoke(() => + { + Brower.web.Load($"https://s.1688.com/youyuan/index.htm?tab=imageSearch&imageAddress=&imageId={imgId}&spm=a260k.dacugeneral.search.0&imageIdList={imgId}"); + Brower.tip.Visibility = Visibility.Collapsed; + }); + } //https://s.1688.com/youyuan/index.htm?tab=imageSearch&imageAddress=&imageId=1809207254297088602&spm=a260k.dacugeneral.search.0&imageIdList=1809207254297088602 } diff --git a/客户端/齐越慧眼/齐越慧眼/cefhelper/CefRequestHandler.cs b/客户端/齐越慧眼/齐越慧眼/cefhelper/CefRequestHandler.cs index 855b893..9c6aecb 100644 --- a/客户端/齐越慧眼/齐越慧眼/cefhelper/CefRequestHandler.cs +++ b/客户端/齐越慧眼/齐越慧眼/cefhelper/CefRequestHandler.cs @@ -84,5 +84,100 @@ namespace 齐越慧眼.cefhelper return base.OnResourceResponse(chromiumWebBrowser, browser, frame, request, response); } + + //protected override IResponseFilter GetResourceResponseFilter(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IRequest request, IResponse response) + //{ + // if (request.Url.Contains("search.jd.com")) + // { + // var fil = new MyResponseFilter(true, Brower, request.Url); + // return fil; + // } + + // return base.GetResourceResponseFilter(chromiumWebBrowser, browser, frame, request, response); + //} + } + + + + public class MyResponseFilter : IResponseFilter + { + public BrowerControl Brower; + private string Url; + public MyResponseFilter(bool _filter, BrowerControl brower, string url) { filter = _filter; Brower = brower; Url = url; } + + bool Disposed = false; + /// + /// 是否过滤,如果不过滤就截获 + /// + bool filter = false; + private MemoryStream memoryStream; + public void Dispose() + { + //memoryStream?.Dispose(); + //memoryStream = null; + } + public void Dispose(bool r) + { + if (Disposed) + return; + if (r) + { + memoryStream?.Dispose(); + memoryStream = null; + } + Disposed = true; + } + + public FilterStatus Filter(Stream dataIn, out long dataInRead, Stream dataOut, out long dataOutWritten) + { + if (dataIn == null) + { + dataInRead = 0; + dataOutWritten = 0; + + return FilterStatus.Done; + } + + ////Copy data to stream + dataIn.Position = 0; + dataIn.CopyTo(memoryStream); + byte[] response = null; + + string json = DataStr; + + + + response = Encoding.GetEncoding("gb2312").GetBytes(json); + + + + var ms = new MemoryStream(response); + ms.CopyTo(dataOut); + + + dataInRead = dataIn.Length; + dataOutWritten = response.Length; + + + + return FilterStatus.Done; + } + + public bool InitFilter() + { + memoryStream = new MemoryStream(); + + return true; + } + public byte[] Data + { + get { return memoryStream.ToArray(); } + } + + public string DataStr + { + get { return Encoding.UTF8.GetString(memoryStream.ToArray()); } + } + } }