FishWh.php 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. <?php
  2. namespace app\command;
  3. use app\model\FishLive;
  4. use think\console\Command;
  5. use think\console\Input;
  6. use think\console\Output;
  7. use app\model\Company;
  8. use think\facade\Log;
  9. use clue\FishWh as clueFish;
  10. use think\facade\Db;
  11. class FishWh extends Command
  12. {
  13. protected function configure()
  14. {
  15. $this->setName('fish_live')
  16. ->setDescription('Automatically update flying fish live clues');
  17. }
  18. protected function execute(Input $input, Output $output)
  19. {
  20. Log::close(NULL);
  21. //查找存在配置的公司
  22. $list = Company::where("channel_setting_wh <> 'null'")
  23. ->field('root_id,channel_setting_wh')
  24. // ->where('root_id',$root_id)
  25. ->limit(50)
  26. ->select()->toArray();
  27. if (isset($list) && $list) {
  28. $appid = config('app.fish_clue_appid_wh');
  29. $secret = config('app.fish_clue_secret_wh');
  30. $fish = new clueFish($appid, $secret);
  31. foreach ($list as $val) {
  32. if(isset($val['channel_setting_wh']) && $val['channel_setting_wh']){
  33. $root_id = $val['root_id'];
  34. $tmp_data = json_decode($val['channel_setting_wh'], true);
  35. $tmp_data = $this->refreshToken($fish, $tmp_data, $root_id);
  36. $start_date = '2023-06-01 00:00:00';
  37. $end_date = date('Y-m-d H:i:s');
  38. $advertiser_id = explode(',', $tmp_data['fish_adv']);
  39. foreach ($advertiser_id as $va) {
  40. $data = $fish->getLiveAttribute(
  41. $tmp_data['fish_access_token'],
  42. [
  43. 'advertiser_id' => $va,
  44. 'start_date' => $start_date,
  45. 'end_date' => $end_date,
  46. 'page' => 1
  47. ]);
  48. // dump($data);die;
  49. if ($data['code'] == 0) {
  50. //如果广告组数据存在多页
  51. $page = $data['data']['page_info']['total_page'];
  52. $this->update_fish_live_data($data['data']['list'], $fish, $tmp_data, $root_id, $start_date, $va);
  53. if ($page > 1) {
  54. for ($i = 1; $i < $page; $i++) {
  55. $page_data = $fish->getLiveAttribute($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_live_data($page_data['data']['list'], $fish, $tmp_data, $root_id, $start_date, $va);
  58. }
  59. }
  60. }
  61. }
  62. }
  63. $fields = [
  64. 'live_watch_count',
  65. 'live_watch_ucount',
  66. 'click_product_ucount',
  67. 'live_form_submit_count',
  68. 'live_card_icon_component_show_count',
  69. 'live_avg_watch_duration',
  70. 'live_comment_count',
  71. 'live_follow_count',
  72. 'live_share_count',
  73. 'live_count',
  74. ];
  75. foreach ($advertiser_id as $va) {
  76. $data = $fish->getAnalysisLiveList(
  77. $tmp_data['fish_access_token'],
  78. [
  79. 'advertiser_id' => $va,
  80. 'start_date' => $start_date,
  81. 'end_date' => $end_date,
  82. 'page' => 1,
  83. 'fields' => $fields
  84. ]);
  85. // dump($data);die;
  86. if ($data['code'] == 0) {
  87. //如果广告组数据存在多页
  88. $page = $data['data']['page_info']['total_page'];
  89. $this->update_fish_live_data($data['data']['list'], $fish, $tmp_data, $root_id, $start_date, $va);
  90. if ($page > 1) {
  91. for ($i = 1; $i < $page; $i++) {
  92. $page_data = $fish->getAnalysisLiveList(
  93. $tmp_data['fish_access_token'],
  94. [
  95. 'advertiser_id' => $va,
  96. 'start_date' => $start_date,
  97. 'end_date' => $start_date,
  98. 'page' => $i + 1,
  99. 'fields' => $fields
  100. ]);
  101. if ($page_data['code'] == 0) {
  102. $this->update_fish_live_data($page_data['data']['list'], $fish, $tmp_data, $root_id, $start_date, $va);
  103. }
  104. }
  105. }
  106. }
  107. }
  108. }
  109. }
  110. }
  111. $output->writeln("同步完成");
  112. }
  113. /**
  114. * 更新直播数据
  115. */
  116. protected function update_fish_live_data($list, $fish, $tmp_data, $root_id, $data_time, $advertiser_id)
  117. {
  118. $data_time = date('Y-m-d',strtotime($data_time));
  119. Db::startTrans();
  120. try {
  121. foreach ($list as $val) {
  122. //先删除昨日数据后插入数据
  123. $info = FishLive::where(['root_id' => $root_id, 'data_time' => $data_time, 'advertiser_id' => $advertiser_id,'room_id'=>$val['room_id']])->find();
  124. $param = [
  125. 'root_id' => $root_id,
  126. 'room_id' => $val['room_id'],
  127. 'data_time' => $data_time,
  128. 'advertiser_id' => $advertiser_id,
  129. 'room_title' => $val['room_title']?$val['room_title']:'',
  130. 'live_watch_count' => $val['fields']['live_watch_count']?$val['fields']['live_watch_count']:0,
  131. 'live_watch_ucount' => $val['fields']['live_watch_ucount']?$val['fields']['live_watch_ucount']:0,
  132. 'live_card_icon_component_show_count' => $val['fields']['live_card_icon_component_show_count']?$val['fields']['live_card_icon_component_show_count']:0,
  133. 'click_product_ucount' => $val['fields']['click_product_ucount']?$val['fields']['click_product_ucount']:0,
  134. 'live_form_submit_count' => $val['fields']['live_form_submit_count']?$val['fields']['live_form_submit_count']:0,
  135. 'room_status' => $val['room_status'],
  136. 'type' => 1,
  137. 'room_create_time' => !empty($val['room_create_time'])?date('Y-m-d H:i:s',strtotime($val['room_create_time'])):'',
  138. 'room_finish_time' => !empty($val['room_finish_time'])?date('Y-m-d H:i:s',strtotime($val['room_finish_time'])):'',
  139. 'anchor_id' => $val['anchor_id']?$val['anchor_id']:'',
  140. 'anchor_nick' => $val['anchor_nick']?$val['anchor_nick']:'',
  141. 'data_create' => date('Y-m-d',strtotime($val['room_create_time'])),
  142. 'live_avg_watch_duration' => $val['fields']['live_avg_watch_duration']?$val['fields']['live_avg_watch_duration']:0,
  143. 'live_comment_count' => $val['fields']['live_comment_count']?$val['fields']['live_comment_count']:0,
  144. 'live_follow_count' => $val['fields']['live_follow_count']?$val['fields']['live_follow_count']:0,
  145. 'live_share_count' => $val['fields']['live_share_count']?$val['fields']['live_share_count']:0,
  146. 'live_count' => $val['fields']['live_count']?$val['fields']['live_count']:0,
  147. ];
  148. $where = [
  149. 'root_id' => $root_id,
  150. 'room_id' => $val['room_id'],
  151. 'data_time' => $data_time,
  152. 'advertiser_id' => $advertiser_id,
  153. ];
  154. if ($info){
  155. FishLive::where($where)->update($param);
  156. }else{
  157. FishLive::where($where)->insert($param);
  158. }
  159. }
  160. Db::commit();
  161. } catch (\Exception $e) {
  162. // file_put_contents(dirname(app()->getRuntimePath()) . DIRECTORY_SEPARATOR.'log'.'/update_fish_live_data.txt', date('Y-m-d H:i:s') ."\n"."更新直播数据:".$e->getMessage()."\r\n", FILE_APPEND);
  163. Db::rollback();
  164. }
  165. }
  166. /**
  167. * 刷新token
  168. */
  169. public function refreshToken($fish, $tmp_data, $root_id)
  170. {
  171. $fish_refresh_time = $tmp_data['fish_refresh_time']; //上次token更新时间
  172. if ($fish_refresh_time + 80000 < time()) {
  173. $token = $fish->getRefreshToken($tmp_data['fish_refresh_token']);
  174. if ($token['code'] == 0) {
  175. $tmp_data['fish_access_token'] = $token['data']['access_token'];
  176. $tmp_data['fish_refresh_token'] = $token['data']['refresh_token'];
  177. $tmp_data['fish_refresh_time'] = time();
  178. Company::where(['root_id' => $root_id])->update(['channel_setting_wh' => json_encode($tmp_data)]);
  179. } else {
  180. $tmp_data['fish_access_token'] = '';
  181. $tmp_data['fish_refresh_token'] = '';
  182. Company::where(['root_id' => $root_id])->update(['channel_setting_wh' => json_encode($tmp_data)]);
  183. }
  184. }
  185. return $tmp_data;
  186. }
  187. }