PHP 头条(巨量)人群包API接入

前言

公司广告投放业务,需要接入头条人群包. 查看API发现,头条人群包对数据格式有要求

1
2
3
Protocol Buffers(简称protobuf)是一种轻便高效的数据序列化格式,可用于结构化数据的序列化和反序列化。
它由Google开发并开源,用于解决数据交换和存储的通用问题。
DMP上传文件只支持protobuf的数据格式。现况支持 IMEI_MD5、IDFA_MD5、MOBILE_HASH_SHA256、OAID_MD5的数据类型。

需要注意, api要求的protobuf使用的proto2. php安装完毕是proto3版本. 3格式处理完毕后,头条是不认的. 所以我们要想办法处理为头条认可格式.

安装 protobuf 2.6

1
2
3
4
5
6
7
wget https://github.com/protocolbuffers/protobuf/releases/download/v2.6.1/protobuf-2.6.1.tar.gz
tar zxvf protobuf-2.6.1.tar.gz
cd protobuf-2.6.1
./configure --prefix=/usr/local/protobuf
make && make install
export PATH=/usr/local/protobuf/bin:$PATH //第一次装可以不执行,版本替换需要执行
protoc --version

安装php对应扩展

1
2
3
4
5
6
7
wget https://github.com/allegro/php-protobuf/archive/master.zip
unzip master.zip
cd php-protobuf-master
phpize
./configure 
make && make install
然后在php.ini里面加一下extension = protobuf.so,再重启php-fpm

支持类库文件

1
2
3
4
curl -s http://getcomposer.org/installer | php
php composer.phar install
php ./php-protobuf-master/protoc-gen-php.php DmpDataProto.proto
// 生成完的文件放入到自己项目内

php 生成代码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
use Toutiao\Dmp\DmpData;
use Toutiao\Dmp\IdItem;
use Toutiao\Dmp\IdItem_DataType;

class xxx {
    public function make(){
        // 读取生成好的人群包文件( 按自己需求, 数据库,数组都可以)
        $handle = fopen('xxxx.txt', 'r');
        $list = [];
        if($handle){
            while (($line = fgets($handle)) !== false) {
                $list[] = str_replace("\n", "",$line);
            }
        }

        // 控制每行大小
        $list = array_chunk($list,2000);
        foreach($list as $items){
            $dmpData = new DmpData();
            foreach($items as $item){
                $idItem = new IdItem();
                // 类型需要确认好,有些人群包类型已经不支持了
                $idItem->setDataType(IdItem_DataType::OAID_MD5);
                $idItem->setId(md5(strtolower($item)));
                $idItem->setTimestamp(time());
                $dmpData->appendIdList($idItem);
            }
            $tmp = $dmpData->serializeToString();
            $ss .=base64_encode($tmp)."\n";
        }

        try{
            $zip = new ZipArchive();
            $zipFileName = 'target_pb2.zip';
            if ($zip->open($zipFileName, ZipArchive::CREATE) === true) {
                $zip->addFromString('target_pb2', $ss);
                $zip->close();
            }
        }catch(\Exception $e){}
    }
}

至此人群包数据生成完毕, 后续可以按照上传pb包/创建数据源/更新数据源/发布人群包api接口流程继续走

0%