TtCostVideoLogic.php 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  1. <?php
  2. namespace app\v1\logic\tool\advertCost;
  3. use GuzzleHttp\Client;
  4. use support\think\Db;
  5. class TtCostVideoLogic extends BaseAdvertLogic
  6. {
  7. // 执行正文
  8. protected function initStart(): void
  9. {
  10. $tokenMap = $this->getTtTokenMap();
  11. $accountList = $this->getTtAccountList();
  12. // 循环执行
  13. foreach ($accountList as $account)
  14. {
  15. $accessToken = $tokenMap[$account['pmid']] ?? "";
  16. if(!$accessToken) continue;
  17. // 获取消耗
  18. $dataList = $this->getTtVideoCost($account['advertiser_id'], $accessToken);
  19. // 数据加工,获取素材信息
  20. if($dataList){
  21. $videoMap = $this->getTtVideoNameMap($account['advertiser_id'], $accessToken, $dataList);
  22. // 整理数据入库
  23. $this->organizeDataList($account, $dataList, $videoMap);
  24. }
  25. }
  26. }
  27. // 获取媒体消耗
  28. protected function getTtVideoCost($advertiserId, $accessToken): array
  29. {
  30. $page = 1;
  31. $data = [];
  32. do {
  33. $url = 'https://ad.oceanengine.com/open_api/v3.0/report/custom/get/';
  34. $request_data = [
  35. 'advertiser_id'=>$advertiserId,
  36. 'dimensions'=>json_encode(["ad_platform_material_name","material_id","cdp_project_id","cdp_project_name","stat_time_day", "ad_platform_cdp_project_action_track_url"]),
  37. 'metrics'=>json_encode(["stat_cost","show_cnt","click_cnt","active","active_register","active_pay","valid_play","download_finish_cnt","total_play", "stat_pay_amount"]),
  38. 'filters'=>'[{"field":"image_mode","type":1,"operator":0,"values":["5","15"]},{"operator":4,"values":["0"],"field":"stat_cost","type":3}]',
  39. 'start_time'=>$this->date,
  40. 'end_time'=>$this->date,
  41. 'order_by'=>json_encode([]),
  42. 'page'=>1,
  43. 'page_size'=>100,
  44. ];
  45. $options = [
  46. "headers" => [
  47. 'Access-Token' => $accessToken,
  48. 'Content-Type' => 'application/json',
  49. ]
  50. ];
  51. $url = $url."?".http_build_query($request_data);
  52. $httpClient = new Client(['timeout' => 10]);
  53. $res = $httpClient->request('GET', $url, $options);
  54. $result = json_decode($res->getBody(), true);
  55. if (empty($result['data']['rows'])) {
  56. break;
  57. }
  58. $data = array_merge($data, $result['data']['rows']);
  59. $totalPage = $result['data']['page_info']['total_page'] ?? 1;
  60. $page++;
  61. } while ($page <= $totalPage);
  62. return $data;
  63. }
  64. protected function getTtVideo($advertiserId, $accessToken, $materialIds): array
  65. {
  66. $url = 'https://api.oceanengine.com/open_api/2/file/video/get/';
  67. $request_data = [
  68. 'advertiser_id'=>$advertiserId,
  69. 'filtering' => json_encode([
  70. "material_ids" => $materialIds,
  71. ]),
  72. ];
  73. $options = [
  74. "headers" => [
  75. 'Access-Token' => $accessToken,
  76. 'Content-Type' => 'application/json',
  77. ]
  78. ];
  79. $url = $url."?".http_build_query($request_data);
  80. $httpClient = new Client(['timeout' => 10]);
  81. $res = $httpClient->request('GET', $url, $options);
  82. $result = json_decode($res->getBody(), true);
  83. return $result['data']['list'] ?? [];
  84. }
  85. protected function getTtVideoNameMap($advertiserId, $accessToken, $dataList): array
  86. {
  87. if(!$dataList) return $dataList;
  88. $videoMaterialIds = [];
  89. foreach ($dataList as $vv){
  90. $videoMaterialIds[] = $vv['dimensions']['material_id'];
  91. }
  92. // 判断是否超过100条,切割处理
  93. $videoIdList = array_chunk($videoMaterialIds, 100);
  94. $videoList = [];
  95. foreach ($videoIdList as $videoIds) {
  96. $videos = $this->getTtVideo($advertiserId, $accessToken, $videoIds);
  97. $videoList = array_merge($videoList, $videos);
  98. }
  99. $videoData = [];
  100. if($videoList) {
  101. foreach ($videoList as $val){
  102. $videoData[$val['material_id']] = $val;
  103. }
  104. }
  105. return $videoData;
  106. }
  107. // 整理入库数据列表
  108. protected function organizeDataList($account, $dataList, $videoMap): void
  109. {
  110. if(!$dataList) return;
  111. $db = Db::connect('db_advert');
  112. // 返点率
  113. $fandianRate = ($account['son_fandian']>1) ? (1/$account['son_fandian']) : $account['son_fandian'];
  114. foreach ($dataList as $val) {
  115. $cost = $val['metrics']['stat_cost'];
  116. if($cost=='0.00') continue;
  117. $materialId = $val['dimensions']['material_id'];
  118. $materialName = $val['dimensions']['ad_platform_material_name'];
  119. $adId = $val['dimensions']['cdp_project_id'];
  120. $adName = $val['dimensions']['cdp_project_name'];
  121. $materialUrl = $videoMap[$materialId]['url'] ?? "";
  122. $materialImg = $videoMap[$materialId]['poster_url'] ?? "";
  123. // Todo 从素材名称中获取归属人
  124. $authorId = $this->getAuthorId($materialName);
  125. // Todo 从广告名称中拆分归因数据
  126. $siteInfo = $this->getSiteInfo($adName);
  127. if(!$siteInfo['game_id'] || empty($this->siteMap[$siteInfo['site_id']])){
  128. $trackUrl = $val['dimensions']['ad_platform_cdp_project_action_track_url'] ?? "";
  129. $siteInfo = $this->getSiteInfo($trackUrl);
  130. }
  131. if(!$siteInfo['game_id'] || empty($this->siteMap[$siteInfo['site_id']])) continue;
  132. $materialData = [
  133. 'ad_id' => $adId,
  134. 'game_id' => $siteInfo['game_id'],
  135. 'agent_id'=> $siteInfo['agent_id'],
  136. 'site_id' => $siteInfo['site_id'],
  137. 'media_id' => $this->siteMap[$siteInfo['site_id']]['media_id'] ?? 0,
  138. 'auth_id' => $this->siteMap[$siteInfo['site_id']]['auth_id'] ?? 0,
  139. 'material_name' => $materialName,
  140. 'material_url' => $materialUrl,
  141. 'material_img' => $materialImg,
  142. 'ori_money' => $cost,
  143. 'money' => $cost*$fandianRate,
  144. 'ad_show' => $val['metrics']['show_cnt'],
  145. 'click' => $val['metrics']['click_cnt'],
  146. 'total_play' => $val['metrics']['total_play'],
  147. 'valid_play' => $val['metrics']['valid_play'],
  148. 'download' => $val['metrics']['download_finish_cnt'],
  149. 'active' => $val['metrics']['active'],
  150. 'register' => $val['metrics']['active_register'],
  151. 'pay_count' => $val['metrics']['active_pay'],
  152. 'pay_amount' => $val['metrics']['stat_pay_amount'],
  153. 'author_id' => $authorId
  154. ];
  155. $where = [
  156. 'tdate' => $this->date,
  157. 'ad_id' => $adId,
  158. 'material_id' => $materialId,
  159. 'advertiser_id' => $account['advertiser_id'],
  160. ];
  161. $findId= $db->table($this->materialTable)->where($where)->value("id");
  162. if($findId) {
  163. $materialData['id'] = $findId;
  164. }
  165. // 保存数据
  166. $db->table($this->materialTable)->save(array_merge($materialData, $where));
  167. }
  168. }
  169. }