红薯小眼睛接口分析与Python脚本实现

文章目录

  • 1. 写在前面
  • 2. 接口分析
  • 3. 算法脚本实现

【🏠作者主页】:吴秋霖
【💼作者介绍】:擅长爬虫与JS加密逆向分析!Python领域优质创作者、CSDN博客专家、阿里云博客专家、华为云享专家。一路走来长期坚守并致力于Python与爬虫领域研究与开发工作!
【🌟作者推荐】:对爬虫领域以及JS逆向分析感兴趣的朋友可以关注《爬虫JS逆向实战》《深耕爬虫领域》
未来作者会持续更新所用到、学到、看到的技术知识!包括但不限于:各类验证码突防、爬虫APP与JS逆向分析、RPA自动化、分布式爬虫、Python领域等相关文章

作者声明:文章仅供学习交流与参考!严禁用于任何商业与非法用途!否则由此产生的一切后果均与作者无关!如有侵权,请联系作者本人进行删除!

1. 写在前面

  作者在之前的文章内有提到关于a1、webid、sec_poison_id这些Cookie组成参数的的讲解及实现算法!以及关键组成参数web_session的获取方式、这个参数之前也提到了分为游客与登录用户,那么用户在访问浏览一篇笔记的时候,一定会触发了某个接口后+1(也就是小眼睛访问量)

2. 接口分析

要实现对小眼睛的+1,首先我们需要深入去研究分析一下它触发了哪个接口。作者这里在非登录的状态下去打开一篇笔记内容,看一下发包请求,如下所示:

在这里插入图片描述

metrics_report这个接口在经过多次的验证与测试下,发现就是让小眼睛+1的接口。也就是说我们去请求一次这个接口那么它就会+1。但是问题来了!基于什么?应该是用户的Cookie信息,也就是当中的web_session

这里我们把请求的参数拿出来分析一下,note_id是笔记的ID、另外注意看user_id有两个,一个自己的一个笔记作者的。如下所示:

json_data = {"note_id": "666175a3000000000d00e05e","note_type": 1,"report_type": 1,"stress_test": False,"viewer": {"user_id": "6676e1d0000000001c0034e8","followed_author": 0},"author": {"user_id": "65d6ea1d000000000d024df2"},"interaction": {"like": 0,"collect": 0,"comment": 0,"comment_read": 0},"note": {"stay_seconds": 0},"other": {"platform": "web"}
}

3. 算法脚本实现

现在需要梳理一下整个+1的流程,将实现流程使用Python代码来实现。首先第一步需要先生成游客的身份信息,通过作者之前文章内的算法实现如下:

# 生成CK的必要组成参数
async def generator_cookie_info(self):ck_info = await self.get_core_algorithm()return {'a1': ck_info['a1'],'webId': ck_info['webid'],'sec_poison_id': ck_info['sec_poison_id']}

上面代码中调用了核心的加密算法函数,主要就是CK组成参数的算法跟签名,如下所示:

# 最新JS算法是作者6.20重新还原的
async def get_core_algorithm(self, is_ck: bool = False, params: str = '') -> Dict[str, str]:with open("xs-xsc620.js", encoding='utf-8') as f:ctx = execjs.compile(f.read())if not is_ck:return ctx.call("getwebid")else:xts = ctx.call('getXs', params, self.cookies['a1'])xtscommon = ctx.call('getXsc', xts, self.cookies['a1'])self.headers.update({'x-s': xts['X-s'],'x-s-common': xtscommon,'x-t': str(xts['X-t'])})

接下来,我们需要拿到服务端给的web_session,通过请求调用login/activate这个接口获取,代码实现如下所示:

async def get_web_session(self):login_activate = "/api/sns/web/v1/login/activate"self.cookies = await self.generator_cookie_info()login_activate_api = f'url={login_activate}' + \json.dumps({}).replace(" ", "")await self.get_core_algorithm(is_ck=True, params=login_activate_api)data = json.dumps({}, separators=(',', ':')).replace(" ", "")async with self.session.post(f'https://edith.xhs.com{login_activate}',cookies=self.cookies,headers=self.headers,data=data) as response:response_data = await response.json()logger.info(f'获取web_session信息: {response_data}')self.cookies['web_session'] = response_data['data']['session']await self.metrics_report()

拿到web_session之后,使用完整的CK信息去请求之前我们提到的小眼睛的metrics_report接口,以此实现+1的效果,运行效果如下所示:

