ProtoBuf是什么?反正就是类似于XML、json数据交换格式

前期准备

使用工具Fiddler抓取某音APP直播间数据,使用模拟器需要开启root安装xposed+justTrustMe插件(如果不装会被检测到代理不能进行代理抓包)

使用PC网页版查看直播间异步的内容,发现是一堆乱码,也看不懂是什么东西

1.png

我们复制地址 PHP 使用 file_get_content 保存内容到文件里面

上面保存的protobuffer内容就是需要解析的内容,解析protobuffer内容需要一个proto文件进行还原,这个文件我们肯定是拿不到的。那我们猜测他的proto文件内容,模仿着写一个,只要能拿到我们需要的内容就行了,下面我们就开始解析这个ProtoBuf协议生成的文件格式

开始

1、安装protobuf工具 配置系统环境变量

2、编写 dy.proto 文件

syntax = 'proto3';

package Api;

message Response {
    repeated ResponseContent content = 1;
    string cursor = 2;
    int32 fetch_interval=3;
    string internal_ext = 5;
    uint64 now = 4;
}

message ResponseContent {
    string method = 1;
    bytes payload = 2;
}

3、执行命令 protoc --php_out=./ *.proto

就会生成两个文件夹
11111111.png

4、引入google/protobuf

执行命令

composer require google/protobuf

修改composer.json 加入api命名空间

{
    "require": {
        "google/protobuf": "^3.18"
    },
    "autoload": {
        "psr-4": {
            "Api\\": "Api",
            "GPBMetadata\\": "GPBMetadata"
        }
    }
}

执行
composer dump-autoload

5、新建index.php

<?php

require "vendor/autoload.php";

$url = 'test.bin';
$data = file_get_contents($url);
$to = (new \Api\Response());
$to->mergeFromString($data);

echo "<pre>";
foreach ($to->getContent() as $content) {
    var_dump($content);
}

执行 php index.php

QQ图片20210925093959.png

我们抓取保存到test.bin的乱码的数据已经被解析成了一个对象,其中还是有很多乱码,那就该需要细化proto的规则

类似于多维数组、我们只是解析了第一层而已

protobuffer格式可以理解为是 '1.张三2.zhang3.99999' 这样的一个字符 只有序号和值 ,proto文件重要的是猜测他的数据类型 1.string 2.string 3.uint64... ,然后随便给他命个名都行

后面有空再写一个自动化的抓包解析吧