记录一次反爬操作 - ( 简单 )

实现思路

1.参数加密

已知我的参数是 page 和 pageSize,此时我想要对着两个参数进行加密,那么我的选型还是比较多的,这里使用常见的md5进行加密处理。

思路

避免加密参数不变,我们引入一个时间戳来混淆爬虫,这样我们就得到了加密的参数了。
代码参考:

import request from '../utils/request';
import CryptoJS from 'crypto-js';
export const searchUserByTags = (tags: any, page: any, pageSize: any) => {const timestamp = Date.now().toString();const sign = CryptoJS.MD5(page + pageSize + timestamp + "xiaocaidan").toString();return request.post("/user/search", {tags: tags,page: page,pageSize: pageSize,time: timestamp,sign: sign});
}

优化,我们可以将tags进行转换,使用hash操作,得到一个新的加密参数,然后进行拼接,得到一个最终效果的参数
如: sign + '|' + time + '|' + hash(tags)

2.代码混淆

得到上方的的加密代码之后我们可以做一个js混淆,让爬虫解析前端代码困难起来。
js混淆工具

混淆前的代码
    const timestamp = Date.now().toString();const sign = CryptoJS.MD5(page + pageSize + timestamp + "xiaocaidan").toString();return request.post("/user/search", {tags: tags,page: page,pageSize: pageSize,time: timestamp,sign: sign});
混淆后的代码
function _0x5670(_0x4239f6, _0x1c06ce) {const _0x2507cf = _0x2507(); return _0x5670 = function (_0x567057, _0x3c9f41) { _0x567057 = _0x567057 - 0x1a1; let _0x39c382 = _0x2507cf[_0x567057]; return _0x39c382; }, _0x5670(_0x4239f6, _0x1c06ce);}const _0x99028a = _0x5670;(function (_0x123360, _0xd0bda3) {const _0x89478b = _0x5670, _0x5256f6 = _0x123360();while (!![]) {try {const _0x199e10 = parseInt(_0x89478b(0x1a2)) / 0x1 * (-parseInt(_0x89478b(0x1a4)) / 0x2) + parseInt(_0x89478b(0x1a5)) / 0x3 + -parseInt(_0x89478b(0x1ab)) / 0x4 * (parseInt(_0x89478b(0x1af)) / 0x5) + parseInt(_0x89478b(0x1a3)) / 0x6 * (-parseInt(_0x89478b(0x1a9)) / 0x7) + parseInt(_0x89478b(0x1a6)) / 0x8 + parseInt(_0x89478b(0x1a8)) / 0x9 * (parseInt(_0x89478b(0x1a1)) / 0xa) + -parseInt(_0x89478b(0x1ae)) / 0xb; if (_0x199e10 === _0xd0bda3) break; else _0x5256f6['push'](_0x5256f6['shift']());} catch (_0x4c629a) { _0x5256f6['push'](_0x5256f6['shift']()); }}}(_0x2507, 0x9dcd3)); const timestamp = Date['now']()[_0x99028a(0x1ad)](), sign = CryptoJS[_0x99028a(0x1ac)](page + pageSize + timestamp + _0x99028a(0x1a7))[_0x99028a(0x1ad)](); function _0x2507() { const _0x35df2c = ['MD5', 'toString', '1339305ECXPIG', '3365ERShus', '1270gpPtfm', '110645cBxblt', '6RZquIb', '4MjMiyF', '87582bFxmbr', '8275472fserRH', 'xiaocaidan', '70794rMDivZ', '7083769lzcyvp', '/user/search', '364WoWysM']; _0x2507 = function () { return _0x35df2c; }; return _0x2507(); } return request['post'](_0x99028a(0x1aa), { 'tags': tags, 'page': page, 'pageSize': pageSize, 'time': timestamp, 'sign': sign });
接口限流

使用Redisson中的RRateLimiter工具进行操作

工具类:
package com.caidan.HuoBanSystem.utils;import com.caidan.HuoBanSystem.exception.BaseException;
import jakarta.annotation.Resource;
import org.redisson.api.RRateLimiter;
import org.redisson.api.RateIntervalUnit;
import org.redisson.api.RateType;
import org.redisson.api.RedissonClient;
import org.springframework.stereotype.Component;/*** @项目名 BIProject* @描述 使用redis进行限流操作* @作者 wzy* @时间 2024/5/28 18:46*/
//  注册一下bean
//  写成一个工具类 便于后续使用
@Component
public class RedisLimitManager {@Resourceprivate RedissonClient redissonClient;//    定义限流内容public void doRateLimit(String key,String message) {
//      设置限流器RRateLimiter rateLimiter = redissonClient.getRateLimiter(key);// 设置限流器的速率:每秒产生 2 个令牌,允许突发 1 个令牌rateLimiter.trySetRate(RateType.OVERALL, 2, 1, RateIntervalUnit.SECONDS);
//      当一个操作来的时候,请求一个令牌boolean canOp = rateLimiter.tryAcquire(1);if(!canOp){throw new BaseException(message);}}
}

