GdtCostVideoLogic.php 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. <?php
  2. namespace app\v1\logic\tool\advertCost;
  3. use app\adapter\GdtAdapter;
  4. use GuzzleHttp\Client;
  5. use support\think\Db;
  6. class GdtCostVideoLogic extends BaseAdvertLogic
  7. {
  8. // 执行正文
  9. protected function initStart(): void
  10. {
  11. $tokenMap = $this->getGdtTokenMap();
  12. $accountList = $this->getGdtAccountList();
  13. // 循环执行
  14. foreach ($accountList as $account)
  15. {
  16. $accessToken = $tokenMap[$account['pmid']] ?? "";
  17. if(!$accessToken) continue;
  18. // 获取消耗
  19. $dataList = (new GdtAdapter())->getVideoCost($account['advertiser_id'], $accessToken, $this->date);
  20. // 数据加工,获取素材信息
  21. if($dataList){
  22. $videoMap = $this->getGdtVideoNameMap($account['advertiser_id'], $accessToken, $dataList);
  23. // 整理数据入库
  24. $this->organizeDataList($account, $dataList, $videoMap);
  25. }
  26. }
  27. }
  28. // 获取素材id信息 $mediaIds 最多100个
  29. protected function getGdtVideo($advertiserId, $accessToken, $videoIds): array
  30. {
  31. $nonce = md5(time().rand(00000, 99999));
  32. $url = 'https://api.e.qq.com/v3.0/videos/get?access_token='.$accessToken.'&timestamp='.time().'&nonce='.$nonce;
  33. $request_data = [
  34. 'account_id' => $advertiserId,
  35. 'filtering' => json_encode([
  36. [
  37. 'field' => 'media_id',
  38. 'operator' => 'IN',
  39. 'values' => $videoIds,
  40. ]
  41. ]),
  42. ];
  43. $url = $url."&".http_build_query($request_data);
  44. $httpClient = new Client(['timeout' => 10]);
  45. $res = $httpClient->request('GET', $url);
  46. $result = json_decode($res->getBody(), true);
  47. return $result['data']['list'] ?? [];
  48. }
  49. protected function getGdtVideoNameMap($advertiserId, $accessToken, $dataList)
  50. {
  51. if(!$dataList) return $dataList;
  52. $videoMaterialIds = array_column($dataList, "video_id");
  53. // 判断是否超过100条,切割处理
  54. $videoIdList = array_chunk($videoMaterialIds, 100);
  55. $videoList = [];
  56. foreach ($videoIdList as $videoIds) {
  57. $videos = $this->getGdtVideo($advertiserId, $accessToken, $videoIds);
  58. $videoList = array_merge($videoList, $videos);
  59. }
  60. $videoData = [];
  61. if($videoList) {
  62. foreach ($videoList as $val){
  63. $videoData[$val['video_id']] = $val;
  64. }
  65. }
  66. return $videoData;
  67. }
  68. // 整理入库数据列表
  69. protected function organizeDataList($account, $dataList, $videoMap): void
  70. {
  71. if(!$dataList) return;
  72. $db = Db::connect('db_advert');
  73. // 返点率
  74. $fandianRate = ($account['son_fandian']>1) ? (1/$account['son_fandian']) : $account['son_fandian'];
  75. foreach ($dataList as $val) {
  76. $cost = $val['cost']/100;
  77. if($cost==0) continue;
  78. $adId = $val['adgroup_id'];
  79. $adName = $val['adgroup_name'];
  80. $materialId = $val['video_id'];
  81. $materialName = $videoMap[$materialId]["description"] ?? "";
  82. $materialUrl = $videoMap[$materialId]["preview_url"] ?? "";
  83. $materialImg = $videoMap[$materialId]['key_frame_image_url'] ?? "";
  84. // Todo 从素材名称中获取归属人
  85. $authorId = $this->getAuthorId($materialName);
  86. // Todo 从广告名称中拆分归因数据
  87. $siteInfo = $this->getSiteInfo($adName);
  88. if(!$siteInfo['game_id'] || empty($this->siteMap[$siteInfo['site_id']])) continue;
  89. $materialData = [
  90. 'ad_id' => $adId,
  91. 'game_id' => $siteInfo['game_id'],
  92. 'agent_id'=> $siteInfo['agent_id'],
  93. 'site_id' => $siteInfo['site_id'],
  94. 'media_id' => $this->siteMap[$siteInfo['site_id']]['media_id'] ?? 0,
  95. 'auth_id' => $this->siteMap[$siteInfo['site_id']]['auth_id'] ?? 0,
  96. 'material_name' => $materialName,
  97. 'material_url' => $materialUrl,
  98. 'material_img' => $materialImg,
  99. 'ori_money' => $cost,
  100. 'money' => $cost*$fandianRate,
  101. 'ad_show' => $val['view_count'],
  102. 'click' => $val['valid_click_count'],
  103. 'total_play' => $val['video_outer_play_count'],
  104. 'valid_play' => $val['video_outer_play100_count'],
  105. 'download' => $val['download_count'],
  106. 'active' => $val['activated_count'],
  107. 'pay_count' => $val['first_pay_count'],
  108. 'author_id' => $authorId
  109. ];
  110. $where = [
  111. 'tdate' => $this->date,
  112. 'ad_id' => $adId,
  113. 'material_id' => $materialId,
  114. 'advertiser_id' => $account['advertiser_id'],
  115. ];
  116. $findId= $db->table($this->materialTable)->where($where)->value("id");
  117. if($findId) {
  118. $materialData['id'] = $findId;
  119. }
  120. // 保存数据
  121. $db->table($this->materialTable)->save(array_merge($materialData, $where));
  122. }
  123. }
  124. }