getAdvertiserMap($this->mediaId); // 循环执行 foreach ($advertiserList as $account) { $accessToken = $account['access_token'] ?? ""; if(!$accessToken) continue; // 获取消耗 $dataList = (new ToutiaoAdapter)->getVideoCost($account['advertiser_id'], $accessToken, $this->date); // 数据加工,获取素材信息 if($dataList){ $videoMap = $this->getTtVideoNameMap($account['advertiser_id'], $accessToken, $dataList); // 整理数据入库 $this->organizeDataList($account, $dataList, $videoMap); } } } protected function getTtVideoNameMap($advertiserId, $accessToken, $dataList): array { if(!$dataList) return $dataList; $videoMaterialIds = []; foreach ($dataList as $vv){ $videoMaterialIds[] = $vv['dimensions']['material_id']; } // 判断是否超过100条,切割处理 $videoIdList = array_chunk($videoMaterialIds, 100); $videoList = []; foreach ($videoIdList as $videoIds) { $videos = (new ToutiaoAdapter())->getVideo($advertiserId, $accessToken, $videoIds); $videoList = array_merge($videoList, $videos); } $videoData = []; if($videoList) { foreach ($videoList as $val){ $videoData[$val['material_id']] = $val; } } return $videoData; } // 整理入库数据列表 protected function organizeDataList($account, $dataList, $videoMap): void { if(!$dataList) return; $db = Db::connect('db_advert'); // 返点率 $fandianRate = ($account['son_fandian']>1) ? (1/$account['son_fandian']) : $account['son_fandian']; foreach ($dataList as $val) { $cost = $val['metrics']['stat_cost']; if($cost=='0.00') continue; $materialId = $val['dimensions']['material_id']; $materialName = $val['dimensions']['ad_platform_material_name']; $adId = $val['dimensions']['cdp_project_id']; $adName = $val['dimensions']['cdp_project_name']; $materialUrl = $videoMap[$materialId]['url'] ?? ""; $materialImg = $videoMap[$materialId]['poster_url'] ?? ""; // Todo 从素材名称中获取归属人 $authorId = $this->getAuthorId($materialName); // Todo 从广告名称中拆分归因数据 $siteInfo = $this->getSiteInfo($adName); if(!$siteInfo['game_id'] || empty($this->siteMap[$siteInfo['site_id']])){ $trackUrl = $val['dimensions']['ad_platform_cdp_project_action_track_url'] ?? ""; $siteInfo = $this->getSiteInfo($trackUrl); } if(!$siteInfo['game_id'] || empty($this->siteMap[$siteInfo['site_id']])) continue; $materialData = [ 'ad_id' => $adId, 'game_id' => $siteInfo['game_id'], 'agent_id'=> $siteInfo['agent_id'], 'site_id' => $siteInfo['site_id'], 'media_id' => $this->siteMap[$siteInfo['site_id']]['media_id'] ?? 0, 'auth_id' => $this->siteMap[$siteInfo['site_id']]['auth_id'] ?? 0, 'material_name' => $materialName, 'material_url' => $materialUrl, 'material_img' => $materialImg, 'ori_money' => $cost, 'money' => $cost*$fandianRate, 'ad_show' => $val['metrics']['show_cnt'], 'click' => $val['metrics']['click_cnt'], 'total_play' => $val['metrics']['total_play'], 'valid_play' => $val['metrics']['valid_play'], 'download' => $val['metrics']['download_finish_cnt'], 'active' => $val['metrics']['active'], 'register' => $val['metrics']['active_register'], 'pay_count' => $val['metrics']['active_pay'], 'pay_amount' => $val['metrics']['stat_pay_amount'], 'author_id' => $authorId ]; $where = [ 'tdate' => $this->date, 'ad_id' => $adId, 'material_id' => $materialId, 'advertiser_id' => $account['advertiser_id'], ]; $findId= $db->table($this->materialTable)->where($where)->value("id"); if($findId) { $materialData['id'] = $findId; } // 保存数据 $db->table($this->materialTable)->save(array_merge($materialData, $where)); } } }