爬虫 - ProtoBuf 协议

一、抓取请求

以下是请求的大致内容:
爬虫 - ProtoBuf 协议_第1张图片
在这里插入图片描述

是乱码,需要解析。

二、解析

通过分析 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 版本。

  
  
<dependency>  
    <groupId>com.google.protobufgroupId>  
    <artifactId>protobuf-javaartifactId>  
    <version>3.23.1version>  
dependency>  
  
<dependency>  
    <groupId>com.google.protobufgroupId>  
    <artifactId>protobuf-java-utilartifactId>  
    <version>3.23.1version>  
    <scope>runtimescope>  
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);

你可能感兴趣的:(爬虫)