Browse Source

加入请求拦截

master
feng 4 years ago
parent
commit
f2addbc874
  1. 2
      客户端/齐越慧眼/齐越慧眼/ApiHelper.cs
  2. 2
      客户端/齐越慧眼/齐越慧眼/App.xaml.cs
  3. 106
      客户端/齐越慧眼/齐越慧眼/Helpers/JdApiHelper.cs
  4. 18
      客户端/齐越慧眼/齐越慧眼/UserControls/BrowerTabPanelControl.xaml.cs
  5. 9
      客户端/齐越慧眼/齐越慧眼/UserControls/ItemControl.xaml.cs
  6. 104
      客户端/齐越慧眼/齐越慧眼/UserControls/SomeBrowerControl.xaml.cs
  7. 95
      客户端/齐越慧眼/齐越慧眼/cefhelper/CefRequestHandler.cs

2
客户端/齐越慧眼/齐越慧眼/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))
{

2
客户端/齐越慧眼/齐越慧眼/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");

106
客户端/齐越慧眼/齐越慧眼/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("请退出重新登录京东后重试!");
}
}

18
客户端/齐越慧眼/齐越慧眼/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);
});

9
客户端/齐越慧眼/齐越慧眼/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));
}

104
客户端/齐越慧眼/齐越慧眼/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
}

95
客户端/齐越慧眼/齐越慧眼/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;
/// <summary>
/// 是否过滤,如果不过滤就截获
/// </summary>
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()); }
}
}
}

Loading…
Cancel
Save