getGdtTokenMap(); $accountList = $this->getGdtAccountList(); // 循环执行 foreach ($accountList as $account) { $accessToken = $tokenMap[$account['pmid']] ?? ""; if(!$accessToken) continue; // 获取消耗 $dataList = $this->getGdtVideoCost($account['advertiser_id'], $accessToken); // 数据加工,获取素材信息 if($dataList){ $videoMap = $this->getGdtVideoNameMap($account['advertiser_id'], $accessToken, $dataList); // 整理数据入库 $this->organizeDataList($account, $dataList, $videoMap); } } } // 获取媒体消耗 protected function getGdtVideoCost($advertiserId, $accessToken): array { $page = 1; $data = []; do { $nonce = md5(time().rand(00000, 99999)); $url = 'https://api.e.qq.com/v3.0/daily_reports/get?access_token='.$accessToken.'×tamp='.time().'&nonce='.$nonce; $request_data = [ 'account_id' => $advertiserId, 'level' => 'REPORT_LEVEL_MATERIAL_VIDEO', 'date_range' => json_encode(['start_date'=>$this->date,'end_date'=>$this->date]), 'group_by' => json_encode(['date','video_id','adgroup_id']), 'fields' => json_encode(['date','video_id','adgroup_id','adgroup_name', 'view_count','valid_click_count','cost', 'activated_count','download_count','first_pay_count','video_outer_play_count','video_outer_play100_count']), 'page' => $page, 'page_size' => 1000, ]; $url = $url."&".http_build_query($request_data); $httpClient = new Client(['timeout' => 10]); $res = $httpClient->request('GET', $url); $result = json_decode($res->getBody(), true); if (empty($result['data']['list'])) { break; } $data = array_merge($data, $result['data']['list']); $totalPage = $result['data']['page_info']['total_page'] ?? 1; $page++; } while ($page <= $totalPage); return $data; } // 获取素材id信息 $mediaIds 最多100个 protected function getGdtVideo($advertiserId, $accessToken, $videoIds): array { $nonce = md5(time().rand(00000, 99999)); $url = 'https://api.e.qq.com/v3.0/videos/get?access_token='.$accessToken.'×tamp='.time().'&nonce='.$nonce; $request_data = [ 'account_id' => $advertiserId, 'filtering' => json_encode([ [ 'field' => 'media_id', 'operator' => 'IN', 'values' => $videoIds, ] ]), ]; $url = $url."&".http_build_query($request_data); $httpClient = new Client(['timeout' => 10]); $res = $httpClient->request('GET', $url); $result = json_decode($res->getBody(), true); return $result['data']['list'] ?? []; } protected function getGdtVideoNameMap($advertiserId, $accessToken, $dataList) { if(!$dataList) return $dataList; $videoMaterialIds = array_column($dataList, "video_id"); // 判断是否超过100条,切割处理 $videoIdList = array_chunk($videoMaterialIds, 100); $videoList = []; foreach ($videoIdList as $videoIds) { $videos = $this->getGdtVideo($advertiserId, $accessToken, $videoIds); $videoList = array_merge($videoList, $videos); } $videoData = []; if($videoList) { foreach ($videoList as $val){ $videoData[$val['video_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['cost']/100; if($cost==0) continue; $adId = $val['adgroup_id']; $adName = $val['adgroup_name']; $materialId = $val['video_id']; $materialName = $videoMap[$materialId]["description"] ?? ""; $materialUrl = $videoMap[$materialId]["preview_url"] ?? ""; $materialImg = $videoMap[$materialId]['key_frame_image_url'] ?? ""; // Todo 从素材名称中获取归属人 $authorId = $this->getAuthorId($materialName); // Todo 从广告名称中拆分归因数据 $siteInfo = $this->getSiteInfo($adName); 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['view_count'], 'click' => $val['valid_click_count'], 'total_play' => $val['video_outer_play_count'], 'valid_play' => $val['video_outer_play100_count'], 'download' => $val['download_count'], 'active' => $val['activated_count'], 'pay_count' => $val['first_pay_count'], '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)); } } }