前言
公司广告投放业务,需要接入头条人群包. 查看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接口流程继续走