以上就是我针对这个接口的加密方式,也是心血来潮,想要实现一个,毕竟写了这么多爬虫文章了,也应该介绍下反爬了。
如果大家有比较好的策略,可以评论区留言交流一下。

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

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

相关文章

贪吃蛇 C++简易版(完整代码)

代码&#xff1a; #include <iostream> #include <conio.h> #include <vector> #include <windows.h> #include <ctime>using namespace std; //设置范围 const int WIDTH 20; const int HEIGHT 20;const char EMPTY ; const char SNAKE O…

代码随想录总结

文章目录 1. 回溯法1.1 组合1.2 组合总和31.3 电话号码的字母组合 2. 1. 回溯法 经典问题&#xff1a;排列、组合、切割、子集、棋盘 void backtracking(参数) {if (终止条件) {存放结果;return;}for (选择&#xff1a;本层集合中元素&#xff08;树中节点孩子的数量就是集合的…

【SpringBoot教程:从入门到精通】掌握Springboot开发技巧和窍门(四)-Vue项目配置环境、导航栏

主要写前端页面&#xff0c;采用vue框架写页面的导航栏&#xff01;&#xff01;&#xff01; 文章目录 前言 Vue项目配置环境 安装依赖 创建菜单 总结 前言 主要写前端页面&#xff0c;采用vue框架写页面的导航栏&#xff01;&#xff01;&#xff01; Vue项目配置环境 安装…

数据库单表 DML(增删改)和基本的DQL(查)操作语

DML语句&#xff1a;数据删除&#xff0c;数据增加&#xff0c;数据修改 数据增加&#xff1a; 注意&#xff1a;当主键字段自增时&#xff0c;我们添加数据时&#xff0c;可以不写或写null 字符类型&#xff0c;必须加引号&#xff0c;其次非空字段必须添加数据&#xff0c;或…

【状语从句】

框架 概念&#xff0c;特点主将从现连接词时间条件地点结果方式让步原因目的比较省略倒装 解读 1【概念&#xff0c;特点】 一个完整的句子&#xff0c;去修饰另一个完整句子中的动词&#xff0c;称为状语从句&#xff1b;特点&#xff1a;从句完整&#xff0c;只用考虑连接词是…

Git远程仓库推送

这里我只连接了两个站点的远程仓库&#xff0c;一个是国内的Gitee&#xff0c;另一个是Github&#xff0c;这两个站点的连接方式主要有两种&#xff0c;第一种就是通过https来连接远程仓库&#xff0c;另一种是通过ssh公钥来连接&#xff0c;这两个站点练接的大致过程都是一样的…

Acrel-1000DP分布式光伏监控系统在江苏盛佳德新材料有限公司4.03MW分布式光伏10KV并网系统的应用

安科瑞戴婷 Acrel-Fanny 摘要&#xff1a;随着我国社会的不断进步,经济得到迅速的发展,城市化进程也逐渐加快。城市电力配电网络的供电压力逐渐增加,传统的发电技术已经不再适用于目前城市电力配电的发展现状。传统发电技术电力转化的效率比较低,对空气的污染也比较大,不利于城…

2024.7.29 刷题总结

2024.7.29 **每日一题** 682.棒球比赛&#xff0c;这道题是一道简单的模拟题&#xff0c;用栈模拟题中的四个操作就可以了&#xff0c;操作一是将x加到列表末尾&#xff0c;操作二是将列表的后两项之和加到列表末尾&#xff0c;操作三是把列表最后一项的两倍加到列表末尾&#…

如何使用大语言模型绘制专业图表

过去的一年里&#xff0c;我相信大部分人都已经看到了大语言模型(后文简称LLM)所具备的自然语言理解和文本生成的能力&#xff0c;还有很多人将其应用于日常工作中&#xff0c;比如文案写作、资料查询、代码生成……今天我要向大家介绍LLM的一种新使用方式——绘图。这里说的绘…

SpringBoot整合PowerJob 实现远程任务

