爬虫 - ProtoBuf 协议

news/2024/7/19 11:33:40 标签: 爬虫

一、抓取请求

以下是请求的大致内容:
在这里插入图片描述
在这里插入图片描述

是乱码,需要解析。

二、解析

通过分析 requestresponseContent-Type: application/x-protobuf 得知:使用了谷歌的 protobuf 协议来传输数据,需要破解。

大致破解过程:
乱码 --> protobuf 数据 --> protobuf 文件 --> Java实体类 --> 序列化与反序列化 --> 传输数据。

三、破解

1. 获取 requestresponse 源文件

使用抓包工具 Fiddler 保存该请求的 requestresponse 源文件。不能直接复制 request Payloadresponse body 数据。直接复制的是富文本内容,我们需要的是原始的二进制数据。

2. 下载 Protoc

下载地址
下载解压之后,配置环境变量,路径配置到 bin 目录。
需要的两个控制台命令:

  • protoc --decode_raw < filename --命令一
  • protoc --java_out=./ filename --命令二

3. 获取 protobuf 原始数据

使用命令一,对 requestresponse 源文件操作。就会把 protobuf 原始数据打印到控制台。

4. 获取 protobuf 文件

这一步比较难,需要大致掌握 protobuf 语法,根据 protobuf 原始数据手动逆向出 protobuf 文件,并不断正向测试,修正 protobuf 文件。
官网文档由于是谷歌域名,所以被墙无法访问。
只能看些其他的网络资源

5. 生成 Java 实体类

使用命令二,对手动生成的 proto 文件操作。
在文件中需要加两行:
option java_package = "com.xxx.xxxx.xxxxx";
option java_outer_classname = "Filename";
会在 proto 文件同目录下,生成一个 com/xxx/xxxx/xxxxx/Filename.java 文件。

6. 序列化与反序列化

把该实体类放到工程内对应的目录下,在 pom 文件中加两个依赖,对应 protoc 版本。

<!--    Protoc相关依赖 -->  
<!-- https://mvnrepository.com/artifact/com.google.protobuf/protobuf-java -->  
<dependency>  
    <groupId>com.google.protobuf</groupId>  
    <artifactId>protobuf-java</artifactId>  
    <version>3.23.1</version>  
</dependency>  
<!-- https://mvnrepository.com/artifact/com.google.protobuf/protobuf-java-util -->  
<dependency>  
    <groupId>com.google.protobuf</groupId>  
    <artifactId>protobuf-java-util</artifactId>  
    <version>3.23.1</version>  
    <scope>runtime</scope>  
</dependency>

序列化并传输:

ProtoBuf.Message.Builder builder = ProtoBuf.Message.newBuilder();
builder.setF1();
builder.setF2();
ProtoBuf.Message data = builder.build();
byte[] payLoad = data.toByteArray();  
  
HttpRequest request = HttpRequest.post(url).body(payLoad);

反序列化:

ProtoBuf.Message msg = ProtoBuf.Message.parseFrom(data);

http://www.niftyadmin.cn/n/456481.html

相关文章

硬核拆解 | 拓尔微65W 2C1A氮化镓多口快充

随着身边智能设备的增多&#xff0c;一个充电头对应一个设备&#xff0c;出门需要携带多个充电器已经成为日常&#xff0c;有时还会忘带匹配的充电头&#xff0c;无法充电造成困扰...... 多口快充的出现解决了这一难题&#xff0c;出门仅需携带一个充电头&#xff0c;减轻背包…

2023/6/21总结

JS 解绑事件 对象.on事件 对象.on事件null 如果是 addEventListener方式必须使用 对象.removeEventListener () 匿名函数无法解绑 mouseover和mouseout会有冒泡效果mouseenter和mouseleave没有冒泡效果 事件委托&#xff1a; 事件委托是利用事件流的特征解决一…

二分查找 - 数据结构和算法教程

二分查找被定义为在排序数组中使用的一种搜索算法&#xff0c;它通过重复将搜索间隔分成两半来实现。二分查找的思想是利用数组被排序的信息&#xff0c;将时间复杂度降低到O&#xff08;log N&#xff09;。 在数据结构中应用二分查找的条件 数据结构必须排序。访问数据结构的…

岩土工程监测案例:完整链条的振弦传感器、采集仪和在线监测系统

岩土工程监测案例&#xff1a;完整链条的振弦传感器、采集仪和在线监测系统 在岩土工程监测中&#xff0c;振弦传感器被广泛应用于测量土体或岩体的振动情况&#xff0c;以了解地震或其他振动事件对结构物或地基的影响。振弦传感器具有高精度、快速响应、易于安装和低成本等优…

TC8:SOMEIPSRV_SD_MESSAGE_11-13

SOMEIPSRV_SD_MESSAGE_11: Subscribe Eventgroup entry type 目的 Subscribe Eventgroup entry type应用于订阅事件组 测试步骤 DUT CONFIGURE:启动具有下列信息的服务 – Service ID:SERVICE-ID-1 – Instance数量:1Tester:客户端-1发送SOME/IP Notification消息 – Entr…

python广度优先搜索(BFS)从入门到精通

广度优先搜索&#xff08;Breadth-First Search&#xff0c;简称BFS&#xff09;是一种图的遍历算法&#xff0c;用于在图或树中按照层级进行搜索。BFS从给定的起始节点开始&#xff0c;逐层遍历节点&#xff0c;直到找到目标节点或遍历完整个图。本文将介绍BFS算法的基本原理&…

Java 基础进阶篇(十八):正则表达式匹配规则和应用

文章目录 一、正则表达式概述二、正则表达式的匹配规则三、正则表达式在方法中的应用3.1 校验手机号、邮箱和座机电话号码3.2 字符串的内容替换和分割 四、编程题目4.1 表示数值的字符串4.2 非严格递增连续数字序列 一、正则表达式概述 正则表达式是对字符串&#xff08;包括普…

Android修行手册-多路USB外接摄像头

点击跳转>Unity3D特效百例点击跳转>案例项目实战源码点击跳转>游戏脚本-辅助自动化点击跳转>Android控件全解手册点击跳转>Scratch编程案例点击跳转>软考全系列 &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分享&…