CefSharp 获取POST(AJAX)、GET消息返回值(request)

    CefSharp作为专门为爬虫工具开发的库比Selenium这种开发目的是页面测试工具然后用来做爬虫的工具要贴心得多。我们操作网页的时候发送或者做了某个动作提交表单之后需要知道我们的动作或者提交是否成功,因为有的页面会因为网络延迟问题提交失败,需要准确的获取到发送消息后服务器的返回值,如果直接通过页面的弹窗获取发送消息后的结果会非常麻烦,有时候一个消息发送后会产生多种不同的返回结果,可能提交成功,可能提交失败,可能消息超时等等,如果能够直接获取到发送消息的Request,无疑会大大方便我们判断。

例如这是点击百度搜索框时产生的GET消息的返回值:

    CefSharp贴心的为开发者提供了网页运行的不同阶段的回调函数,类似于VUE前端框架的钩子函数。CefSharp允许开发者在POST或GET消息发送时修改提交的参数也就是postData,还可以拦截修改图片,JS文件,CSS样式等等,这篇文章只是记录如何获取GET或者POST消息提交后直接获取JSON、XML、HTML数据。

这些自定义功能都基于IResourceRequestHandler类,首先我们要创建一个新的类继承重写这个类中的方法。

public class ResourceRequestHandler : IResourceRequestHandler{/// <summary>/// Called on the CEF IO thread before a resource request is loaded. To optionally filter cookies for the request return a/// <see cref="ICookieAccessFilter"/> object./// </summary>/// <param name="chromiumWebBrowser">The ChromiumWebBrowser control.</param>/// <param name="browser">the browser object - may be null if originating from ServiceWorker or CefURLRequest.</param>/// <param name="frame">the frame object - may be null if originating from ServiceWorker or CefURLRequest.</param>/// <param name="request">the request object - can be modified in this callback.</param>/// <returns>To optionally filter cookies for the request return a ICookieAccessFilter instance otherwise return null.</returns>ICookieAccessFilter IResourceRequestHandler.GetCookieAccessFilter(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IRequest request){return GetCookieAccessFilter(chromiumWebBrowser, browser, frame, request);}/// <summary>/// Called on the CEF IO thread before a resource request is loaded. To optionally filter cookies for the request return a/// <see cref="ICookieAccessFilter"/> object./// </summary>/// <param name="chromiumWebBrowser">The ChromiumWebBrowser control.</param>/// <param name="browser">the browser object - may be null if originating from ServiceWorker or CefURLRequest.</param>/// <param name="frame">the frame object - may be null if originating from ServiceWorker or CefURLRequest.</param>/// <param name="request">the request object - can be modified in this callback.</param>/// <returns>To optionally filter cookies for the request return a ICookieAccessFilter instance otherwise return null.</returns>protected virtual ICookieAccessFilter GetCookieAccessFilter(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IRequest request){return null;}/// <summary>/// Called on the CEF IO thread before a resource is loaded. To specify a handler for the resource return a/// <see cref="IResourceHandler"/> object./// </summary>/// <param name="chromiumWebBrowser">The browser UI control.</param>/// <param name="browser">the browser object - may be null if originating from ServiceWorker or CefURLRequest.</param>/// <param name="frame">the frame object - may be null if originating from ServiceWorker or CefURLRequest.</param>/// <param name="request">the request object - cannot be modified in this callback.</param>/// <returns>/// To allow the resource to load using the default network loader return null otherwise return an instance of/// <see cref="IResourceHandler"/> with a valid stream./// </returns>IResourceHandler IResourceRequestHandler.GetResourceHandler(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IRequest request){return GetResourceHandler(chromiumWebBrowser, browser, frame, request);}/// <summary>/// Called on the CEF IO thread before a resource is loaded. To specify a handler for the resource return a/// <see cref="IResourceHandler"/> object./// </summary>/// <param name="chromiumWebBrowser">The browser UI control.</param>/// <param name="browser">the browser object - may be null if originating from ServiceWorker or CefURLRequest.</param>/// <param name="frame">the frame object - may be null if originating from ServiceWorker or CefURLRequest.</param>/// <param name="request">the request object - cannot be modified in this callback.</param>/// <returns>/// To allow the resource to load using the default network loader return null otherwise return an instance of/// <see cref="IResourceHandler"/> with a valid stream./// </returns>protected virtual IResourceHandler GetResourceHandler(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IRequest request){return null;}/// <summary>Called on the CEF IO thread to optionally filter resource response content.</summary>/// <param name="chromiumWebBrowser">The ChromiumWebBrowser control.</param>/// <param name="browser">the browser object - may be null if originating from ServiceWorker or CefURLRequest.</param>/// <param name="frame">the frame object - may be null if originating from ServiceWorker or CefURLRequest.</param>/// <param name="request">the request object - cannot be modified in this callback.</param>/// <param name="response">the response object - cannot be modified in this callback.</param>/// <returns>Return an IResponseFilter to intercept this response, otherwise return null.</returns>IResponseFilter IResourceRequestHandler.GetResourceResponseFilter(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IRequest request, IResponse response){return GetResourceResponseFilter(chromiumWebBrowser, browser, frame, request, response);}/// <summary>Called on the CEF IO thread to optionally filter resource response content.</summary>/// <param name="chromiumWebBrowser">The ChromiumWebBrowser control.</param>/// <param name="browser">the browser object - may be null if originating from ServiceWorker or CefURLRequest.</param>/// <param name="frame">the frame object - may be null if originating from ServiceWorker or CefURLRequest.</param>/// <param name="request">the request object - cannot be modified in this callback.</param>/// <param name="response">the response object - cannot be modified in this callback.</param>/// <returns>Return an IResponseFilter to intercept this response, otherwise return null.</returns>protected virtual IResponseFilter GetResourceResponseFilter(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IRequest request, IResponse response){return null;}/// <summary>/// Called on the CEF IO thread before a resource request is loaded. To redirect or change the resource load optionally modify/// <paramref name="request"/>. Modification of the request URL will be treated as a redirect./// </summary>/// <param name="chromiumWebBrowser">The ChromiumWebBrowser control.</param>/// <param name="browser">the browser object - may be null if originating from ServiceWorker or CefURLRequest.</param>/// <param name="frame">the frame object - may be null if originating from ServiceWorker or CefURLRequest.</param>/// <param name="request">the request object - can be modified in this callback.</param>/// <param name="callback">Callback interface used for asynchronous continuation of url requests.</param>/// <returns>/// Return <see cref="CefReturnValue.Continue"/> to continue the request immediately. Return/// <see cref="CefReturnValue.ContinueAsync"/> and call <see cref="IRequestCallback.Continue"/> or/// <see cref="IRequestCallback.Cancel"/> at a later time to continue or the cancel the request asynchronously. Return/// <see cref="CefReturnValue.Cancel"/> to cancel the request immediately./// </returns>CefReturnValue IResourceRequestHandler.OnBeforeResourceLoad(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IRequest request, IRequestCallback callback){return OnBeforeResourceLoad(chromiumWebBrowser, browser, frame, request, callback);}/// <summary>/// Called on the CEF IO thread before a resource request is loaded. To redirect or change the resource load optionally modify/// <paramref name="request"/>. Modification of the request URL will be treated as a redirect./// </summary>/// <param name="chromiumWebBrowser">The ChromiumWebBrowser control.</param>/// <param name="browser">the browser object - may be null if originating from ServiceWorker or CefURLRequest.</param>/// <param name="frame">the frame object - may be null if originating from ServiceWorker or CefURLRequest.</param>/// <param name="request">the request object - can be modified in this callback.</param>/// <param name="callback">Callback interface used for asynchronous continuation of url requests.</param>/// <returns>/// Return <see cref="CefReturnValue.Continue"/> to continue the request immediately. Return/// <see cref="CefReturnValue.ContinueAsync"/> and call <see cref="IRequestCallback.Continue"/> or/// <see cref="IRequestCallback.Cancel"/> at a later time to continue or the cancel the request asynchronously. Return/// <see cref="CefReturnValue.Cancel"/> to cancel the request immediately./// </returns>protected virtual CefReturnValue OnBeforeResourceLoad(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IRequest request, IRequestCallback callback){return CefReturnValue.Continue;}/// <summary>/// Called on the CEF UI thread to handle requests for URLs with an unknown protocol component. SECURITY WARNING: YOU SHOULD USE/// THIS METHOD TO ENFORCE RESTRICTIONS BASED ON SCHEME, HOST OR OTHER URL ANALYSIS BEFORE ALLOWING OS EXECUTION./// </summary>/// <param name="chromiumWebBrowser">The ChromiumWebBrowser control.</param>/// <param name="browser">the browser object - may be null if originating from ServiceWorker or CefURLRequest.</param>/// <param name="frame">the frame object - may be null if originating from ServiceWorker or CefURLRequest.</param>/// <param name="request">the request object - cannot be modified in this callback.</param>/// <returns>/// return to true to attempt execution via the registered OS protocol handler, if any. Otherwise return false./// </returns>bool IResourceRequestHandler.OnProtocolExecution(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IRequest request){return OnProtocolExecution(chromiumWebBrowser, browser, frame, request);}/// <summary>/// Called on the CEF UI thread to handle requests for URLs with an unknown protocol component. SECURITY WARNING: YOU SHOULD USE/// THIS METHOD TO ENFORCE RESTRICTIONS BASED ON SCHEME, HOST OR OTHER URL ANALYSIS BEFORE ALLOWING OS EXECUTION./// </summary>/// <param name="chromiumWebBrowser">The ChromiumWebBrowser control.</param>/// <param name="browser">the browser object - may be null if originating from ServiceWorker or CefURLRequest.</param>/// <param name="frame">the frame object - may be null if originating from ServiceWorker or CefURLRequest.</param>/// <param name="request">the request object - cannot be modified in this callback.</param>/// <returns>/// return to true to attempt execution via the registered OS protocol handler, if any. Otherwise return false./// </returns>protected virtual bool OnProtocolExecution(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IRequest request){return false;}/// <summary>/// Called on the CEF IO thread when a resource load has completed. This method will be called for all requests, including/// requests that are aborted due to CEF shutdown or destruction of the associated browser. In cases where the associated browser/// is destroyed this callback may arrive after the <see cref="ILifeSpanHandler.OnBeforeClose"/> callback for that browser. The/// <see cref="IFrame.IsValid"/> method can be used to test for this situation, and care/// should be taken not to call <paramref name="browser"/> or <paramref name="frame"/> methods that modify state (like LoadURL,/// SendProcessMessage, etc.) if the frame is invalid./// </summary>/// <param name="chromiumWebBrowser">The ChromiumWebBrowser control.</param>/// <param name="browser">the browser object - may be null if originating from ServiceWorker or CefURLRequest.</param>/// <param name="frame">the frame object - may be null if originating from ServiceWorker or CefURLRequest.</param>/// <param name="request">the request object - cannot be modified in this callback.</param>/// <param name="response">the response object - cannot be modified in this callback.</param>/// <param name="status">indicates the load completion status.</param>/// <param name="receivedContentLength">is the number of response bytes actually read.</param>void IResourceRequestHandler.OnResourceLoadComplete(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IRequest request, IResponse response, UrlRequestStatus status, long receivedContentLength){OnResourceLoadComplete(chromiumWebBrowser, browser, frame, request, response, status, receivedContentLength);}/// <summary>/// Called on the CEF IO thread when a resource load has completed. This method will be called for all requests, including/// requests that are aborted due to CEF shutdown or destruction of the associated browser. In cases where the associated browser/// is destroyed this callback may arrive after the <see cref="ILifeSpanHandler.OnBeforeClose"/> callback for that browser. The/// <see cref="IFrame.IsValid"/> method can be used to test for this situation, and care/// should be taken not to call <paramref name="browser"/> or <paramref name="frame"/> methods that modify state (like LoadURL,/// SendProcessMessage, etc.) if the frame is invalid./// </summary>/// <param name="chromiumWebBrowser">The ChromiumWebBrowser control.</param>/// <param name="browser">the browser object - may be null if originating from ServiceWorker or CefURLRequest.</param>/// <param name="frame">the frame object - may be null if originating from ServiceWorker or CefURLRequest.</param>/// <param name="request">the request object - cannot be modified in this callback.</param>/// <param name="response">the response object - cannot be modified in this callback.</param>/// <param name="status">indicates the load completion status.</param>/// <param name="receivedContentLength">is the number of response bytes actually read.</param>protected virtual void OnResourceLoadComplete(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IRequest request, IResponse response, UrlRequestStatus status, long receivedContentLength){}/// <summary>/// Called on the CEF IO thread when a resource load is redirected. The <paramref name="request"/> parameter will contain the old/// URL and other request-related information. The <paramref name="response"/> parameter will contain the response that resulted/// in the redirect. The <paramref name="newUrl"/> parameter will contain the new URL and can be changed if desired./// </summary>/// <param name="chromiumWebBrowser">The ChromiumWebBrowser control.</param>/// <param name="browser">the browser object - may be null if originating from ServiceWorker or CefURLRequest.</param>/// <param name="frame">the frame object - may be null if originating from ServiceWorker or CefURLRequest.</param>/// <param name="request">the request object - cannot be modified in this callback.</param>/// <param name="response">the response object - cannot be modified in this callback.</param>/// <param name="newUrl">[in,out] the new URL and can be changed if desired.</param>void IResourceRequestHandler.OnResourceRedirect(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IRequest request, IResponse response, ref string newUrl){OnResourceRedirect(chromiumWebBrowser, browser, frame, request, response, ref newUrl);}/// <summary>/// Called on the CEF IO thread when a resource load is redirected. The <paramref name="request"/> parameter will contain the old/// URL and other request-related information. The <paramref name="response"/> parameter will contain the response that resulted/// in the redirect. The <paramref name="newUrl"/> parameter will contain the new URL and can be changed if desired./// </summary>/// <param name="chromiumWebBrowser">The ChromiumWebBrowser control.</param>/// <param name="browser">the browser object - may be null if originating from ServiceWorker or CefURLRequest.</param>/// <param name="frame">the frame object - may be null if originating from ServiceWorker or CefURLRequest.</param>/// <param name="request">the request object - cannot be modified in this callback.</param>/// <param name="response">the response object - cannot be modified in this callback.</param>/// <param name="newUrl">[in,out] the new URL and can be changed if desired.</param>protected virtual void OnResourceRedirect(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IRequest request, IResponse response, ref string newUrl){}/// <summary>/// Called on the CEF IO thread when a resource response is received. To allow the resource load to proceed without modification/// return false. To redirect or retry the resource load optionally modify <paramref name="request"/> and return true./// Modification of the request URL will be treated as a redirect. Requests handled using the default network loader cannot be/// redirected in this callback./// /// WARNING: Redirecting using this method is deprecated. Use OnBeforeResourceLoad or GetResourceHandler to perform redirects./// </summary>/// <param name="chromiumWebBrowser">The ChromiumWebBrowser control.</param>/// <param name="browser">the browser object - may be null if originating from ServiceWorker or CefURLRequest.</param>/// <param name="frame">the frame object - may be null if originating from ServiceWorker or CefURLRequest.</param>/// <param name="request">the request object.</param>/// <param name="response">the response object - cannot be modified in this callback.</param>/// <returns>/// To allow the resource load to proceed without modification return false. To redirect or retry the resource load optionally/// modify <paramref name="request"/> and return true. Modification of the request URL will be treated as a redirect. Requests/// handled using the default network loader cannot be redirected in this callback./// </returns>bool IResourceRequestHandler.OnResourceResponse(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IRequest request, IResponse response){return OnResourceResponse(chromiumWebBrowser, browser, frame, request, response);}/// <summary>/// Called on the CEF IO thread when a resource response is received. To allow the resource load to proceed without modification/// return false. To redirect or retry the resource load optionally modify <paramref name="request"/> and return true./// Modification of the request URL will be treated as a redirect. Requests handled using the default network loader cannot be/// redirected in this callback./// /// WARNING: Redirecting using this method is deprecated. Use OnBeforeResourceLoad or GetResourceHandler to perform redirects./// </summary>/// <param name="chromiumWebBrowser">The ChromiumWebBrowser control.</param>/// <param name="browser">the browser object - may be null if originating from ServiceWorker or CefURLRequest.</param>/// <param name="frame">the frame object - may be null if originating from ServiceWorker or CefURLRequest.</param>/// <param name="request">the request object.</param>/// <param name="response">the response object - cannot be modified in this callback.</param>/// <returns>/// To allow the resource load to proceed without modification return false. To redirect or retry the resource load optionally/// modify <paramref name="request"/> and return true. Modification of the request URL will be treated as a redirect. Requests/// handled using the default network loader cannot be redirected in this callback./// </returns>protected virtual bool OnResourceResponse(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IRequest request, IResponse response){return false;}/// <summary>/// Called when the unamanged resource is freed./// Unmanaged resources are ref counted and freed when/// the last reference is released, this works differently/// to .Net garbage collection./// </summary>protected virtual void Dispose(){}void IDisposable.Dispose(){Dispose();}}

然后获取消息发送后的返回值则是在IResponseFilter类的方法中接收,也新建一个类继承IResponseFilter类。

public class TestJsonFilter : IResponseFilter{public List<byte> DataAll = new List<byte>();public FilterStatus Filter(System.IO.Stream dataIn, out long dataInRead, System.IO.Stream dataOut, out long dataOutWritten){try{if (dataIn == null || dataIn.Length == 0){dataInRead = 0;dataOutWritten = 0;return FilterStatus.Done;}dataInRead = dataIn.Length;dataOutWritten = Math.Min(dataInRead, dataOut.Length);dataIn.CopyTo(dataOut);dataIn.Seek(0, SeekOrigin.Begin);byte[] bs = new byte[dataIn.Length];dataIn.Read(bs, 0, bs.Length);DataAll.AddRange(bs);dataInRead = dataIn.Length;dataOutWritten = dataIn.Length;return FilterStatus.NeedMoreData;}catch (Exception ex){dataInRead = dataIn.Length;dataOutWritten = dataIn.Length;return FilterStatus.Done;}}public bool InitFilter(){return true;}public void Dispose(){}}

再创建一个类用于配合读取返回值。

