FishTimes.php 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355
  1. <?php
  2. namespace app\command;
  3. use think\console\Command;
  4. use think\console\Input;
  5. use think\console\Output;
  6. use app\model\Company;
  7. use think\facade\Log;
  8. use app\model\FishCampaign;
  9. use app\model\FishCampaignList;
  10. use clue\Fish as clueFish;
  11. use clue\Tencent;
  12. class FishTimes extends Command
  13. {
  14. protected function configure()
  15. {
  16. $this->setName('fish_times')
  17. ->setDescription('Automatically update flying fish clues');
  18. }
  19. protected function execute(Input $input, Output $output)
  20. {
  21. Log::close(NULL);
  22. $list = Company::where("channel_setting <> 'null'")->field('root_id,channel_setting,channel_setting_wh')->select()->toArray();
  23. if (empty($list)) return $output->writeln("没有要执行的任务");
  24. $fish = new clueFish(config('app.fish_clue_appid'), config('app.fish_clue_secret'));
  25. $tencent = new Tencent(config('app.tx_clue_appid'), config('app.tx_clue_secret'));
  26. $fish_wh = new clueFish(config('app.fish_clue_appid_wh'), config('app.fish_clue_secret_wh'));
  27. foreach ($list as $val) {
  28. if(isset($val['channel_setting']) && $val['channel_setting']){
  29. $root_id = $val['root_id'];
  30. $tmp_data = json_decode($val['channel_setting'], true);
  31. $tmp_data = $this->refreshToken($fish, $tmp_data, $root_id);
  32. $start_date = date('Y-m-d');
  33. $advertiser_id = explode(',', $tmp_data['fish_adv']);
  34. foreach ($advertiser_id as $va) {
  35. $new_data = $fish->getCampaignListV2($tmp_data['fish_access_token'], ['advertiser_id' => $va, 'start_date' => $start_date, 'end_date' => $start_date, 'page' => 1]);
  36. if ($new_data['code'] == 0) {
  37. $page = $new_data['data']['page_info']['total_page'];
  38. $this->update_fish_campaign_data_new($new_data['data']['rows'], $fish, $tmp_data, $root_id, $start_date, $va, 1);
  39. if ($page > 1) {
  40. for ($i = 1; $i < $page; $i++) {
  41. $page_data = $fish->getCampaignListV2($tmp_data['fish_access_token'], ['advertiser_id' => $va, 'start_date' => $start_date, 'end_date' => $start_date, 'page' => $i + 1]);
  42. if ($page_data['code'] == 0) {
  43. $this->update_fish_campaign_data_new($page_data['data']['rows'], $fish, $tmp_data, $root_id, $start_date, $va, 1);
  44. }
  45. }
  46. }
  47. }
  48. $data = $fish->getCampaignList($tmp_data['fish_access_token'], ['advertiser_id' => $va, 'start_date' => $start_date, 'end_date' => $start_date, 'page' => 1]);
  49. if ($data['code'] == 0) {
  50. //如果广告组数据存在多页
  51. $page = $data['data']['page_info']['total_page'];
  52. $this->update_fish_campaign_data($data['data']['list'], $fish, $tmp_data, $root_id, $start_date, $va, 1);
  53. if ($page > 1) {
  54. for ($i = 1; $i < $page; $i++) {
  55. $page_data = $fish->getCampaignList($tmp_data['fish_access_token'], ['advertiser_id' => $va, 'start_date' => $start_date, 'end_date' => $start_date, 'page' => $i + 1]);
  56. if ($page_data['code'] == 0) {
  57. $this->update_fish_campaign_data($page_data['data']['list'], $fish, $tmp_data, $root_id, $start_date, $va, 1);
  58. }
  59. }
  60. }
  61. }
  62. }
  63. $advertiser_id = explode(',', $tmp_data['tx_adv']);
  64. foreach ($advertiser_id as $va) {
  65. $data = $tencent->getCampaignList($tmp_data['tx_access_token'], $va, $start_date);
  66. if ($data['code'] == 0) {
  67. $this->update_tx_campaign_data($data['data']['list'], $tencent, $tmp_data, $root_id, $start_date, $va);
  68. }
  69. }
  70. }
  71. if(isset($val['channel_setting_wh']) && $val['channel_setting_wh']){
  72. $root_id = $val['root_id'];
  73. $tmp_data = json_decode($val['channel_setting_wh'], true);
  74. $tmp_data = $this->refreshTokenV2($fish_wh, $tmp_data, $root_id);
  75. $start_date = date('Y-m-d');
  76. $advertiser_id = explode(',', $tmp_data['fish_adv']);
  77. foreach ($advertiser_id as $va) {
  78. $new_data = $fish->getCampaignListV2($tmp_data['fish_access_token'], ['advertiser_id' => $va, 'start_date' => $start_date, 'end_date' => $start_date, 'page' => 1]);
  79. if ($new_data['code'] == 0) {
  80. $page = $new_data['data']['page_info']['total_page'];
  81. $this->update_fish_campaign_data_new($new_data['data']['rows'], $fish, $tmp_data, $root_id, $start_date, $va, 4);
  82. if ($page > 1) {
  83. for ($i = 1; $i < $page; $i++) {
  84. $page_data = $fish->getCampaignListV2($tmp_data['fish_access_token'], ['advertiser_id' => $va, 'start_date' => $start_date, 'end_date' => $start_date, 'page' => $i + 1]);
  85. if ($page_data['code'] == 0) {
  86. $this->update_fish_campaign_data_new($page_data['data']['rows'], $fish, $tmp_data, $root_id, $start_date, $va, 4);
  87. }
  88. }
  89. }
  90. }
  91. $data = $fish_wh->getCampaignList($tmp_data['fish_access_token'], ['advertiser_id' => $va, 'start_date' => $start_date, 'end_date' => $start_date, 'page' => 1]);
  92. if ($data['code'] == 0) {
  93. //如果广告组数据存在多页
  94. $page = $data['data']['page_info']['total_page'];
  95. $this->update_fish_campaign_data($data['data']['list'], $fish_wh, $tmp_data, $root_id, $start_date, $va, 4);
  96. if ($page > 1) {
  97. for ($i = 1; $i < $page; $i++) {
  98. $page_data = $fish_wh->getCampaignList($tmp_data['fish_access_token'], ['advertiser_id' => $va, 'start_date' => $start_date, 'end_date' => $start_date, 'page' => $i + 1]);
  99. if ($page_data['code'] == 0) {
  100. $this->update_fish_campaign_data($page_data['data']['list'], $fish_wh, $tmp_data, $root_id, $start_date, $va, 4);
  101. }
  102. }
  103. }
  104. }
  105. }
  106. }
  107. }
  108. $output->writeln("同步完成");
  109. }
  110. /**
  111. * 更新腾讯广告组
  112. */
  113. public function update_tx_campaign_data($list, $tencent, $tmp_data, $root_id, $start_date, $advertiser_id)
  114. {
  115. $tmp = [];
  116. FishCampaign::where(['root_id' => $root_id, 'data_time' => $start_date, 'advertiser_id' => $advertiser_id, 'type' => 2])->delete();
  117. foreach ($list as $v) {
  118. $c_data['type'] = 2;
  119. $c_data['root_id'] = $root_id;
  120. $c_data['data_time'] = $start_date;
  121. $c_data['advertiser_id'] = $v['account_id'];
  122. $c_data['campaign_id'] = $v['adgroup_id'];
  123. $c_data['campaign_name'] = $v['adgroup_name'];
  124. $c_data['stat_datetime'] = '';
  125. $c_data['inventory'] = '';
  126. $c_data['cost'] = $v['cost'] > 0 ? round($v['cost'] / 100, 2) : 0;
  127. $c_data['show'] = $v['view_count'];
  128. $c_data['avg_show_cost'] = $v['thousand_display_price'];
  129. $c_data['click'] = $v['valid_click_count'];
  130. $c_data['avg_click_cost'] = $v['cpc'] > 0 ? round($v['cpc'] / 100, 2) : 0;
  131. $c_data['ctr'] = $v['ctr'] * 100;
  132. $c_data['convert'] = $v['conversions_count'];
  133. $c_data['convert_cost'] = $v['effective_cost'] > 0 ? round($v['effective_cost'] / 100, 2) : 0;
  134. $c_data['convert_rate'] = $v['view_count'] > 0 ? round($v['conversions_count'] / $v['view_count']) : 0;
  135. $c_data['deep_convert'] = 0;
  136. $c_data['deep_convert_cost'] = 0;
  137. $c_data['deep_convert_rate'] = 0;
  138. $tmp[] = $c_data;
  139. FishCampaignList::where(['root_id' => $root_id, 'data_time' => $start_date, 'advertiser_id' => $advertiser_id, 'campaign_id' => $v['adgroup_id'], 'type' => 2])->delete();
  140. $data = $tencent->getCampaignAdList($tmp_data['tx_access_token'], $advertiser_id, $start_date, $v['adgroup_id']);
  141. if ($data['code'] == 0) {
  142. $this->update_tx_adv_data($data['data']['list'], $root_id, $start_date, $advertiser_id);
  143. }
  144. }
  145. FishCampaign::insertAll($tmp);
  146. }
  147. /**
  148. * 更新腾讯广告组下的计划
  149. */
  150. public function update_tx_adv_data($data, $root_id, $data_time, $advertiser_id)
  151. {
  152. $tmp_adv_list = [];
  153. foreach ($data as $val) {
  154. $c_data['advertiser_id'] = $advertiser_id;
  155. $c_data['campaign_id'] = $val['adgroup_id'];
  156. $c_data['campaign_name'] = isset($val['ad_name'])&&empty($val['ad_name'])?$val['ad_name']:'';
  157. $c_data['ad_id'] = $val['ad_id'];
  158. $c_data['ad_name'] = isset($val['ad_name'])&&empty($val['ad_name'])?$val['ad_name']:'';
  159. $c_data['stat_datetime'] = $val['date'];
  160. $c_data['cost'] = $val['cost'] > 0 ? round($val['cost'] / 100, 2) : 0;
  161. $c_data['show'] = $val['view_count'];
  162. $c_data['click'] = $val['valid_click_count'];
  163. $c_data['avg_click_cost'] = $val['cpc'] > 0 ? round($val['cpc'] / 100, 2) : 0;
  164. $c_data['ctr'] = $val['ctr'] * 100;
  165. $c_data['convert'] = $val['conversions_count'];
  166. $c_data['convert_cost'] = $val['effective_cost'] > 0 ? round($val['effective_cost'] / 100, 2) : 0;
  167. $c_data['convert_rate'] = $val['view_count'] > 0 ? round($val['conversions_count'] / $val['view_count']) : 0;
  168. $c_data['root_id'] = $root_id;
  169. $c_data['data_time'] = $data_time;
  170. $c_data['type'] = 2;
  171. $tmp_adv_list[] = $c_data;
  172. }
  173. FishCampaignList::insertAll($tmp_adv_list);
  174. }
  175. /**
  176. * 更新数据
  177. */
  178. public function update_fish_campaign_data($list, $fish, $tmp_data, $root_id, $data_time, $advertiser_id, $type)
  179. {
  180. $data = [];
  181. foreach ($list as $val) {
  182. //先删除昨日数据后插入数据
  183. FishCampaign::where(['root_id' => $root_id, 'data_time' => $data_time, 'advertiser_id' => $advertiser_id, 'campaign_id' => $val['campaign_id'], 'type' => $type])->delete();
  184. FishCampaignList::where(['root_id' => $root_id, 'data_time' => $data_time, 'advertiser_id' => $advertiser_id, 'campaign_id' => $val['campaign_id'], 'type' => $type])->delete();
  185. $val['advertiser_id'] = $advertiser_id;
  186. $val['data_time'] = $data_time;
  187. $val['root_id'] = $root_id;
  188. $val['type'] = $type;
  189. unset($val['id']);
  190. $data[] = $val;
  191. //循环广告组获取广告组下的计划花费
  192. $adv_data = $fish->getAdList($tmp_data['fish_access_token'], ['advertiser_id' => $advertiser_id, 'campaign_ids' => $val['campaign_id'], 'start_date' => $data_time, 'end_date' => $data_time, 'page' => 1]);
  193. if ($adv_data['code'] == 0) {
  194. $page = $adv_data['data']['page_info']['total_page'];
  195. $this->update_fish_adv_data($adv_data['data']['list'], $root_id, $data_time, $advertiser_id, $type);
  196. //如果广告计划存在多页
  197. if ($page > 1) {
  198. for ($i = 1; $i < $page; $i++) {
  199. $tmp_adv_data = $fish->getAdList($tmp_data['fish_access_token'], ['advertiser_id' => $advertiser_id, 'campaign_ids' => $val['campaign_id'], 'start_date' => $data_time, 'end_date' => $data_time, 'page' => $i + 1]);
  200. if ($tmp_adv_data['code'] == 0) {
  201. $this->update_fish_adv_data($tmp_adv_data['data']['list'], $root_id, $data_time, $advertiser_id, $type);
  202. }
  203. }
  204. }
  205. }
  206. }
  207. FishCampaign::insertAll($data);
  208. }
  209. /**
  210. * 更新广告组下的计划
  211. */
  212. public function update_fish_adv_data($data, $root_id, $data_time, $advertiser_id, $type)
  213. {
  214. $tmp_adv_list = [];
  215. foreach ($data as $val) {
  216. unset($val['id']);
  217. unset($val['avg_show_cost']);
  218. $val['root_id'] = $root_id;
  219. $val['advertiser_id'] = $advertiser_id;
  220. $val['data_time'] = $data_time;
  221. $val['type'] = $type;
  222. $tmp_adv_list[] = $val;
  223. }
  224. FishCampaignList::insertAll($tmp_adv_list);
  225. }
  226. /**
  227. * 更新数据-新版
  228. */
  229. public function update_fish_campaign_data_new($list, $fish, $tmp_data, $root_id, $data_time, $advertiser_id, $type)
  230. {
  231. $data = [];
  232. foreach ($list as $val) {
  233. //先删除昨日数据后插入数据
  234. FishCampaign::where(['root_id' => $root_id, 'data_time' => $data_time, 'advertiser_id' => $advertiser_id, 'campaign_id' => $val['dimensions']['cdp_project_id'], 'type' => $type])->delete();
  235. FishCampaignList::where(['root_id' => $root_id, 'data_time' => $data_time, 'advertiser_id' => $advertiser_id, 'campaign_id' => $val['dimensions']['cdp_project_id'], 'type' => $type])->delete();
  236. $tmp_val['advertiser_id'] = $advertiser_id;
  237. $tmp_val['data_time'] = $data_time;
  238. $tmp_val['root_id'] = $root_id;
  239. $tmp_val['type'] = $type;
  240. $tmp_val['campaign_id'] = $val['dimensions']['cdp_project_id'];
  241. $tmp_val['campaign_name'] = $val['dimensions']['cdp_project_name'];
  242. $tmp_val['cost'] = $val['metrics']['stat_cost'];
  243. $tmp_val['show'] = $val['metrics']['show_cnt'];
  244. $tmp_val['avg_show_cost'] = $val['metrics']['cpm_platform'];
  245. $tmp_val['click'] = $val['metrics']['click_cnt'];
  246. $tmp_val['avg_click_cost'] = $val['metrics']['cpc_platform'];
  247. $tmp_val['ctr'] = $val['metrics']['ctr'];
  248. $tmp_val['convert'] = $val['metrics']['convert_cnt'];
  249. $tmp_val['convert_cost'] = $val['metrics']['conversion_cost'];
  250. $tmp_val['convert_rate'] = $val['metrics']['conversion_rate'];
  251. $tmp_val['deep_convert'] = $val['metrics']['deep_convert_cnt'];
  252. $tmp_val['deep_convert_cost'] = $val['metrics']['deep_convert_cost'];
  253. $tmp_val['deep_convert_rate'] = $val['metrics']['deep_convert_rate'];
  254. $data[] = $tmp_val;
  255. //循环广告组获取广告组下的计划花费
  256. $adv_data = $fish->getAdListV2($tmp_data['fish_access_token'], ['advertiser_id' => $advertiser_id, 'campaign_ids' => $val['dimensions']['cdp_project_id'], 'start_date' => $data_time, 'end_date' => $data_time, 'page' => 1]);
  257. if ($adv_data['code'] == 0) {
  258. $page = $adv_data['data']['page_info']['total_page'];
  259. $this->update_fish_adv_data_new($adv_data['data']['rows'], $root_id, $data_time, $advertiser_id,$val['dimensions']['cdp_project_id'],$val['dimensions']['cdp_project_name'], $type);
  260. //如果广告计划存在多页
  261. if ($page > 1) {
  262. for ($i = 1; $i < $page; $i++) {
  263. $tmp_adv_data = $fish->getAdListV2($tmp_data['fish_access_token'], ['advertiser_id' => $advertiser_id, 'campaign_ids' => $val['dimensions']['cdp_project_id'], 'start_date' => $data_time, 'end_date' => $data_time, 'page' => $i + 1]);
  264. if ($tmp_adv_data['code'] == 0) {
  265. $this->update_fish_adv_data_new($tmp_adv_data['data']['rows'], $root_id, $data_time, $advertiser_id,$val['dimensions']['cdp_project_id'],$val['dimensions']['cdp_project_name'], $type);
  266. }
  267. }
  268. }
  269. }
  270. }
  271. FishCampaign::insertAll($data);
  272. }
  273. /**
  274. * 更新广告组下的计划-新版
  275. */
  276. public function update_fish_adv_data_new($data, $root_id, $data_time, $advertiser_id, $campaign_id, $campaign_name , $type)
  277. {
  278. $tmp_adv_list = [];
  279. foreach ($data as $val) {
  280. $tmp_val['ad_id'] = $val['dimensions']['cdp_promotion_id'];
  281. $tmp_val['ad_name'] = isset($val['dimensions']['cdp_promotion_name'])&&empty($val['dimensions']['cdp_promotion_name'])?$val['dimensions']['cdp_promotion_name']:'';
  282. $tmp_val['cost'] = $val['metrics']['stat_cost'];
  283. $tmp_val['show'] = $val['metrics']['show_cnt'];
  284. $tmp_val['avg_click_cost'] = $val['metrics']['cpm_platform'];
  285. $tmp_val['click'] = $val['metrics']['click_cnt'];
  286. $tmp_val['ctr'] = $val['metrics']['ctr'];
  287. $tmp_val['convert'] = $val['metrics']['convert_cnt'];
  288. $tmp_val['convert_cost'] = $val['metrics']['conversion_cost'];
  289. $tmp_val['convert_rate'] = $val['metrics']['conversion_rate'];
  290. $tmp_val['campaign_id'] = $campaign_id;
  291. $tmp_val['campaign_name'] = $campaign_name;
  292. $tmp_val['root_id'] = $root_id;
  293. $tmp_val['advertiser_id'] = $advertiser_id;
  294. $tmp_val['data_time'] = $data_time;
  295. $tmp_val['type'] = $type;
  296. $tmp_adv_list[] = $tmp_val;
  297. }
  298. FishCampaignList::insertAll($tmp_adv_list);
  299. }
  300. /**
  301. * 刷新token
  302. */
  303. public function refreshToken($fish, $tmp_data, $root_id)
  304. {
  305. $fish_refresh_time = $tmp_data['fish_refresh_time']; //上次token更新时间
  306. if ($fish_refresh_time + 80000 < time()) {
  307. $token = $fish->getRefreshToken($tmp_data['fish_refresh_token']);
  308. if ($token['code'] == 0) {
  309. $tmp_data['fish_access_token'] = $token['data']['access_token'];
  310. $tmp_data['fish_refresh_token'] = $token['data']['refresh_token'];
  311. $tmp_data['fish_refresh_time'] = time();
  312. Company::where(['root_id' => $root_id])->update(['channel_setting' => json_encode($tmp_data)]);
  313. } else {
  314. $tmp_data['fish_access_token'] = '';
  315. $tmp_data['fish_refresh_token'] = '';
  316. Company::where(['root_id' => $root_id])->update(['channel_setting' => json_encode($tmp_data)]);
  317. }
  318. }
  319. return $tmp_data;
  320. }
  321. /**
  322. * 刷新token
  323. */
  324. public function refreshTokenV2($fish, $tmp_data, $root_id)
  325. {
  326. $fish_refresh_time = $tmp_data['fish_refresh_time']; //上次token更新时间
  327. if ($fish_refresh_time + 80000 < time()) {
  328. $token = $fish->getRefreshToken($tmp_data['fish_refresh_token']);
  329. if ($token['code'] == 0) {
  330. $tmp_data['fish_access_token'] = $token['data']['access_token'];
  331. $tmp_data['fish_refresh_token'] = $token['data']['refresh_token'];
  332. $tmp_data['fish_refresh_time'] = time();
  333. Company::where(['root_id' => $root_id])->update(['channel_setting_wh' => json_encode($tmp_data)]);
  334. } else {
  335. $tmp_data['fish_access_token'] = '';
  336. $tmp_data['fish_refresh_token'] = '';
  337. Company::where(['root_id' => $root_id])->update(['channel_setting_wh' => json_encode($tmp_data)]);
  338. }
  339. }
  340. return $tmp_data;
  341. }
  342. }