Python 鼠标轨迹 - 防止游戏检测
一.简介
鼠标轨迹算法是一种模拟人类鼠标操作的程序,它能够模拟出自然而真实的鼠标移动路径。
鼠标轨迹算法的底层实现采用C/C++语言,原因在于C/C++提供了高性能的执行能力和直接访问操作系统底层资源的能力。
鼠标轨迹算法具有以下优势:
- 模拟人工轨迹:算法能够模拟出非贝塞尔曲线的自然鼠标移动,避免了机械式的直线移动。
- 适当的停顿/加速/减速:算法能够根据需要模拟出鼠标的停顿、加速和减速,使得轨迹更加真实。
- 随机轨迹:在固定两点间,算法能够生成不同的随机轨迹,增加了轨迹的不可预测性。
二.应用场景
- 游戏鼠标轨迹检测(检测能过无畏fps类型、传奇、梦幻等游戏,已经在游戏中验证)
- 滑块拖动验证
- 部分网页鼠标轨迹检测
三.支持多种编程语言
1.C++头文件
/******************************************************************************************/@SDK功能描述:C++鼠标轨迹/******************************************************************************************/#ifndef _SN_SDK_H__
#define _SN_SDK_H__#include <windows.h>enum SN_TRACK_MOVE_TYPE
{TRACK_MOVE_TYPE_NORMAL=0, // 用于常规轨迹 - 普通游戏鼠标轨迹TRACK_MOVE_TYPE_SLIDER, // 用于滑块轨迹,比常规常规轨迹密度更大 - 滑块验证轨迹
};enum SN_TRACK_POINT_TYPE
{TRACK_POINT_TYPE_NORMAL=0, // 默认绝对坐标TRACK_POINT_TYPE_RELATIVE, // 相对坐标
};//返回参数
typedef struct SN_RESULT {int code; //错误码,如果为 0 表示成功,否则表示错误号char message[4096]; //错误信息,如果为 "OK" 表示成功,否则返回错误信息}SN_RESULT;//坐标参数
typedef struct SN_POINT
{int x; //屏幕坐标,左上角(0,0),右下角(1920,1080 - 以实际屏幕为准)int y; //屏幕坐标,左上角(0,0),右下角(1920,1080 - 以实际屏幕为准)}SN_POINT;//轨迹参数
typedef struct SN_POINT_PARAMS
{struct SN_POINT point;//屏幕坐标,左上角(0,0),右下角(1920,1080 - 以实际屏幕为准)int delayTime; //延时时间(单位:毫秒),仅供参考}SN_POINT_PARAMS;/*创建句柄
*
* 参数:
* [in] szKey: 卡密(购买卡密:https://shop.4yuns.com/links/7C9F16B7)
* [in] pOnnxFilePath:设置 onnx 模型文件路径,如果设置为 NULL,默认和 DLL文件同级目录
* [out] pResult: 返回错误信息,参数pResult.code(错误码)如果为 0 表示成功,否则表示错误号;
*
* 返回值:成功返回句柄,失败返回NULL
*
*/
HANDLE WINAPI apiSNCreateHandle(char* szKey, char* pOnnxFilePath, SN_RESULT* pResult);/*设置鼠标移动轨迹参数,调节轨迹密度/速度/轨迹类型,目前可以支持滑块轨迹/普通轨迹
*
* 参数:
* [in] handle: 句柄(通过调用apiSNCreateHandle得到)
* [in] density: 轨迹密度调节 ,必须大于或者等于 1,默认 5,举个例子:假如轨迹有 100 个点,累计耗时 1000 毫秒,设置 density 如下:
* - density = 1 时,轨迹有 100/1=100 个点,整个轨迹累计耗时 1000/1=1000 毫秒 (默认 1 倍速度)
* - density = 2 时,轨迹有 100/2=50 个点,整个轨迹累计耗时 1000/2=500 豪秒 (等价 2 倍速度)
* - density = 3 时,轨迹有 100/3=33 个点,整个轨迹累计耗时 1000/3=333 豪秒 (等价 3 倍速度)
* - density = 5 时,轨迹有 100/5=20 个点,整个轨迹累计耗时 1000/5=200 豪秒 (等价 5 倍速度)
* - density = 20 时,轨迹有 100/20=5 个点,整个轨迹累计耗时 1000/20=50 豪秒 (等价 20 倍速度)
*
* [in] type: 轨迹类型(0代表绝对普通轨迹,1代表滑块轨迹(获得的轨迹点数比普通轨迹点数更多),具体参考enum SN_TRACK_MOVE_TYPE)
*
* 返回值:返回参数SN_RESULT.code(错误码)如果为 0 表示成功,否则表示错误号;
*
*/
int WINAPI apiSNSetTrackParams(HANDLE handle, int density=5, int type=0);/*获取鼠标移动轨迹
*
* 参数:
* [in] handle: 句柄(通过调用apiSNCreateHandle得到)
* [in] startPoint: 开始坐标,左上角(0,0),右下角(1920,1080 - 以实际屏幕为准)
* [in] endPoint: 结束坐标,左上角(0,0),右下角(1920,1080 - 以实际屏幕为准)
* [in] type: 轨迹坐标类型(0代表绝对坐标,1代表相对坐标,具体参考enum SN_TRACK_POINT_TYPE)
* [out] points: 轨迹数组,如果数组中元素 point 出现(10000,10000),表示鼠标轨迹结束
*
* 返回值:返回参数SN_RESULT.code(错误码)如果为 0 表示成功,否则表示错误号;
*
*/
int WINAPI apiSNMouseMove(HANDLE handle, SN_POINT *startPoint, SN_POINT *endPoint, int type, SN_POINT_PARAMS* points);/*获取版本号
*
* 参数:
* [in] handle: 句柄(通过调用apiSNCreateHandle得到)
* [out] szVersion: 版本号
*
* 返回值:返回参数SN_RESULT.code(错误码)如果为 0 表示成功,否则表示错误号;
*
*/
int WINAPI apiSNGetVersion(HANDLE handle, char* szVersion);/*获取卡密到期时间
*
* 参数:
* [in] handle: 句柄(通过调用apiSNCreateHandle得到)
* [out] pResult: 返回错误信息,参数pResult->code(错误码)如果为 0 表示成功,否则表示错误号;
*
* 返回值:返回卡密到期时间,失败返回NULL,错误信息请查看参数 pResult->message
*
*/
char* WINAPI apiSNGetKeyExpiresTime(HANDLE handle, SN_RESULT* pResult);/*获取错误信息
*
* 参数:
* [in] handle: 句柄(通过调用apiSNCreateHandle得到)
*
* 返回值:返回参数SN_RESULT.code(错误码)如果为 0 表示成功,否则表示错误号;
*
*/
int WINAPI apiSNGetError(HANDLE handle);/*释放句柄(内存)
*
* 参数:
* [in] handle: 句柄(通过调用apiSNCreateHandle得到)
*
* 返回值:返回参数SN_RESULT.code(错误码)如果为 0 表示成功,否则表示错误号;
*
*/
int WINAPI apiSNDestroyHandle(HANDLE handle);#endif // !_SN_SDK_H__
2.其他编程语言
为了易于集成和使用,我们将鼠标轨迹算法封装为DLL(动态链接库)。这种封装方式不仅保留了算法的性能优势,还提供了跨平台和跨语言的兼容性,目前支持编程语言如下:
- C++
- Python
- 易语言
推算轨迹算法耗时均为毫秒级,<= 5ms ,速度超快,fps类型游戏完全无压力!
3.鼠标轨迹API调用流程图
注意:如果是多线程,每个线程都需要通过apiSNCreateHandle创建HANDLE句柄,这样才能多个线程互不影响
4.加载C++鼠标轨迹dll接口
'''@SDK功能描述:鼠标轨迹'''
from ctypes import cdll, Structure, c_int, c_char, c_char_p, POINTER, create_string_buffer
import ctypes
import platform
class SN_RESULT(ctypes.Structure):_fields_ = [("code", ctypes.c_int),("message", ctypes.c_char * 4096)]class SN_POINT(ctypes.Structure):_fields_ = [("x", ctypes.c_int),("y", ctypes.c_int)]class SN_POINT_PARAMS(ctypes.Structure):_fields_ = [("point", SN_POINT),("delayTime", ctypes.c_int)]class SN_MOUSE_TRACK_SDK:def __init__(self, key, onnx_path, dll_path):self.key = key.encode('utf-8')self.onnx_path = onnx_path.encode('utf-8')self.sn_sdk = ctypes.WinDLL(dll_path)self.handle = Noneself.result = SN_RESULT()self._initialize_sdk()def _initialize_sdk(self):self.sn_sdk.apiSNCreateHandle.argtypes = [ctypes.POINTER(ctypes.c_char), ctypes.POINTER(ctypes.c_char),ctypes.POINTER(SN_RESULT)]self.sn_sdk.apiSNCreateHandle.restype = ctypes.c_void_p# 检测当前是 x64 还是 x86print(platform.architecture())self.handle = self.sn_sdk.apiSNCreateHandle(self.key, self.onnx_path, ctypes.byref(self.result))if self.result.code != 0:print(f"Failed to create handle: {self.result.message.decode('gbk', errors='replace')}")else:print("sn_sdk.apiSNCreateHandle success")def get_version(self):version = ctypes.create_string_buffer(4096)self.sn_sdk.apiSNGetVersion.argtypes = [ctypes.c_void_p, ctypes.POINTER(ctypes.c_char)]self.sn_sdk.apiSNGetVersion.restype = ctypes.c_intif self.handle is None:print("apiSNCreateHandle fail!")return ""result = self.sn_sdk.apiSNGetVersion(self.handle, version)if result != 0:raise Exception(f"Failed to get version: {result}")return version.value.decode()def set_track_params(self, density, other_param):self.sn_sdk.apiSNSetTrackParams.argtypes = [ctypes.c_void_p, ctypes.c_int, ctypes.c_int]self.sn_sdk.apiSNSetTrackParams.restype = ctypes.c_intreturn self.sn_sdk.apiSNSetTrackParams(self.handle, density, other_param)def get_key_expires_time(self):self.sn_sdk.apiSNGetKeyExpiresTime.argtypes = [ctypes.c_void_p, ctypes.POINTER(SN_RESULT)]self.sn_sdk.apiSNGetKeyExpiresTime.restype = ctypes.c_char_pif self.handle is None:print("apiSNCreateHandle fail!")return ""return self.sn_sdk.apiSNGetKeyExpiresTime(self.handle, ctypes.byref(self.result))def move_mouse(self, start_point, end_point, type, num_points=4096):points_array = (SN_POINT_PARAMS * num_points)()self.sn_sdk.apiSNMouseMove.argtypes = [ctypes.c_void_p, POINTER(SN_POINT), POINTER(SN_POINT), ctypes.c_int,POINTER(SN_POINT_PARAMS)]self.sn_sdk.apiSNMouseMove.restype = ctypes.c_intif self.handle is None:print("apiSNCreateHandle fail!")# 强制给 points_array 赋值points_array[0].point.x = 10000 # 设置 X 坐标points_array[0].point.y = 10000 # 设置 Y 坐标points_array[0].delayTime = 0 # 设置延迟时间return points_arrayresult_code = self.sn_sdk.apiSNMouseMove(self.handle, start_point, end_point, type, points_array)if result_code != 0:print(f"Failed to move mouse start_point:{start_point.x},{start_point.y} end_point:{end_point.x},{end_point.y} ,Error core:{result_code}")# 强制给 points_array 赋值points_array[0].point.x = 10000 # 设置 X 坐标points_array[0].point.y = 10000 # 设置 Y 坐标points_array[0].delayTime = 0 # 设置延迟时间return points_arraydef destroy_handle(self):self.sn_sdk.apiSNDestroyHandle.argtypes = [ctypes.c_void_p]self.sn_sdk.apiSNDestroyHandle.restype = ctypes.c_intreturn self.sn_sdk.apiSNDestroyHandle(self.handle)if __name__ == "__main__":#from sn_mouse_track import SN_MOUSE_TRACK_SDK, SN_POINT# 初始化 SDK - 只需要创建一次sdk = SN_MOUSE_TRACK_SDK(key="SNKJUMWwseUjELLDsmvxPH1WYNcZAUDbWdYdEgWjUhxL",onnx_path="d://SNTrack.onnx",dll_path="d://SNSDK.dll")# 获取版本号version = sdk.get_version()print("SDK Version:", version)# 设置轨迹参数 ,详细参数解释参考 SNSDK.hsdk.set_track_params(density=5, other_param=0)# 获取卡密到期时间expires_time = sdk.get_key_expires_time()print("Key expires time:", expires_time)# 模拟鼠标移动 - 通过设置开始和结束位置,不停获取轨迹(仅仅只是演示代码,只获取一次轨迹)while True:start_point = SN_POINT(100, 100)end_point = SN_POINT(800, 800)points_array = sdk.move_mouse(start_point, end_point, type=0)# 打印轨迹点for i, point in enumerate(points_array):if point.point.x == 10000 and point.point.y == 10000:breakprint(f"Point {i}: ({point.point.x}, {point.point.y}, {point.delayTime})")# 仅仅只是演示代码,只获取一次轨迹break# 销毁句柄sdk.destroy_handle()'''
('64bit', 'WindowsPE')
sn_sdk.apiSNCreateHandle success
SDK Version: 1.0
Key expires time: b'2026-02-04 10:39:38'
Point 0: (100, 100, 0)
Point 1: (110, 102, 1)
Point 2: (135, 105, 2)
Point 3: (175, 111, 8)
Point 4: (224, 135, 8)
Point 5: (276, 153, 5)
Point 6: (307, 165, 2)
Point 7: (352, 188, 9)
Point 8: (377, 201, 8)
Point 9: (404, 221, 5)
Point 10: (422, 236, 5)
Point 11: (441, 252, 2)
Point 12: (460, 270, 9)
Point 13: (482, 293, 8)
Point 14: (506, 317, 7)
Point 15: (531, 342, 1)
Point 16: (553, 374, 2)
Point 17: (582, 417, 9)
Point 18: (604, 448, 8)
Point 19: (622, 476, 5)
Point 20: (638, 498, 1)
Point 21: (648, 514, 3)
Point 22: (658, 528, 8)
Point 23: (667, 543, 7)
Point 24: (678, 563, 5)
Point 25: (687, 578, 1)
Point 26: (697, 598, 2)
Point 27: (710, 622, 9)
Point 28: (719, 638, 8)
Point 29: (728, 657, 5)
Point 30: (735, 671, 1)
Point 31: (743, 686, 2)
Point 32: (752, 705, 9)
Point 33: (761, 721, 8)
Point 34: (769, 737, 5)
Point 35: (776, 751, 2)
Point 36: (784, 767, 9)
Point 37: (792, 783, 2)
Point 38: (796, 793, 9)
Point 39: (799, 800, 24)Process finished with exit code 0'''
5.云盘源码下载
- 百度云盘
- 夸克云盘
- 123云盘
云盘目录介绍:
demo - 包含各种编程语言的demo
dll - 分别是x86和x64平台所需要的dll/lib/h文件
windows 鼠标轨迹测试工具 - exe测试鼠标轨迹效果( demo 中的 c++ 工程编译后的exe可执行文件)
四.效果演示
1.开始坐标为(100,100),结束坐标为(800,800),通过调用接口获得 4 条鼠标轨迹
2.开始坐标为(1000,100),结束坐标为(800,800),通过调用接口获得 2 条鼠标轨迹
五.常见问题
1.是否支持多线程
支持
2.如何使用多线程
参考前面的《2.鼠标轨迹API调用流程图》,多线程和单线程类似;如果是多线程,那么每个线程都需要通过apiSNCreateHandle创建HANDLE句柄,这样才能多个线程互不影响
3.如何判断轨迹结束
可以通过循环判断得到的轨迹坐标,如果当前坐标的X值和Y值都是1000的情况下,默认轨迹结束
(之前的判断是(-1,-1)作为轨迹结束的标记,现在修改为(10000,10000)作为轨迹结束标记,目的是为了兼容相对坐标)
4.鼠标轨迹设置相对坐标
在函数 apiSNMouseMove 中 type 参数,0 为 绝对坐标 ; 1 为相对坐标
5.如何调节点的密集程度
在(2024.12.22)SDK2.0版本中新增接口 apiSNSetTrackParams 中的 density 参数可以用来调节轨迹密度,举个例子:
- density = 1 时,默认轨迹有 100 个点,整个轨迹累计耗时 1000 毫秒 (默认 1 倍速度)
- density = 2 时,轨迹有 100/2=50 个点,整个轨迹累计耗时 500 毫秒 (等价 2 倍速度)
- density = 3 时,轨迹有 100/3=33 个点,整个轨迹累计耗时 333 毫秒 (等价 3 倍速度)
- density = 5 时,轨迹有 100/5=20 个点,整个轨迹累计耗时 200 毫秒 (等价 5 倍速度)
不同的游戏需要的轨迹密度不一样,类似 fps 游戏,鼠标滑动轨迹比较快,density 可以设置为 5 或者更高 ; 类似魔兽世界或者梦幻,density 可以调节为 2 或者 3或者5
6.滑块验证轨迹
在函数 apiSNSetTrackParams 中 type 参数,0 为普通鼠标轨迹 ; 1 为滑块轨迹
普通鼠标贵和滑块轨迹区别:滑块轨迹比普通鼠标轨迹坐标点更多(相同的开始/结束坐标),点与点之间更加密集,轨迹的开始和结束暂停/加速更加明显
六.更新日志
- 2024.02.06 c++ 模拟人工鼠标轨迹demo
- 2024.06.06 python 模拟人工鼠标轨迹demo
- 2024.06.25 新增错误日志信息
- 2024.07.15 优化水平/垂直轨迹
- 2024.08.20 优化部分轨迹可能出现负数的问题
- 2024.09.19 优化部分轨迹延迟时间为0的情况(可能会造成鼠标瞬移)
- 2024.09.21 修复部分水平/垂直轨迹出现负数的情况
- 2024.09.28 新增易语言demo
- 2024.11.01 修改接口,兼容易语言代码
- 2024.11.17 支持移动轨迹为相对坐标(默认是轨迹是绝对坐标)
- 2024.12.15 新增文字识别OCR,支持编程语言如下:
- Python
- 易语言
- C语言
- C++
- 2024.12.22 优化鼠标轨迹
- 新增滑块轨迹
- 优化鼠标轨迹 - 支持密度调节
- 2024.12.29
- 修复鼠标轨迹可能会崩溃的问题
- 修复OCR文字识别失败问题(带有中文路径的图片)
相关文章:
Python 鼠标轨迹 - 防止游戏检测
一.简介 鼠标轨迹算法是一种模拟人类鼠标操作的程序,它能够模拟出自然而真实的鼠标移动路径。 鼠标轨迹算法的底层实现采用C/C语言,原因在于C/C提供了高性能的执行能力和直接访问操作系统底层资源的能力。 鼠标轨迹算法具有以下优势: 模拟…...
PB-DW-数据窗口-降级-从12.5降级到9.0
PB 数据窗口从125降级到90 供参考,有哪些属性仍然需要删除,请在评论区留言。谢谢。 如果您有更好的工具,能分享给我一份的话,就更好了,感谢。 12.5数据窗口降级9.01- release 12.5; 更改为 release 9;2- 第二行的 d…...
Logo语言的测试开发
Logo语言的测试开发 引言 随着编程教育的不断发展,学习编程的门槛逐渐降低,各种编程语言应运而生。其中,Logo语言作为一种经典的教育编程语言,在培养儿童的逻辑思维和解决问题的能力方面,发挥了重要的作用。本文将深…...
位图的深入解析:从数据结构到图像处理与C++实现
在学习优选算法课程的时候,博主学习位运算了解到位运算的这个概念,之前没有接触过,就查找了相关的资料,丰富一下自身,当作课外知识来了解一下。 位图(Bitmap)是一种用于表示图像的数据结构&…...
Faveo Helpdesk存在目录遍历漏洞(CVE-2024-37700)
免责声明: 本文旨在提供有关特定漏洞的深入信息,帮助用户充分了解潜在的安全风险。发布此信息的目的在于提升网络安全意识和推动技术进步,未经授权访问系统、网络或应用程序,可能会导致法律责任或严重后果。因此,作者不对读者基于本文内容所采取的任何行为承担责任。读者在…...
【Pytorch函数】PyTorch随机数生成全解析 | torch.rand()家族函数使用指南
🌟 PyTorch随机数生成全解析 | torch.rand()家族函数使用指南 🌟 📌 一、核心函数参数详解 PyTorch提供多种随机数生成函数(注意:无直接torch.random()函数),以下是常用函数及参数:…...
ML.NET库学习004:ML.NET基础知识复盘
文章目录 ML.NET库学习004:ML.NET基础知识复盘背景简单的 ML.NET 应用程序代码工作流机器学习模型基础进阶 ML.NET 架构构建管道训练模型使用模型 数据模型和架构模型部署 ML.NET库学习004:ML.NET基础知识复盘 学了几个小项目,发现好多方法莫…...
2. UVM的基本概念和架构
文章目录 前言1. UVM的基本概念1.1 UVM的核心组件1.2 UVM的基本架构1.3 UVM的工作流程 2. UVM的架构2.1 UVM的层次结构2.2 UVM的组件交互 3. 总结 前言 首先,得确定UVM的基本概念和架构包含哪些关键部分。我回忆起UVM的核心组件,比如uvm_component、uvm…...
算法10--哈希
哈希 原理经典例题[1. 两数之和](https://leetcode.cn/problems/two-sum/description/)[面试题 01.02. 判定是否互为字符重排](https://leetcode.cn/problems/check-permutation-lcci/description/)[217. 存在重复元素](https://editor.csdn.net/md?not_checkout1&spm1015…...
磁盘文件删除后恢复
磁盘文件删除后,文件数据并未立即消失,只是文件系统的指针被移除,标记该空间为可覆盖。要恢复文件,可以尝试以下方法: 1. 使用数据恢复软件 Recuva:适合Windows,能恢复多种文件类型。PhotoRec…...
STM32 CUBE Can调试
STM32 CUBE Can调试 1、CAN配置2、时钟配置3、手动添加4、回调函数5、启动函数和发送函数6、使用方法(采用消息队列来做缓存)7、数据不多在发送函数中获取空邮箱发送,否则循环等待空邮箱 1、CAN配置 2、时钟配置 3、手动添加 需要注意的是STM32CUBE配置的代码需要再…...
【大模型】Ubuntu下安装ollama,DeepSseek-R1:32b的本地部署和运行
1 ollama 的安装与设置 ollama官网链接:https://ollama.com/ 在左上角的【Models】中展示了ollama支持的模型在正中间的【Download】中课可以下载支持平台中的安装包。 其安装和模型路径配置操作流程如下: ollama的安装 这里选择命令安装curl -fsSL …...
Goland 内存逃逸问题
内存逃逸是什么? 在go语言中,内存分配存在两个方式:堆分配;栈分配。 栈分配:是在函数调用时为局部变量分配内存,当函数返回时,这些内存会自动释放。 堆分配:通过 new 或者 make 函…...
我们来学人工智能 -- 本地部署DeepSeek
本地部署DeepSeek 题记思考正题结语 题记 时不待我AI会淘汰各领域一些岗位AI可以精简部门,DP白菜价的落地,2025年会更加明显会AI的淘汰不会AI的第四次工业革命将在中国爆发 全产业链多年数字化建设以DP为代表的全球领先白菜价人工智能在各行各业的普及 …...
【GitHub】GitHub 2FA 双因素认证 ( 使用 Microsoft Authenticator 应用进行二次验证 )
文章目录 一、GitHub 的 2FA 双因素认证二、使用 Microsoft Authenticator 应用进行二次验证1、TOTP 应用2、下载 Microsoft Authenticator 应用3、安装使用 Authenticator 应用 三、恢复码重要性 一、GitHub 的 2FA 双因素认证 现在登录 GitHub 需要进行二次身份验证 ; 先登录…...
通过脚本实现自动将标签内容复制到下一个标签文件中
只需要将下面内容运行前 修改文件夹路径(控制修改范围的文件名 不需要的话 就随便写一个不相同的文件名 就行 需要的话就是在这个文件名字之前的会被修改) import os import time # 文件夹路径 image_directory r"C:\Users\Lenovo\Desktop\新建文件夹\images" # 替…...
Elasticsearch+Kibana安装启动与操作教程
在大数据时代,Elasticsearch(简称 ES)和 Kibana 作为强大的数据搜索与可视化工具,受到了众多开发者的青睐。本文将为您详细介绍在 Windows 和 Mac 系统上安装、启动 Elasticsearch 和 Kibana 的步骤,以及常用命令和 Ki…...
CSS Overflow 属性详解:控制内容溢出的利器
在前端开发中,处理内容溢出是一个常见的需求。CSS 提供了 overflow 属性,帮助我们控制当内容超出元素框时的显示方式。本文将详细介绍 overflow 属性的各种取值及其应用场景。 1. 什么是 overflow 属性? overflow 属性用于控制当元素的内容…...
什么是XMLHttpRequest?及其详细使用说明
XMLHttpRequest(通常缩写为XHR)是一个JavaScript对象,用于在浏览器和服务器之间进行异步通信。它允许网页在不重新加载整个页面的情况下,向服务器发送请求并接收响应。XHR是Ajax(Asynchronous JavaScript and XML&…...
Chrome浏览器原理及优化
1. 相关面试题 1.1. 请说说从输入 URL 到页面渲染完成的全过程 1. 输入URL,用户在浏览器的地址栏输入一个URL,并按下回车键; 2. DNS解析; 浏览器需要将域名转换为服务器的IP地址,以建立连接。 (1). 如果浏览器缓存、操作系统缓存或路由器缓存中已有该域名的IP地址,…...
Vue 3 + Vite + JS 项目中实现组件全局自动化注册的魔法,极致组件自动化注册方案,开发效率飙升300%。
在Vue项目开发中,你是否还在为重复的组件注册代码而烦恼?是否经历过在大型项目中手动维护数百个组件注册的痛苦?本文将揭秘一种革命性的组件自动化注册方案,结合Vite的黑魔法和Vue3的最新特性,让你的开发效率实现质的飞…...
寒假2.8
题解 web:[RoarCTF 2019]Easy Calc 打开,是一个计算界面 看一下源代码,提示设置了WAF,并且有一个calc.php文件 访问一下calc.php文件,得到源码,使用get方式传参赋值给num,设置了黑名单&#x…...
企业如何利用DeepSeek提升网络安全管理水平
企业可以通过深度整合DeepSeek的AI能力,构建智能化、动态化的网络安全防御体系,以应对APT(高级持续性威胁)等复杂攻击。以下是具体策略与实践路径: 1. AI驱动的威胁检测与分析 多模态威胁狩猎 DeepSeek的深度学习技术能…...
C++ libfmt 实战: 高效便捷的格式化库
libfmt 是一个现代化的 C格式化库{fmt}, 具有以下关键特性: 安全性: 受 Python 格式化功能启发, {fmt}为printf系列函数提供安全替代方案. 格式字符串错误在编译时就能被检测出来, 并且通过自动内存管理避免缓冲区溢出错误.可扩展性: 默认支持格式化大多数标准类型, 包括容器,…...
Ubuntu 下 nginx-1.24.0 源码分析 - ngx_max_sockets
在 Nginx 的源代码中, ngx_max_sockets 全局变量的声明位于 os/unix/ngx_os.h extern ngx_int_t ngx_max_sockets; 定义在 os/unix/ngx_posix_init.c ngx_int_t ngx_max_sockets; ngx_max_sockets 定义了 Nginx 能够同时使用的最大 Socket 文件描述符数量。它…...
Spring Boot接入Deep Seek的API
1,首先进入deepseek的官网:DeepSeek | 深度求索,单击右上角的API开放平台。 2,单击API keys,创建一个API,创建完成务必复制!!不然关掉之后会看不看api key!!&…...
大语言模型实践——基于现有API的二次开发
基于现有的API平台做一些实用的AI小应用。 API服务商:阿里云百炼 云服务器:阿里云(2核2GB) 部署框架:gradio 调用框架:openai 语言:Python (注:若搭建网站或API接口…...
ChunkKV:优化 KV 缓存压缩,让 LLM 长文本推理更高效
每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…...
深入探究 Go 语言中的 Fx 框架:依赖注入的强大工具
在软件开发中,依赖注入(Dependency Injection,简称 DI)是一种重要的设计模式,它可以帮助我们降低代码的耦合度,提高代码的可测试性和可维护性。Go 语言作为一门高效、简洁的编程语言,拥有许多优…...
用 DeepSeek + Kimi 自动做 PPT,效率起飞
以下是使用 DeepSeek Kimi 自动做 PPT 的详细操作步骤: 利用 DeepSeek 生成 PPT 内容: 访问 DeepSeek 官网,完成注册/登录后进入对话界面。输入指令,例如“请用 Markdown 格式生成一份关于[具体主题]的 PPT 大纲,需包…...
【04】Java+若依+vue.js技术栈实现钱包积分管理系统项目-若依框架二次开发准备工作-以及建立初步后端目录菜单列-优雅草卓伊凡商业项目实战
【04】Java若依vue.js技术栈实现钱包积分管理系统项目-若依框架二次开发准备工作-以及建立初步后端目录菜单列-优雅草卓伊凡商业项目实战 项目背景 本项目经费43000元,需求文档如下,工期25天,目前已经过了8天,时间不多了&#x…...
【C++】异常
前言 本篇博客我们来看下C有关异常的处理,了解下异常有关的知识 💓 个人主页:小张同学zkf ⏩ 文章专栏:C 若有问题 评论区见📝 🎉欢迎大家点赞👍收藏⭐文章 目录 1.异常的概念及使用 1.1异…...
Meta AI 最近推出了一款全新的机器学习框架ParetoQ,专门用于大型语言模型的4-bit 以下量化
每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…...
金融资产配置
不要放在一个篮子里也不要放在太多篮子里: 尽量放在不相关的行业实现风险对冲 金融资产从风险类别上主要可以分为三类: 进攻型资产、稳定型资产和防守型资产 进攻型资产包括原油、股票、一级市场股权投资等 稳定型资产包括信托、理财、国债等 防守…...
(done) openMP学习 (Day14: 总结)
url: https://dazuozcy.github.io/posts/introdution-to-openmp-intel/#23-%E5%8F%AF%E6%80%95%E7%9A%84%E4%B8%9C%E8%A5%BF%E5%86%85%E5%AD%98%E6%A8%A1%E5%9E%8Batomicsflushpairwise%E5%90%8C%E6%AD%A5%20 新手并行程序员与专家并行程序员之间的区别是专家have a collection…...
音频进阶学习十一——离散傅里叶级数DFS
文章目录 前言一、傅里叶级数1.定义2.周期信号序列3.表达式DFSIDFS参数含义 4.DFS公式解析1)右边解析 T T T、 f f f、 ω \omega ω的关系求和公式N的释义求和公式K的释义 e j ( − 2 π k n N ) e^{j(\frac{-2\pi kn}{N})} ej(N−2πkn)的释义 ∑ n 0 N − 1 e…...
ssm的心得
spring是一个轻量级的ioc(控制反转)和aop(面向切面编程)容器框架,它可以管理和配置应用中的各种bean(对象),实现bean之间的依赖注入,以及提供事务管理、缓存、测试等功能…...
14vue3实战-----获取用户信息和用户的菜单树信息
14vue3实战-----获取用户信息和用户的菜单树信息 1.获取用户信息1.1封装接口1.2优化 2.获取用户的菜单树信息 1.获取用户信息 1.1封装接口 后端有根据id获取用户信息的接口,前端需要把该接口封装一下: service/login/login.ts: import hyRequest from…...
shell脚本学习笔记
Shell脚本学习笔记 参考资料:https://www.runoob.com/linux/linux-shell-passing-arguments.html 文章目录 Shell脚本学习笔记一、什么是Shell1.1、定义1.2、注释 二、Shell变量2.1、规则2.2、变量类型2.2.1、字符串2.2.2、整数2.2.3、数组2.2.4、环境变量2.2.5、特…...
Java中的线程池及其应用场景有哪些?
Java中的线程池是一种高效的并发编程机制,通过复用线程来管理任务的执行,从而提高资源利用率和系统性能。 本文将详细探讨Java线程池的概念、类型、应用场景以及实际代码示例,帮助读者全面理解线程池的使用方法及其在实际开发中的重要性。 …...
13.6 基于 LangChain架构优化实战:OpenAI-Translator翻译系统重构与10倍效率提升秘籍
LangChain架构优化实战:OpenAI-Translator翻译系统重构与10倍效率提升秘籍 关键词:LangChain 架构优化, 模块解耦, 翻译系统设计模式, 可扩展翻译框架, 多模型管理 1. 原架构痛点分析 问题维度原实现缺陷LangChain 优化方案大模型耦合直接调用 OpenAI API,切换模型需改代码…...
构建基于 SSE 协议通信的 MCP Server 和 Client
在之前的系列教程中,我们编写的 MCP 服务器与 MCP 客户端是通过 **stdio(Standard Input/Output,标准输入输出)**来进行交互的。客户端通过启动服务器子进程,并利用标准输入(stdin)和标准输出&a…...
Docker、Ollama、Dify 及 DeepSeek 安装配置与搭建企业级本地私有化知识库实践
在现代企业中,管理和快速访问知识库是提升工作效率、促进创新的关键。为了满足这些需求,企业越来越倾向于构建本地私有化的知识库系统,这样可以更好地保护企业数据的安全性和隐私性。本文将介绍如何利用 **Docker**、**Ollama**、**Dify** 和…...
第3章 使用 Vue 脚手架
第3章 使用 Vue 脚手架 3.1 初始化脚手架3.1.1 说明3.1.2. 具体步骤3.1.3 分析脚手架结构1 总结2 细节分析1 配置文件2 src文件1 文件结构分析2 例子 3 public文件4 最终效果 3.2 ref属性3.3 props配置项3.4 mixin混入3.5 插件3.6 scoped样式3.7 Todo-list 案例3.7.1 组件化编码…...
MySQL第五次作业
根据图片内容完成作业 1.建表 (1)建立两个表:goods(商品表)、orders(订单表) mysql> create table goods( -> gid char(8) primary key, -> name varchar(10), -> price decimal(8,2), -> num int); mysql> create t…...
pikachu[皮卡丘] 靶场全级别通关教程答案 以及 学习方法 如何通过渗透测试靶场挑战「pikachu」来精通Web渗透技巧? 一篇文章搞完这些问题
目录 Pikachu靶场 部署 暴力破解漏洞 学习地址: 靶场练习: 基于表单的暴力破解 验证码绕过(on server) 验证码绕过(on Client) token防爆破? XSS跨站脚本攻击 学习地址: 靶场练习: 反射型xss(get) 反射性xss(post) 存储型xss DOM型xss xss盲打 x…...
ai智能DeepSeek 在 Cursor 中的配置与应用实践
DeepSeek 是一款高效的深度搜索引擎,能够为开发者提供更智能、更精准的搜索体验。在数据量大、查询复杂的场景中,DeepSeek 能够帮助提升查询的响应速度和精确度。本文将介绍 DeepSeek 在 Cursor 中的配置与应用,帮助开发者理解如何在实际开发…...
登录到docker里
在Docker中登录到容器通常有两种情况: 登录到正在运行的容器内部:如果你想要进入到正在运行的容器内部,可以使用docker exec命令。 登录到容器中并启动一个shell:如果你想要启动一个容器,并在其中启动一个shell&…...
【大数据技术】搭建完全分布式高可用大数据集群(Kafka)
搭建完全分布式高可用大数据集群(Kafka) kafka_2.13-3.9.0.tgz注:请在阅读本篇文章前,将以上资源下载下来。 写在前面 本文主要介绍搭建完全分布式高可用集群 Kafka 的详细步骤。 注意: 统一约定将软件安装包存放于虚拟机的/software目录下,软件安装至/opt目录下。 安…...
Java 大视界 -- Java 大数据在智能供应链中的应用与优化(76)
💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也…...