    public class FilterManager{private static Dictionary<string, IResponseFilter> dataList = new Dictionary<string, IResponseFilter>();public static IResponseFilter CreateFilter(string guid){lock (dataList){var filter = new TestJsonFilter();dataList.Add(guid, filter);return filter;}}public static IResponseFilter GetFileter(string guid){lock (dataList){return dataList[guid];}}}

然后重写IResponseFilter、OnResourceLoadComplete两个接口,在OnResourceLoadComplete接口中就能接收返回值了。返回值会返回到函数的request参数下,此参数是一个结构体,可以自行在 if (request.Url.ToLower().Contains("sugrec")) 这一句上下断点查看结构体的内容,然后自行加判断来过滤返回值,这里鄙人先判断发送类型为GET消息,然后再根据发送消息URL里的关键字来过滤返回值,最后显示到WinForm窗口程序绑定的控制台窗口里。

    public class WinFormResourceRequestHandler : ResourceRequestHandler{protected override IResponseFilter GetResourceResponseFilter(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IRequest request, IResponse response){var filter = FilterManager.CreateFilter(request.Identifier.ToString());return filter;}protected override void OnResourceLoadComplete(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IRequest request, IResponse response, UrlRequestStatus status, long receivedContentLength){if (request.Method == "GET"){//先指定消息类型POST或者GETif (request.Url.ToLower().Contains("sugrec")){//以URL为过滤条件var filter = FilterManager.GetFileter(request.Identifier.ToString()) as TestJsonFilter;UTF8Encoding encoding = new UTF8Encoding();//这里截获返回的数据var data = encoding.GetString(filter.DataAll.ToArray());System.Console.WriteLine("742行:" + data);}}}}public class WinFormsRequestHandler : RequestHandler{protected override IResourceRequestHandler GetResourceRequestHandler(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IRequest request, bool isNavigation, bool isDownload, string requestInitiator, ref bool disableDefaultHandling){//NOTE: In most cases you examine the request.Url and only handle requests you are interested inif (request.Url.ToLower().Contains("login".ToLower())){using (var postData = request.PostData){if (postData != null){var elements = postData.Elements;var charSet = request.GetCharSet();foreach (var element in elements){if (element.Type == PostDataElementType.Bytes){var body = element.GetBody(charSet);}}}}}return new WinFormResourceRequestHandler();}}

运行程序后:

如何运用这个自定义的类呢?

using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using CefSharp;
using CefSharp.WinForms;
using CefSharp.Handler;
using System.Runtime.InteropServices;
using System.Threading;
using System.Text.RegularExpressions;
using System.Security.Cryptography.X509Certificates;
using System.IO;public partial class Form1 : Form
{ChromiumWebBrowser different;[DllImport("kernel32.dll")]public static extern bool AllocConsole();[DllImport("kernel32.dll")]public static extern bool FreeConsole();public Form1(){InitializeComponent();AllocConsole(); //关联一个控制台窗口用于显示信息}private void Form1_Load(object sender, EventArgs e){CefSettings settings = new CefSettings();settings.CachePath = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData) + @"\Know";//设置cookie存储目录 C:\Users\×××(系统用户名)\AppData\Local\KnowCef.Initialize(settings);//初始化Cef组件different = new ChromiumWebBrowser("https://www.baidu.com");different.RequestHandler = new WinFormsRequestHandler();//应用拦截规则different.LifeSpanHandler = new CefLifeSpanHandler();//让新页面在当前页面打开different.BrowserSettings = new BrowserSettings(){WebGl = CefState.Enabled,ImageLoading = CefState.Enabled,RemoteFonts = CefState.Enabled,AcceptLanguageList = "zh-CN"};tableLayoutPanel1.Controls.Add(different, 0, 1);//把浏览器空间加入布局容器}private void Form1_FormClosing(object sender, FormClosingEventArgs e){//窗口关闭前 回调函数FreeConsole();//释放关联的控制台,不然会报错}}

参考资料:https://www.cnblogs.com/heifengwll/p/13277232.html

如何拦截替换页面资源,JS,CSS等:CefSharp请求资源拦截及自定义处理-腾讯云开发者社区-腾讯云

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/247085.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

VSCode 开发C/C++实用插件分享——koroFileHeader

相关文章 VSCode 开发C/C实用插件分享——codegeex VSCode 开发C/C实用插件分享——koroFileHeader 一、koroFileHeader二、使用步骤1.安装2.头文件注释配置3.函数注释配置 一、koroFileHeader 在有些场景下&#xff0c;我们需要在文件头添加一些作者、文件描述、时间和版权描述…

12月第一天,给搞电商的家人们整活儿!

今年&#xff0c;大家出门的热情直线飙升&#xff01; 特种兵旅游带火N个小众城市、Citywalk大军激活大街小巷的商业活力、线下演出火爆带动各地文旅指数狂飙&#xff0c;户外运动也乘风而上&#xff0c;徒步/露营/钓鱼/骑行/冲浪/滑雪等花式运动在各大社媒平台集中刷屏&#…

pytorch 常用api笔记

view_as()函数 函数定义&#xff1a;view_as(tensor) [参数为一个Tensor张量] 该函数的作用是将调用函数的变量&#xff0c;转变为同参数tensor同样的形状。 例子 data1 [[[1, 2], [3, 4], [5, 6]], [[7, 8], [9, 0], [10, 11]]] t1 torch.Tensor(data1).long() # size2…

vue3 vue-cropper@next 实现图片裁切功能

Vue Cropper 实现上传图片预览&#xff0c;裁切上传效果 下载 pnpm add vue-croppernext使用 <template><inputref"inputRef"class"hidden"accept".png,.jpeg,.jpg"multipletype"file"change"handleUploadChange&quo…

使用Redis构建简易社交网站(2)-处理用户关系

目的 本文目的&#xff1a;实现用户关注和取消关注功能。&#xff08;完整代码附在文章末尾&#xff09; 相关知识 在我之前的文章 《使用Redis构建简易社交网站(1)-创建用户与动态界面》中提到了如何实现简易社交网站中创建新用户和创建新动态功能。 那这篇文章将教会你掌…

03 数仓平台 Kafka

kafka概述 定义 Kafka 是一个开源的分布式事件流平台&#xff08;Event Streaming Plantform&#xff09;&#xff0c;主要用于大数据实时领域。本质上是一个分布式的基于发布/订阅模式的消息队列&#xff08;Message Queue&#xff09;。 消息队列 在大数据场景中主要采用…

电压驻波比

电压驻波比 关于IF端口的电压驻波比 一个信号变频后&#xff0c;从中频端口输出&#xff0c;它的输出跟输入是互异的。这个电压柱波比反映了它输出的能量有多少可以真正的输送到后端连接的器件或者设备。

ffmpeg 任意文件读取漏洞/SSRF漏洞 (CVE-2016-1897/CVE-2016-1898)

漏洞描述 影响范围 FFmpeg 2.8.x < 2.8.5FFmpeg 2.7.x < 2.7.5FFmpeg 2.6.x < 2.6.7FFmpeg 2.5.x < 2.5.10 漏洞环境及利用 搭建docker环境 访问8080端口看到上传界面 由于vulhub并没有讲述该漏洞如何复现&#xff0c;我们需要进入环境查看源码 <?php if(!…

Motion Plan之轨迹生成笔记 (2)

Motion Plan之搜索算法笔记 Motion Plan之基于采样的路径规划算法笔记 Motion Plan之带动力学约束路径搜索 什么是基于优化的轨迹生成 Optimization-Based Trajectory Planning&#xff08;基于优化的轨迹规划&#xff09;是一种常用的方法&#xff0c;用于生成自动化系统&am…

【数值计算方法(黄明游)】函数插值与曲线拟合(二):Newton插值【理论到程序】

​ 文章目录 一、近似表达方式1. 插值&#xff08;Interpolation&#xff09;2. 拟合&#xff08;Fitting&#xff09;3. 投影&#xff08;Projection&#xff09; 二、Lagrange插值1. 拉格朗日插值方法2. Lagrange插值公式a. 线性插值&#xff08;n1&#xff09;b. 抛物插值&…

EM32DX-C2【C#】

1说明&#xff1a; 分布式io&#xff0c;CAN总线&#xff0c;C#上位机二次开发&#xff08;usb转CAN模块&#xff09; 2DI&#xff1a; 公共端是&#xff1a; 0V【GND】 X0~X15&#xff1a;自带24v 寄存器地址&#xff1a;0x6100-01 6100H DI输入寄存器 16-bit &#x…

【NI-RIO入门】Real Time(实时系统解释)

1.什么是实时系统&#xff1f; 实时系统可以非常精确可靠的执行需要特定时许要求的系统&#xff0c;对于许多工程项目来说&#xff0c;通用操作系统&#xff0c;例如WINDOWS等标准PC上运行测量和控制程序是无法精确控制计时的&#xff0c;这些系统很容易受用户的其他程序、图像…