PowerJob介绍 PowerJob 是全新一代分布式任务调度和计算框架&#xff0c;提供了可视化界面&#xff0c;可通过单机、远程等形式调用任务并提供了运行监控和日志查看的功能模块&#xff0c;是当前比较流行的分布式定时任务框架之一&#xff1b; PowerJob 官网文档地址 环境搭建…

DC系列靶场---DC 3靶场的渗透测试(一)

信息收集 Nmap扫描 nmap -sS -sV -T4 -p- -O 172.30.1.142//-sS TCP的SYN扫描 //-sV 服务版本检测 //-T4 野蛮的扫描&#xff08;常用&#xff09; //-O 识别操作系统 使用Nmap扫描只看到一个80端口&#xff0c;Apache的2.4.18版本。 http探测 使用Wappalyzer插件可以到…

OSMDroidOfflineDemo源码调试记录

文章目录 源码下载环境配置尝试不同离线加载遇到的问题 尝试安卓端加载离线地图&#xff0c;下载了使用osmdroid的离线版项目源码&#xff0c;更改JDK环境、gradle环境&#xff0c;一顿操作下来&#xff0c;踉踉跄跄的把程序跑起来了&#xff0c;但是离线的地图一直加载不出来。…

机器人笛卡尔空间阻抗控制

机器人笛卡尔空间阻抗控制是一种重要的机器人控制策略,它关注于机器人末端执行器在笛卡尔空间(即任务空间)内的动态特性,以实现与环境的柔顺交互。以下是对机器人笛卡尔空间阻抗控制的详细解释: 一、基本概念 笛卡尔空间:指机器人末端执行器(如手爪、工具等)所处的三维…

C++:了解谓词predicate

什么是谓词predicate 在C中&#xff0c;谓词是指可以作为函数参数&#xff0c;并且返回值类型为bool型的函数对象、Lambda表达式、普通函数或函数指针。谓词通常用于算法中&#xff0c;对序列中的元素进行某种测试&#xff0c;返回一个布尔类型的测试结果&#xff0c;根据不同…

QT基础教程(QEvent事件和事件过滤器)

文章目录 前言一、具体介绍二、具体案例1.鼠标事件2.键盘事件3.窗口事件 三、事件过滤器事件过滤器的工作原理 总结 前言 本篇文章将带大家来学习QT中的QEvent事件&#xff0c;QEvent 是 Qt 框架中的一个核心类&#xff0c;用于处理各种事件。在 Qt 的事件处理系统中&#xff…

C++学习日记 | LAB 10 运算符重载与友元函数

资料来源&#xff1a;南科大 于仕琪 C/C Program Design LINK&#xff1a;CPP/week10 at main ShiqiYu/CPP GitHub 一、本节内容 本节首先以一个例子具体演示和回顾操作符重载、友元函数以及重载<<操作符。习题部分则为各种运算符重载以及输入输出重载 1.1 Operator o…

nginx 版本升级

Nginx 的版本最开始使用的是 Nginx-1.18.0 &#xff0c; 由于服务升级&#xff0c;需要将 Nginx 的版本升级到 Nginx-1.19.7 &#xff0c;要求 Nginx 不能中断提供服务。 为了应对上述的需求&#xff0c;提供两种解决方案&#xff1a; 方案1&#xff1a; make upgrade 完成升…

包装类和泛型

&#x1f389;欢迎大家收看&#xff0c;请多多支持&#x1f339; &#x1f970;关注小哇&#xff0c;和我一起成长&#x1f680;个人主页&#x1f680; 包装类&#x1f319; Java中每个基本数据类型都对应了一个包装类&#xff0c; 除了int的包装类是Integer&#xff0c;char…

STM32项目分享:智能风扇系统

目录 一、前言 二、项目简介 1.功能详解 2.主要器件 三、原理图设计 四、PCB硬件设计 PCB图 五、程序设计 六、实验效果 七、资料内容 项目分享 一、前言 项目成品图片&#xff1a; 哔哩哔哩视频链接&#xff1a; https://www.bilibili.com/video/BV1xw4m1Y7sA…

详解 @RequestHeader 注解在 Spring Boot 中的使用

个人名片 🎓作者简介:java领域优质创作者 🌐个人主页:码农阿豪 📞工作室:新空间代码工作室(提供各种软件服务) 💌个人邮箱:[2435024119@qq.com] 📱个人微信:15279484656 🌐个人导航网站:www.forff.top 💡座右铭:总有人要赢。为什么不能是我呢? 专栏导…