在这里插入图片描述

注意上图!流程就是先通过JS算法签名,去activate的接口拿到服务端返回的session信息,然后拼接JS算法生成的其他Cookie参数字段,访问metrics_report接口

运行脚本之前作者也是截图做了一下保存,以此为标识来记录一下程序的效果,如下所示:

在这里插入图片描述

程序分别使用了不同CK信息对作者自己的笔记进行了测试,测试效果如下所示(+10):

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

数据库系统原理练习 | 作业2-第2章关系数据库(附答案)

整理自博主本科《数据库系统原理》专业课完成的课后作业,以便各位学习数据库系统概论的小伙伴们参考、学习。 *文中若存在书写不合理的地方,欢迎各位斧正。 专业课本: 目录 一、选择题 二、填空题 三、简答题 四、关系代数 1.课本p70页&…

Vatee万腾平台:引领智能互联新时代

在科技浪潮的推动下,我们正步入一个前所未有的智能互联新时代。在这个时代里,万物皆可互联,数据成为新的生产要素,智能技术深刻改变着人类社会的每一个角落。而Vatee万腾平台,正是这一新时代的引领者,以其卓…

盘点各个国家的国宝

中国:熊猫 熊猫已有800万年的历史,和它们同时代的动物都已灭绝,大熊猫生存至今成为“活化石”。 俄罗斯:北极熊 北极熊是世界上最大的陆地食肉动物,体型巨大,性格凶猛。 美国:白头海雕 白头海雕…

事件分发机制:demo复现自定义ViewGroup点击事件不起作用

几年前遇到的一个bug,不弄清楚心里就是不舒服! 平时应用开发中,经常遇到的UI需求,例如抖音的设置界面,如下图所示: 很容易想到,自定义一个Layout,左边一个图标,中间文…

二维树状数组区域查询

落谷4514 过关代码如下 #define _CRT_SECURE_NO_WARNINGS #include<bits/stdc.h> using namespace std; //#define int long longconst int N 2050; int t1[N][N], t2[N][N], t3[N][N], t4[N][N]; int lowbit(int x) { return x & (-x); } int n, m; void update(…

@Slf4j idea标红Cannot resolve symbol ‘log‘

一、背景 时间久了没有应用idea,打开工程后项目 log 提示报红&#xff0c;未能解析&#xff0c;Cannot resolve symbol log &#xff0c;Slf4j 注解正常&#xff0c;应用的lombok插件。 检查lombok插件安装情况&#xff0c;发现未安装&#xff0c;重新安装重启idea后正常。 二…

zxing-cpp+OpenCV根据字符串生成条形码

编译构建 需要使用到 CMake、Git、GCC 或 MSVC。 github 链接&#xff1a;https://github.com/zxing-cpp/zxing-cpp 编译之前请确保&#xff1a; 确保安装了 CMake 版本 3.15 或更高版本。 确保安装了与 C17 兼容的编译器(最低VS 2019 16.8 / gcc 7 / clang 5)。 编译构建…

什么是 VueQuill(前端的富文本编辑器)?

什么是 VueQuill&#xff1f; 1. 简介 VueQuill 是 Vue.js 的一个富文本编辑器插件&#xff0c;它基于 Quill 编辑器构建&#xff0c;提供了简洁且功能强大的富文本编辑功能。Quill 是一个现代化的富文本编辑器&#xff0c;提供丰富的文本编辑能力&#xff0c;支持多种格式和…

Beats:使用 Filebeat 从 Python 应用程序中提取日志

本指南演示了如何从 Python 应用程序中提取日志并将其安全地传送到 Elasticsearch Service 部署中。你将设置 Filebeat 来监控具有标准 Elastic Common Schema (ECS) 格式字段的 JSON 结构日志文件&#xff0c;然后你将在 Kibana 中查看日志事件发生的实时可视化。虽然此示例使…

前缀和数组 差分数组

前缀和 一维&#xff1a;通过空间换时间适用于需要频繁查询某一段区间和的场景。 一维数组&#xff1a; 一维前缀和中的每一项&#xff1a; &#xff0c;该前缀和中的每一项也就是数组中对应的前 i 项和。 一维前缀和数组的构造&#xff1a; 在输入原数组时同步构造前缀和…

2024年中国陶瓷轴承用氮化硅粉体市场发展现状及重点竞争企业研究

2024年中国陶瓷轴承用氮化硅粉体市场发展现状及重点竞争企业研究 氮化硅是一种硬度高、结构稳定、热膨胀系数小&#xff0c;抗氧化和抗侵蚀性能好的一种的陶瓷材料&#xff0c;可用于制造高性能氮化硅陶瓷结构件、坩埚涂层等。近年来&#xff0c;伴随着机械制造行业进一步向高精…

WPF UI 3D 基本概念 点线三角面 相机对象 材质对象与贴图 3D地球 光源 变形处理 动作交互 辅助交互插件 系列三

WPF UI交互专题 平面图形 Path Drawing 绘图 渐变 Brush 矩阵 Transform 变形 阴影效果 模糊效果 自定义灰度去色效果 系列二-CSDN博客 1软件中的3D基本概念 WPF 中 3D 功能的设计初衷并非提供功能齐全的游戏开发平台。 WPF 中的 3D 图形内容封装在 Viewport3D 元素中&#x…

期末上分站——计组(2)

复习题11-20 11、 某DRAM芯片&#xff0c;其存储容量为512K8位&#xff0c;该芯片的地址线和数据线的数目是_D__。 A. 8, 512 B. 512, 8 C. 18, 8 D. 19 ,8 解析: 某DRAM芯片&#xff0c;其存储容量为512K8位时&#xff0c;该芯片的地址线和数据线的数目是D选项&a…

【吊打面试官系列-MyBatis面试题】为什么说 Mybatis 是半自动 ORM 映射工具?它与全自动的区别在哪里?

大家好&#xff0c;我是锋哥。今天分享关于 【为什么说 Mybatis 是半自动 ORM 映射工具&#xff1f;它与全自动的区别在哪里&#xff1f;】面试题&#xff0c;希望对大家有帮助&#xff1b; 为什么说 Mybatis 是半自动 ORM 映射工具&#xff1f;它与全自动的区别在哪里&#xf…

LabVIEW与OpenCV图像处理对比

LabVIEW和OpenCV在图像处理方面各有特点。LabVIEW擅长图形化编程、实时处理和硬件集成&#xff0c;而OpenCV则提供丰富的算法和多语言支持。通过DLL、Python节点等方式&#xff0c;OpenCV的功能可在LabVIEW中实现。本文将结合具体案例详细分析两者的特点及实现方法。 LabVIEW与…

JAVA学习笔记-JAVA基础语法-DAY21-缓冲流、转换流、序列化流

第一章 缓冲流 昨天学习了基本的一些流&#xff0c;作为IO流的入门&#xff0c;今天我们要见识一些更强大的流。比如能够高效读写的缓冲流&#xff0c;能够转换编码的转换流&#xff0c;能够持久化存储对象的序列化流等等。这些功能更为强大的流&#xff0c;都是在基本的流对象…

45 mysql truncate 的实现

前言 truncate 是一个我们也经常会使用到的命令 其作用类似于 delete from $table; 但是 他会比 delete 块很多&#xff0c;这里我们来看一下 它的实现 delete 的时候会逐行进行处理, 打上 删除标记, 然后 由后台任务 进行数据处理 truncate table 的实现 执行 sql 如下 …

C++20中的基于范围的for循环(range-based for loop)

C11中引入了对基于范围的for循环(range-based for loop)的支持&#xff1a;该循环对一系列值(例如容器中的所有元素)进行操作。代码段如下&#xff1a; const std::vector<int> vec{ 1,2,3,4,5 }; for (const auto& i : vec)std::cout << i << ", …

OpenCV从图像中截取矩形区域

使用OpenCV可以很容易地实现将一个图像文件内部指定矩形范围内的图像复制为新的图像。 import cv2# 读取原始图像 image cv2.imread(mm.png) cv2.imshow(Origi Image, image)# 定义矩形框的坐标 x, y, width, height 20, 30, 200, 300 # 坐标和尺寸# 截取矩形框内的图像 cr…

CTF入门知识点

CTF知识点 md5函数 <?php$a 123;echo md5($a,true); ?> 括号中true显示输出二进制 替换成false显示输出十六进制绕过 ffifdyop 这个字符串被 md5 哈希了之后会变成 276f722736c95d99e921722cf9ed621c&#xff0c;这个字符串前几位刚好是 or 6 而 Mysql 刚好又会把 …