Baiduapi.php 44 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906
  1. <?php
  2. namespace app\admin\controller\baiduwebtongji;
  3. use app\common\controller\Backend;
  4. use addons\baiduwebtongji\library\TongjiApi;
  5. /**
  6. * 百度网站统计-Api接口
  7. */
  8. class Baiduapi extends Backend
  9. {
  10. protected $noNeedRight = ['getOutline','trendTimeA','getTimeTrendRpt','getCommonTrackRpt','trendLatestA','sourceAll','sourceSearchword','visitToppage','visitDistrict','visitWorld','visitDistrictTop','rankGetData','rankGetWords','rankSetWords'];
  11. public function _initialize()
  12. {
  13. parent::_initialize();
  14. set_time_limit(10);
  15. session_write_close();
  16. $this->config = get_addon_config('baiduwebtongji');
  17. $this->visit = new TongjiApi($this->config);
  18. }
  19. public function changeSiteId(){
  20. $siteid=input("siteid");
  21. if($siteid && $this->config['siteId']!=$siteid){
  22. set_addon_config("baiduwebtongji",['siteId'=>$siteid]);
  23. return ['code'=>1];
  24. }else{
  25. return ['code'=>0,'msg'=>'切换失败'];
  26. }
  27. }
  28. public function checkData($data)
  29. {
  30. if(ACCOUNT_TYPE==3){
  31. if($data){
  32. $res=$data['result'];
  33. return $res;
  34. }
  35. }else{
  36. if($data && $data['header']['status']==0 && $data['header']['rquota']>0){
  37. $res=$data['body']['data'][0]['result'];
  38. return $res;
  39. }
  40. }
  41. return false;
  42. }
  43. public function getOutline()
  44. {
  45. $data=$this->visit->getOutline();
  46. // if($data && $data['header']['status']==0 && $data['header']['rquota']>0){
  47. // $result=$data['body']['data'][0]['result'];
  48. $result=$this->checkData($data);
  49. if($result){
  50. $html='';
  51. $items=$result['items'];
  52. foreach ($items as $key => $value) {
  53. if($key==0){
  54. $html.='<tr class="highlight">';
  55. }else{
  56. if($key>2){
  57. $html.='<tr class="getoutline-fade toggleable-hidden">';
  58. }else{
  59. $html.='<tr>';
  60. }
  61. }
  62. if($key==2){
  63. $arrow_up1=$this->switchFlag($items[2][1]['flag']);
  64. $arrow_up2=$this->switchFlag($items[2][2]['flag']);
  65. $arrow_up3=$this->switchFlag($items[2][3]['flag']);
  66. }else{
  67. $arrow_up1=$arrow_up2=$arrow_up3='';
  68. }
  69. $html.='<td class="no-top-border normal">'.$value[0].'</td>';
  70. $html.='<td class="no-top-border '.$arrow_up1.'">'.(is_array($value[1])?$value[1]['val']:$value[1]).'</td>';
  71. $html.='<td class="no-top-border '.$arrow_up2.'">'.(is_array($value[2])?$value[2]['val']:$value[2]).'</td>';
  72. $html.='<td class="no-top-border '.$arrow_up3.'">'.(is_array($value[3])?$value[3]['val']:$value[3]).'</td>';
  73. $html.='<td class="no-top-border">'.(is_array($value[4])?($value[4]['val']=="--"?$value[4]['val']:$value[4]['val']."%"):($value[4]=="--"?$value[4]:$value[4]."%")).'</td>';
  74. $html.='<td class="no-top-border">'.(is_array($value[5])?$this->Sec2Time($value[5]['val']):$this->Sec2Time($value[5])).'</td>';
  75. $html.='<td class="no-top-border">'.(is_array($value[6])?$value[6]['val']:$value[6]).'</td>';
  76. $html.='</tr>';
  77. if($key==5){
  78. unset($value[0]);
  79. $html.='<tr class="getoutline-fade toggleable-hidden">';
  80. $html.='<td class="no-top-border normal"></td>';
  81. foreach ($value as $k => $v) {
  82. $html.='<td class="no-top-border">';
  83. if(is_array($v)){
  84. $html.=$v['date'];
  85. }else{
  86. $html.='--';
  87. }
  88. $html.='</td>';
  89. }
  90. $html.='</tr>';
  91. }
  92. if($key==2){
  93. $html.='<tr class="empty-tr1"></tr>';
  94. $html.='<tr class="getoutline-fade empty-tr2 toggleable-hidden"><td colspan="7"></td></tr>';
  95. }
  96. }
  97. $html.='<tr class="getoutline-fade empty-tr3 toggleable-hidden"><td colspan="7"></td></tr>';
  98. $res=[
  99. 'status'=>1,
  100. 'html'=>$html
  101. ];
  102. unset($result);
  103. return $res;
  104. }
  105. // }
  106. $res=[
  107. 'status'=>0,
  108. 'msg'=>'<tr><td colspan="10" style="text-align:center;">暂无数据</td></tr>'
  109. ];
  110. return $res;
  111. }
  112. /**
  113. * [trendTimeA 趋势分析]
  114. * @return [type] [description]
  115. */
  116. public function trendTimeA(){
  117. $data=$this->visit->trendTimeA();
  118. // if($data && $data['header']['status']==0 && $data['header']['rquota']>0){
  119. // $result=$data['body']['data'][0]['result'];
  120. $result=$this->checkData($data);
  121. if($result){
  122. $pv_count=$result['sum'][0][0];
  123. $visitor_count=$result['sum'][0][1];
  124. $data['pv_count']=$pv_count;
  125. $data['visitor_count']=$visitor_count;
  126. unset($result);
  127. $res=[
  128. 'status'=>1,
  129. 'data' =>$data
  130. ];
  131. return $res;
  132. }
  133. // }
  134. $res=[
  135. 'status'=>0
  136. ];
  137. return $res;
  138. }
  139. public function getTimeTrendRpt(){
  140. $memo=input("post.memo")?:'week';
  141. $dateRange=$this->getStartEndDate($memo);
  142. $start_date=$dateRange['start_date'];
  143. $end_date=$dateRange['end_date'];
  144. $data=$this->visit->getTimeTrendRpt($start_date,$end_date);
  145. // if($data && $data['header']['status']==0 && $data['header']['rquota']>0){
  146. // $result=$data['body']['data'][0]['result'];
  147. $result=$this->checkData($data);
  148. if($result){
  149. foreach ($result['items'][0] as $key => $value) {
  150. $data['date'][$key]=$value[0];
  151. }
  152. foreach ($result['items'][1] as $ke => $val) {
  153. $data['pv'][$ke]=$val[0]=='--'?0:$val[0];
  154. $data['uv'][$ke]=$val[1]=='--'?0:$val[1];
  155. }
  156. $data['timeSpan']=$result['timeSpan'][0];
  157. $res=[
  158. 'status'=>1,
  159. 'data'=>$data
  160. ];
  161. unset($result);
  162. return $res;
  163. }
  164. // }
  165. $res=[
  166. 'status'=>0
  167. ];
  168. return $res;
  169. }
  170. /**
  171. * [getCommonTrackRpt 搜索词、来源网站、入口界面、受访页面、新老访客]
  172. * @return [type] [description]
  173. */
  174. public function getCommonTrackRpt(){
  175. $memo=input("post.memo")?:'tody';
  176. $dateRange=$this->getStartEndDate($memo);
  177. $start_date=$dateRange['start_date'];
  178. $end_date=$dateRange['end_date'];
  179. $data=$this->visit->getCommonTrackRpt($start_date,$end_date);
  180. // if($data && $data['header']['status']==0 && $data['header']['rquota']>0){
  181. // $result=$data['body']['data'][0]['result'];
  182. $result=$this->checkData($data);
  183. if($result){
  184. $data['sourceSite']=$data['word']=$data['landingPage']=$data['visitPage']='';
  185. foreach ($result['sourceSite']['items'] as $key => $value) {
  186. $data['sourceSite'].='<tr><td class="no-borders al"><span class="ellipsis" title="'.$value[0].'">'.$value[0].'</span></td>';
  187. $data['sourceSite'].='<td class="no-borders text-right">'.$value[1].'</td>';
  188. $data['sourceSite'].='<td class="no-borders ratio"><div title="'.$value[2].'%" style="background-color:#DCEBFE; width:'.$value[2].'%;">'.$value[2].'%</div></td></tr>';
  189. }
  190. foreach ($result['word']['items'] as $key => $value) {
  191. $data['word'].='<tr><td class="no-borders al"><span class="ellipsis" title="'.$value[0].'">'.$value[0].'</span></td>';
  192. $data['word'].='<td class="no-borders text-right">'.$value[1].'</td>';
  193. $data['word'].='<td class="no-borders ratio"><div title="'.$value[2].'%" style="background-color:#DCEBFE; width:'.$value[2].'%;">'.$value[2].'%</div></td></tr>';
  194. }
  195. foreach ($result['landingPage']['items'] as $key => $value) {
  196. $data['landingPage'].='<tr><td class="no-borders al"><a href="'.$value[0].'" target="_blank" class="ellipsis" title="'.$value[0].'">'.$value[0].'</a></td>';
  197. $data['landingPage'].='<td class="no-borders text-right">'.$value[1].'</td>';
  198. $data['landingPage'].='<td class="no-borders ratio"><div title="'.$value[2].'%" style="background-color:#DCEBFE; width:'.$value[2].'%;">'.$value[2].'%</div></td></tr>';
  199. }
  200. foreach ($result['visitPage']['items'] as $key => $value) {
  201. $data['visitPage'].='<tr><td class="no-borders al"><a href="'.$value[0].'" target="_blank" class="ellipsis" title="'.$value[0].'">'.$value[0].'</a></td>';
  202. $data['visitPage'].='<td class="no-borders text-right">'.$value[1].'</td>';
  203. $data['visitPage'].='<td class="no-borders ratio"><div title="'.$value[2].'%" style="background-color:#DCEBFE; width:'.$value[2].'%;">'.$value[2].'%</div></td></tr>';
  204. }
  205. $data['visitType']=$result['visitType'];
  206. $data['visitType']['oldVisitor']['avg_visit_time']=$this->Sec2Time($data['visitType']['oldVisitor']['avg_visit_time']);
  207. $data['visitType']['newVisitor']['avg_visit_time']=$this->Sec2Time($data['visitType']['newVisitor']['avg_visit_time']);
  208. unset($result);
  209. $res=[
  210. 'status'=>1,
  211. 'data'=>$data
  212. ];
  213. return $res;
  214. }
  215. // }
  216. $res=[
  217. 'status'=>0
  218. ];
  219. return $res;
  220. }
  221. /*
  222. public function getDistrict(){
  223. $param=[
  224. 'metrics' => 'pv_count,visitor_count',
  225. 'max_results' => 10,
  226. 'start_date' => date("Ymd",strtotime("-6 day")),
  227. 'end_date' => date("Ymd"),
  228. ];
  229. $getDistrict=$this->visit->visitDistrict($param);
  230. if($getDistrict){
  231. foreach ($getDistrict['items'][0] as $key => $value) {
  232. $data['area'][$key]=$value[0]['name'];
  233. }
  234. foreach ($getDistrict['items'][1] as $ke => $val) {
  235. $data['pv'][$ke]=$val[0];
  236. $data['uv'][$ke]=$val[1];
  237. }
  238. $data['timeSpan']=$getDistrict['timeSpan'][0];
  239. unset($getDistrict);
  240. $res=[
  241. 'status'=>1,
  242. 'data'=>$data
  243. ];
  244. }else{
  245. $res=[
  246. 'status'=>0
  247. ];
  248. }
  249. return $res;
  250. }
  251. */
  252. /**
  253. * 实时访客
  254. */
  255. public function trendLatestA(){
  256. $page=input("page")?:1;
  257. $max_results=20;
  258. $data=$this->visit->trendLatestA($page,$max_results);
  259. // if($data && $data['header']['status']==0 && $data['header']['rquota']>0){
  260. // $result=$data['body']['data'][0]['result'];
  261. $result=$this->checkData($data);
  262. if($result){
  263. $html='';
  264. $list=$result['items'][1];
  265. $ischange=$result['fields'][4]=="keyword"?1:0;
  266. foreach ($list as $key => $value) {
  267. $detail=$result['items'][0][$key][0]['detail'];
  268. $html.='<tr>';
  269. $html.='<td><div class="td-content"><a href="javascript:;" class="show-detail" data-key="'.$key.'"><i class="fa fa-plus" aria-hidden="true"></i></a></div></td>';
  270. $html.='<td><div class="td-content">'.(20*($page-1)+$key+1).'</div></td>';
  271. $html.='<td><div class="td-content">'.$value[0].'</div></td>';
  272. $html.='<td><div class="td-content">';
  273. $html.='<span title="'.$value[1].'">'.$value[1].'</span>';
  274. $html.='</div></td>';
  275. $html.='<td><div class="td-content">';
  276. if(isset($value[2]['url'])){
  277. $html.='<a href="'.$value[2]['url'].'" target="_blank" title="'.$value[2]['url'].'">'.$value[2]['fromType'].'</a>';
  278. }else{
  279. $html.=$value[2]['fromType'];
  280. }
  281. $html.='</div></td>';
  282. $accessPage=$ischange?$value[5]:$value[3];
  283. $html.='<td><div class="td-content"><a href="'.$accessPage.'" target="_blank" title="'.$accessPage.'">'.$accessPage.'</a></div></td>';
  284. $html.='<td><div class="td-content">'.$value[4].'</div></td>';
  285. $visitip=$ischange?$value[6]:$value[5];
  286. $html.='<td><div class="td-content">'.$visitip.'</div></td>';
  287. $visitTime=$ischange?$value[7]:$value[6];
  288. $html.='<td><div class="td-content text-right">'.$this->Sec2Time($visitTime).'</div></td>';
  289. $visitPage=$ischange?$value[8]:$value[7];
  290. $html.='<td><div class="td-content text-right">'.$visitPage.'</div></td>';
  291. $html.='</tr>';
  292. $html.='<tr class="table_tr_'.$key.' sub-line sub-line-first sub-line-last">';
  293. $html.='<td colspan="10" class="detail sub-title no-indent">';
  294. $html.='<div class="td-content">';
  295. $html.='<span class="icon"></span>';
  296. $html.='<div class="visitor-detail clearfix">';
  297. $html.='<div class="client-info l">';
  298. $html.='<div class="device-info">';
  299. $html.='<div class="device-icon l"><div class="'.$detail['osType'].'"></div></div>';
  300. $html.='<div class="device-data l">';
  301. $html.='<ul class="attributes">';
  302. if($detail['os']){
  303. $html.='<li title="'.$detail['os'].'"><span class="detail-title">操作系统:</span>'.$detail['os'].'</li>';
  304. }
  305. if($detail['isp']){
  306. $html.='<li title="'.$detail['isp'].'"><span class="detail-title">网络服务商:</span>'.$detail['isp'].'</li>';
  307. }
  308. if($detail['resolution']){
  309. $html.='<li title="'.$detail['resolution'].'"><span class="detail-title">屏幕分辨率:</span>'.$detail['resolution'].'</li>';
  310. }
  311. if($detail['color']){
  312. $html.='<li title="'.$detail['color'].'"><span class="detail-title">屏幕颜色:</span>'.$detail['color'].'</li>';
  313. }
  314. $html.='</ul></div></div>';
  315. $html.='<div class="browser-info">';
  316. $html.='<div class="browser-icon l">';
  317. $html.='<div class="'.$detail['browserType'].'"></div>';
  318. $html.='</div>';
  319. $html.='<div class="browser-data l">';
  320. $html.='<ul class="attributes">';
  321. if($detail['browser']){
  322. $html.='<li title="'.$detail['browser'].'"><span class="detail-title">浏览器:</span>'.$detail['browser'].'</li>';
  323. }
  324. if($detail['cookie']){
  325. $html.='<li title="'.$detail['cookie'].'"><span class="detail-title">是否支持Cookie:</span>'.$detail['cookie'].'</li>';
  326. }
  327. if($detail['java']){
  328. $html.='<li title="'.$detail['java'].'"><span class="detail-title">是否支持JAVA:</span>'.$detail['java'].'</li>';
  329. }
  330. $html.='</ul></div></div></div>';
  331. $html.='<div class="user-info">';
  332. $html.='<div class="user-icon l"></div>';
  333. $html.='<div class="user-data">';
  334. $html.='<ul class="visitor-type">';
  335. $html.='<li><span class="detail-title">访问类型:</span>'.$detail['visitorType'].'</li>';
  336. $html.='<li><span class="detail-title">当天访问频次:</span>'.$detail['visitorFrequency'].'</li>';
  337. $html.='<li><span class="detail-title">上一次访问时间:</span>'.$detail['lastVisitTime'].'</li>';
  338. $html.='<li><span class="detail-title">本次来路:</span>'.$detail['fromType']['fromType'].'</li>';
  339. $html.='<li><span class="detail-title">入口页面:<a href="'.$detail['accessPage'].'" title="'.$detail['accessPage'].'" target="_blank">'.$detail['accessPage'].'</a></span></li>';
  340. $html.='<li><span class="detail-title">最后停留在:<a href="'.$detail['endPage'].'" title="'.$detail['endPage'].'" target="_blank">'.$detail['endPage'].'</a></span></li>';
  341. $html.='</ul></div></div>';
  342. $html.='<div class="path-info"><table><tbody><tr class="path-title">';
  343. $html.='<td style="width: 5em; padding-right: 18px;">访问路径:</td>';
  344. $html.='<td style="width: 5em; padding-left: 0px;">打开时间</td>';
  345. $html.='<td style="width: 5em; text-align: right;">停留时长</td>';
  346. $html.='<td>页面地址</td></tr>';
  347. foreach ($detail['paths'] as $k => $paths) {
  348. $html.='<tr><td style="width: 5em; padding-right: 0px;"></td>';
  349. $html.='<td style="width: 5em; padding: 0px;">'.$paths[0].'</td>';
  350. $html.='<td style="text-align: right;">'.$this->Sec2Time($paths[1]).'</td>';
  351. $html.='<td><a href="'.$paths[2].'" title="'.$paths[2].'" target="_blank">'.$paths[2].'</a></td></tr>';
  352. }
  353. $html.='</tbody></table></div></div></div></td></tr>';
  354. }
  355. $total=$result['total'];
  356. $page = \think\paginator\driver\Bootstrap::make(null, $max_results,$page, $total, false, ['path'=>request()->url()]);
  357. $res=[
  358. 'status'=>1,
  359. 'page'=>$this->ajax_page($page),
  360. 'html'=>$html
  361. ];
  362. return $res;
  363. }
  364. // }
  365. $res=[
  366. 'status'=>0,
  367. 'msg'=>'暂无数据'
  368. ];
  369. return $res;
  370. }
  371. public function sourceAll(){
  372. $page=input("post.page")?:1;
  373. $memo=input("post.memo")?:'tody';
  374. $dateRange=$this->getStartEndDate($memo);
  375. $start_date=$dateRange['start_date'];
  376. $end_date=$dateRange['end_date'];
  377. $max_results=20;
  378. $data=$this->visit->sourceAll($page,$max_results,$start_date,$end_date);
  379. // if($data && $data['header']['status']==0 && $data['header']['rquota']>0){
  380. // $result=$data['body']['data'][0]['result'];
  381. $result=$this->checkData($data);
  382. if($result){
  383. $html='';
  384. $list=$result['items'][1];
  385. foreach ($list as $key => $value) {
  386. $value[3]=$value[3]=='--'?0:$value[3];
  387. $html.='<tr>';
  388. $html.='<td><div class="td-content">'.(20*($page-1)+$key+1).'</div></td>';
  389. $html.='<td><div class="td-content">'.$result['items'][0][$key][0]['name'].'</div></td>';
  390. $html.='<td><div class="td-content text-right">'.$value[0].'</div></td>';
  391. $html.='<td><div class="td-content text-right">'.$value[1].'</div></td>';
  392. $html.='<td><div class="td-content text-right">'.$value[2].'</div></td>';
  393. $html.='<td><div class="td-content text-right">'.$value[3].'%</div></td>';
  394. $html.='<td><div class="td-content text-right">'.$this->Sec2Time($value[4]).'</div></td>';
  395. $html.='</tr>';
  396. }
  397. $result['sum'][0][3]=$result['sum'][0][3]=='--'?0:$result['sum'][0][3];
  398. $html.='<tr>';
  399. $html.='<td><div class="td-content"></div></td>';
  400. $html.='<td><div class="td-content">当前汇总</div></td>';
  401. $html.='<td><div class="td-content text-right">'.$result['pageSum'][0][0].'</div></td>';
  402. $html.='<td><div class="td-content text-right">'.$result['pageSum'][0][1].'</div></td>';
  403. $html.='<td><div class="td-content text-right">'.$result['pageSum'][0][2].'</div></td>';
  404. $html.='<td><div class="td-content text-right">'.$result['pageSum'][0][3].'%</div></td>';
  405. $html.='<td><div class="td-content text-right">'.$this->Sec2Time($result['pageSum'][0][4]).'</div></td>';
  406. $html.='</tr>';
  407. $total=$result['total'];
  408. if($total>$max_results){
  409. $page = \think\paginator\driver\Bootstrap::make(null, $max_results,$page, $total, false, ['path'=>request()->url()]);
  410. $page=$this->ajax_page_memo($page,$memo);
  411. }else{
  412. $page='';
  413. }
  414. $sum=$result['sum'][0];
  415. $sum[3]=$sum[3]=='--'?0:$sum[3];
  416. $sum[4]=$this->Sec2Time($sum[4]);
  417. $res=[
  418. 'status'=>1,
  419. 'page'=>$page,
  420. 'html'=>$html,
  421. 'sum'=>$sum
  422. ];
  423. return $res;
  424. }
  425. // }
  426. $res=[
  427. 'status'=>0,
  428. 'msg'=>'暂无数据'
  429. ];
  430. return $res;
  431. }
  432. public function sourceSearchword(){
  433. $page=input("post.page")?:1;
  434. $memo=input("post.memo")?:'tody';
  435. $dateRange=$this->getStartEndDate($memo);
  436. $start_date=$dateRange['start_date'];
  437. $end_date=$dateRange['end_date'];
  438. $max_results=20;
  439. $data=$this->visit->sourceSearchword($page,$max_results,$start_date,$end_date);
  440. // if($data && $data['header']['status']==0 && $data['header']['rquota']>0){
  441. // $sourceSearchword=$data['body']['data'][0]['result'];
  442. $sourceSearchword=$this->checkData($data);
  443. if($sourceSearchword){
  444. $html='';
  445. $list=$sourceSearchword['items'][1];
  446. foreach ($list as $key => $value) {
  447. $value[3]=$value[3]=='--'?0:$value[3];
  448. $html.='<tr>';
  449. $html.='<td><div class="td-content">'.(20*($page-1)+$key+1).'</div></td>';
  450. $html.='<td><div class="td-content">';
  451. if($sourceSearchword['items'][0][$key][0]['keywordId']!=0){
  452. $html.='<a href="https://www.baidu.com/s?wd='.$sourceSearchword['items'][0][$key][0]['gbkName'].'" target="_blank" title="'.$sourceSearchword['items'][0][$key][0]['name'].'">'.$sourceSearchword['items'][0][$key][0]['name'].'</a>';
  453. }else{
  454. $html.=$sourceSearchword['items'][0][$key][0]['name'];
  455. }
  456. $html.='</div></td>';
  457. $html.='<td><div class="td-content text-right">'.$value[0].'</div></td>';
  458. $html.='<td><div class="td-content text-right">'.$value[1].'</div></td>';
  459. $html.='<td><div class="td-content text-right">'.$value[2].'</div></td>';
  460. $html.='<td><div class="td-content text-right">'.$value[3].'%</div></td>';
  461. $html.='<td><div class="td-content text-right">'.$this->Sec2Time($value[4]).'</div></td>';
  462. $html.='</tr>';
  463. }
  464. $sourceSearchword['sum'][0][3]=$sourceSearchword['sum'][0][3]=='--'?0:$sourceSearchword['sum'][0][3];
  465. $html.='<tr>';
  466. $html.='<td><div class="td-content"></div></td>';
  467. $html.='<td><div class="td-content">当前汇总</div></td>';
  468. $html.='<td><div class="td-content text-right">'.$sourceSearchword['pageSum'][0][0].'</div></td>';
  469. $html.='<td><div class="td-content text-right">'.$sourceSearchword['pageSum'][0][1].'</div></td>';
  470. $html.='<td><div class="td-content text-right">'.$sourceSearchword['pageSum'][0][2].'</div></td>';
  471. $html.='<td><div class="td-content text-right">'.$sourceSearchword['pageSum'][0][3].'%</div></td>';
  472. $html.='<td><div class="td-content text-right">'.$this->Sec2Time($sourceSearchword['pageSum'][0][4]).'</div></td>';
  473. $html.='</tr>';
  474. $total=$sourceSearchword['total'];
  475. if($total>$max_results){
  476. $page = \think\paginator\driver\Bootstrap::make(null, $max_results,$page, $total, false, ['path'=>request()->url()]);
  477. $page=$this->ajax_page_memo($page,$memo);
  478. }else{
  479. $page='';
  480. }
  481. $sum=$sourceSearchword['sum'][0];
  482. $sum[3]=$sum[3]=='--'?0:$sum[3];
  483. $sum[4]=$this->Sec2Time($sum[4]);
  484. $res=[
  485. 'status'=>1,
  486. 'page'=>$page,
  487. 'html'=>$html,
  488. 'sum'=>$sum
  489. ];
  490. return $res;
  491. }
  492. // }
  493. $res=[
  494. 'status'=>0,
  495. 'msg'=>'暂无数据'
  496. ];
  497. return $res;
  498. }
  499. public function visitToppage(){
  500. $page=input("post.page")?:1;
  501. $memo=input("post.memo")?:'tody';
  502. $dateRange=$this->getStartEndDate($memo);
  503. $start_date=$dateRange['start_date'];
  504. $end_date=$dateRange['end_date'];
  505. $max_results=20;
  506. $data=$this->visit->visitToppage($page,$max_results,$start_date,$end_date);
  507. // if($data && $data['header']['status']==0 && $data['header']['rquota']>0){
  508. // $result=$data['body']['data'][0]['result'];
  509. $result=$this->checkData($data);
  510. if($result){
  511. $html='';
  512. $list=$result['items'][1];
  513. foreach ($list as $key => $value) {
  514. $value[3]=$value[3]=='--'?0:$value[3];
  515. $html.='<tr>';
  516. $html.='<td><div class="td-content">'.(20*($page-1)+$key+1).'</div></td>';
  517. $html.='<td><div class="td-content">';
  518. $html.='<a href="'.$result['items'][0][$key][0]['name'].'" target="_blank" title="'.$result['items'][0][$key][0]['name'].'">'.$result['items'][0][$key][0]['name'].'</a>';
  519. $html.='</div></td>';
  520. $html.='<td><div class="td-content text-right">'.$value[0].'</div></td>';
  521. $html.='<td><div class="td-content text-right">'.$value[1].'</div></td>';
  522. $html.='<td><div class="td-content text-right">'.$value[2].'</div></td>';
  523. $html.='<td><div class="td-content text-right">'.$value[3].'</div></td>';
  524. $html.='<td><div class="td-content text-right">'.$value[4].'</div></td>';
  525. $html.='<td><div class="td-content text-right">'.$value[5].'</div></td>';
  526. $html.='<td><div class="td-content text-right">'.$value[7].'%</div></td>';
  527. $html.='<td><div class="td-content text-right">'.$this->Sec2Time($value[6]).'</div></td>';
  528. $html.='</tr>';
  529. }
  530. $result['sum'][0][3]=$result['sum'][0][3]=='--'?0:$result['sum'][0][3];
  531. $html.='<tr>';
  532. $html.='<td><div class="td-content"></div></td>';
  533. $html.='<td><div class="td-content">当前汇总</div></td>';
  534. $html.='<td><div class="td-content text-right">'.$result['pageSum'][0][0].'</div></td>';
  535. $html.='<td><div class="td-content text-right">'.$result['pageSum'][0][1].'</div></td>';
  536. $html.='<td><div class="td-content text-right">'.$result['pageSum'][0][2].'</div></td>';
  537. $html.='<td><div class="td-content text-right">'.$result['pageSum'][0][3].'</div></td>';
  538. $html.='<td><div class="td-content text-right">'.$result['pageSum'][0][4].'</div></td>';
  539. $html.='<td><div class="td-content text-right">'.$result['pageSum'][0][5].'</div></td>';
  540. $html.='<td><div class="td-content text-right">'.$result['pageSum'][0][7].'%</div></td>';
  541. $html.='<td><div class="td-content text-right">'.$this->Sec2Time($result['pageSum'][0][6]).'</div></td>';
  542. $html.='</tr>';
  543. $total=$result['total'];
  544. if($total>$max_results){
  545. $page = \think\paginator\driver\Bootstrap::make(null, $max_results,$page, $total, false, ['path'=>request()->url()]);
  546. $page=$this->ajax_page_memo($page,$memo);
  547. }else{
  548. $page='';
  549. }
  550. $sum=$result['sum'][0];
  551. $sum[7]=$sum[7]=='--'?0:$sum[7];
  552. $sum[6]=$this->Sec2Time($sum[6]);
  553. $res=[
  554. 'status'=>1,
  555. 'page'=>$page,
  556. 'html'=>$html,
  557. 'sum'=>$sum
  558. ];
  559. return $res;
  560. }
  561. // }
  562. $res=[
  563. 'status'=>0,
  564. 'msg'=>'暂无数据'
  565. ];
  566. return $res;
  567. }
  568. public function visitDistrict(){
  569. $memo=input("post.memo")?:'tody';
  570. $dateRange=$this->getStartEndDate($memo);
  571. $start_date=$dateRange['start_date'];
  572. $end_date=$dateRange['end_date'];
  573. $param=[
  574. 'metrics' => 'pv_count,visitor_count,ip_count,bounce_ratio,avg_visit_time',
  575. 'start_date' => $start_date,
  576. 'end_date' => $end_date,
  577. ];
  578. $data=$this->visit->visitDistrict($param);
  579. // if($data && $data['header']['status']==0 && $data['header']['rquota']>0){
  580. // $result=$data['body']['data'][0]['result'];
  581. $result=$this->checkData($data);
  582. if($result && $result['total']!=0){
  583. foreach ($result['items'][1] as $key => $value) {
  584. $map[$key]['name']=$result['items'][0][$key][0]['name'];
  585. $map[$key]['value']=$value[0];
  586. }
  587. $html='';
  588. $list=$result['items'][1];
  589. foreach ($list as $key => $value) {
  590. $value[3]=$value[3]=='--'?0:$value[3];
  591. $html.='<tr data-area="'.$result['items'][0][$key][0]['area'].'">';
  592. $html.='<td><div class="td-content"><a href="javascript:;" class="show-district" data-key="'.$key.'"><i class="fa fa-plus" aria-hidden="true"></i></a></div></td>';
  593. $html.='<td><div class="td-content">'.($key+1).'</div></td>';
  594. $html.='<td><div class="td-content">';
  595. $html.=$result['items'][0][$key][0]['name'];
  596. $html.='</div></td>';
  597. $html.='<td><div class="td-content text-right">'.$value[0].'</div></td>';
  598. $html.='<td><div class="td-content text-right">'.$value[1].'</div></td>';
  599. $html.='<td><div class="td-content text-right">'.$value[2].'</div></td>';
  600. $html.='<td><div class="td-content text-right">'.$value[3].'%</div></td>';
  601. $html.='<td><div class="td-content text-right">'.$this->Sec2Time($value[4]).'</div></td>';
  602. $html.='</tr>';
  603. }
  604. $result['sum'][0][3]=$result['sum'][0][3]=='--'?0:$result['sum'][0][3];
  605. $html.='<tr>';
  606. $html.='<td><div class="td-content"></div></td>';
  607. $html.='<td><div class="td-content"></div></td>';
  608. $html.='<td><div class="td-content">当前汇总</div></td>';
  609. $html.='<td><div class="td-content text-right">'.$result['pageSum'][0][0].'</div></td>';
  610. $html.='<td><div class="td-content text-right">'.$result['pageSum'][0][1].'</div></td>';
  611. $html.='<td><div class="td-content text-right">'.$result['pageSum'][0][2].'</div></td>';
  612. $html.='<td><div class="td-content text-right">'.$result['pageSum'][0][3].'%</div></td>';
  613. $html.='<td><div class="td-content text-right">'.$this->Sec2Time($result['pageSum'][0][4]).'</div></td>';
  614. $html.='</tr>';
  615. $sum=$result['sum'][0];
  616. $sum[3]=$sum[3]=='--'?0:$sum[3];
  617. $sum[4]=$this->Sec2Time($sum[4]);
  618. $res=[
  619. 'status'=>1,
  620. 'html'=>$html,
  621. 'sum'=>$sum,
  622. 'map'=>$map
  623. ];
  624. return $res;
  625. }
  626. // }
  627. $res=[
  628. 'status'=>0,
  629. 'msg'=>'暂无数据'
  630. ];
  631. return $res;
  632. }
  633. public function visitWorld(){
  634. $memo=input("post.memo")?:'tody';
  635. $dateRange=$this->getStartEndDate($memo);
  636. $start_date=$dateRange['start_date'];
  637. $end_date=$dateRange['end_date'];
  638. $data=$this->visit->visitWorld($start_date,$end_date);
  639. // if($data && $data['header']['status']==0 && $data['header']['rquota']>0){
  640. // $visitWorld=$data['body']['data'][0]['result'];
  641. $visitWorld=$this->checkData($data);
  642. if($visitWorld && $visitWorld['total']!=0){
  643. foreach ($visitWorld['items'][1] as $key => $value) {
  644. $map[$key]['name']=$visitWorld['items'][0][$key][0]['name'];
  645. $map[$key]['value']=$value[0];
  646. }
  647. $html='';
  648. $list=$visitWorld['items'][1];
  649. foreach ($list as $key => $value) {
  650. $value[3]=$value[3]=='--'?0:$value[3];
  651. $html.='<tr>';
  652. $html.='<td><div class="td-content">'.($key+1).'</div></td>';
  653. $html.='<td><div class="td-content">';
  654. $html.=$visitWorld['items'][0][$key][0]['name'];
  655. $html.='</div></td>';
  656. $html.='<td><div class="td-content text-right">'.$value[0].'</div></td>';
  657. $html.='<td><div class="td-content text-right">'.$value[1].'</div></td>';
  658. $html.='<td><div class="td-content text-right">'.$value[2].'</div></td>';
  659. $html.='<td><div class="td-content text-right">'.$value[3].'%</div></td>';
  660. $html.='<td><div class="td-content text-right">'.$this->Sec2Time($value[4]).'</div></td>';
  661. $html.='</tr>';
  662. }
  663. $visitWorld['sum'][0][3]=$visitWorld['sum'][0][3]=='--'?0:$visitWorld['sum'][0][3];
  664. $html.='<tr>';
  665. $html.='<td><div class="td-content"></div></td>';
  666. $html.='<td><div class="td-content">当前汇总</div></td>';
  667. $html.='<td><div class="td-content text-right">'.$visitWorld['pageSum'][0][0].'</div></td>';
  668. $html.='<td><div class="td-content text-right">'.$visitWorld['pageSum'][0][1].'</div></td>';
  669. $html.='<td><div class="td-content text-right">'.$visitWorld['pageSum'][0][2].'</div></td>';
  670. $html.='<td><div class="td-content text-right">'.$visitWorld['pageSum'][0][3].'%</div></td>';
  671. $html.='<td><div class="td-content text-right">'.$this->Sec2Time($visitWorld['pageSum'][0][4]).'</div></td>';
  672. $html.='</tr>';
  673. $sum=$visitWorld['sum'][0];
  674. $sum[3]=$sum[3]=='--'?0:$sum[3];
  675. $sum[4]=$this->Sec2Time($sum[4]);
  676. $res=[
  677. 'status'=>1,
  678. 'html'=>$html,
  679. 'sum'=>$sum,
  680. 'map'=>$map
  681. ];
  682. return $res;
  683. }
  684. // }
  685. $res=[
  686. 'status'=>0,
  687. 'msg'=>'暂无数据'
  688. ];
  689. return $res;
  690. }
  691. public function visitDistrictTop(){
  692. $memo=input("post.memo")?:'tody';
  693. $area=input("post.area");
  694. $id=input("post.id");
  695. $dateRange=$this->getStartEndDate($memo);
  696. $start_date=$dateRange['start_date'];
  697. $end_date=$dateRange['end_date'];
  698. $data=$this->visit->visitDistrictTop($start_date,$end_date,$area);
  699. // if($data && $data['header']['status']==0 && $data['header']['rquota']>0){
  700. // $visitDistrictTop=$data['body']['data'][0]['result'];
  701. $visitDistrictTop=$this->checkData($data);
  702. if($visitDistrictTop){
  703. $html='';
  704. $list=$visitDistrictTop['items'][1];
  705. $html.='<tr class="sub-line table-tr_'.$id.' sub-line-first">';
  706. $html.='<td class="detail"><div class="td-content"></div></td>';
  707. $html.='<td class="detail"><div class="td-content"></div></td>';
  708. $html.='<td class="sub-title detail" colspan="6">';
  709. $html.='<div class="td-content"><span class="icon"></span><strong>按地级市</strong></div>';
  710. $html.='</td>';
  711. $html.='</tr>';
  712. foreach ($list as $key => $value) {
  713. $value[3]=$value[3]=='--'?0:$value[3];
  714. $html.='<tr class="sub-line table-tr_'.$id.' sub-line-last">';
  715. $html.='<td class="detail"><div class="td-content"></div></td>';
  716. $html.='<td class="detail"><div class="td-content"></div></td>';
  717. $html.='<td class="detail"><div class="td-content">';
  718. $html.=$visitDistrictTop['items'][0][$key][0]['name'];
  719. $html.='</div></td>';
  720. $html.='<td class="detail"><div class="td-content text-right">'.$value[0].'</div></td>';
  721. $html.='<td class="detail"><div class="td-content text-right">'.$value[1].'</div></td>';
  722. $html.='<td class="detail"><div class="td-content text-right">'.$value[2].'</div></td>';
  723. $html.='<td class="detail"><div class="td-content text-right">'.$value[3].'%</div></td>';
  724. $html.='<td class="detail"><div class="td-content text-right">'.$this->Sec2Time($value[4]).'</div></td>';
  725. $html.='</tr>';
  726. }
  727. $res=[
  728. 'status'=>1,
  729. 'html'=>$html
  730. ];
  731. return $res;
  732. }
  733. // }
  734. $res=[
  735. 'status'=>0
  736. ];
  737. return $res;
  738. }
  739. public function rankGetData(){
  740. $memo=input("post.memo")?:'week';
  741. $dateRange=$this->getStartEndDate($memo);
  742. $start_date=$dateRange['start_date'];
  743. $end_date=$dateRange['end_date'];
  744. $data=$this->visit->rankGetData($start_date,$end_date);
  745. // if($data && $data['header']['status']==0 && $data['header']['rquota']>0){
  746. // $rankGetData=$data['body']['data'][0]['result'];
  747. $rankGetData=$this->checkData($data);
  748. if($rankGetData){
  749. foreach ($rankGetData['flash'] as $key => $value) {
  750. foreach ($value['items'][0] as $ke_date => $val_date) {
  751. $data[$key]['date'][$ke_date]=$val_date[0];
  752. }
  753. foreach ($value['items'][1] as $ke_rank => $val_rank) {
  754. $data[$key]['rank'][$ke_rank]=$val_rank[0]=='--'?0:$val_rank[0];
  755. }
  756. }
  757. foreach ($rankGetData['table']['items'][1] as $ke => $val) {
  758. $val[5]=$this->Sec2Time($val[5]);
  759. $data[$ke]['param']=$val;
  760. }
  761. $res=[
  762. 'status'=>1,
  763. 'data'=>$data
  764. ];
  765. return $res;
  766. }
  767. // }
  768. $res=[
  769. 'status'=>0
  770. ];
  771. return $res;
  772. }
  773. public function rankGetWords(){
  774. $data=$this->visit->rankGetWords();
  775. // if($data && $data['header']['status']==0 && $data['header']['rquota']>0){
  776. // $rankGetWords=$data['body']['data'][0]['result'];
  777. $rankGetData=$this->checkData($data);
  778. if($rankGetWords){
  779. $tongji_keywords=implode(",",$rankGetWords);
  780. set_addon_config("baiduwebtongji",['keywords'=>$tongji_keywords]);
  781. $res=['status'=>1,'msg'=>'同步成功'];
  782. return $res;
  783. }
  784. // }
  785. $res=['status'=>0,'msg'=>'同步失败'];
  786. return $res;
  787. }
  788. public function rankSetWords(){
  789. $keywords=input('post.keywords');
  790. $data=$this->visit->rankSetWords($keywords);
  791. if($data && $data['header']['status']==0 && $data['header']['rquota']>0){
  792. set_addon_config("baiduwebtongji",['keywords'=>$keywords]);
  793. $res=['status'=>1,'msg'=>"设置成功"];
  794. }else{
  795. $res=[
  796. 'status'=>0,
  797. 'msg'=>$data['header']['failures'][0]['message']
  798. ];
  799. }
  800. return $res;
  801. }
  802. private function getStartEndDate($memo){
  803. switch ($memo) {
  804. case 'tody':
  805. $start_date=date("Ymd");
  806. $end_date=date("Ymd");
  807. break;
  808. case 'yest':
  809. $start_date=date("Ymd",strtotime("-1 day"));
  810. $end_date=date("Ymd",strtotime("-1 day"));
  811. break;
  812. case 'week':
  813. $start_date=date("Ymd",strtotime("-6 day"));
  814. $end_date=date("Ymd");
  815. break;
  816. case 'month':
  817. $start_date=date("Ymd",strtotime("-29 day"));
  818. $end_date=date("Ymd");
  819. break;
  820. default:
  821. $start_date=date("Ymd");
  822. $end_date=date("Ymd");
  823. break;
  824. }
  825. $result=[
  826. 'start_date'=>$start_date,
  827. 'end_date'=>$end_date,
  828. ];
  829. return $result;
  830. }
  831. private function switchFlag($flag){
  832. switch ($flag) {
  833. case '1':
  834. $class="arrow-up";
  835. break;
  836. case '0':
  837. $class="";
  838. break;
  839. case '-1':
  840. $class="arrow-down";
  841. break;
  842. }
  843. return $class;
  844. }
  845. /**
  846. * 秒格式转换为年、天、时、分、秒
  847. * @param int $time 秒数
  848. * @return string XX年XX天XX:XX:XX
  849. */
  850. private function Sec2Time($time)
  851. {
  852. if(is_numeric($time)){
  853. $value = array(
  854. "years" => 0, "days" => 0, "hours" => 0,
  855. "minutes" => 0, "seconds" => 0,
  856. );
  857. $t="";
  858. if($time >= '31556926'){
  859. $value["years"] = floor($time/'31556926');
  860. $time = ($time%'31556926');
  861. $t=$value["years"] ."年";
  862. }
  863. if($time >= '86400'){
  864. $value["days"] = floor($time/'86400');
  865. $time = ($time%'86400');
  866. $t.=$value["days"] ."天";
  867. }
  868. if($time >= '3600'){
  869. $value["hours"] = sprintf("%02d",floor($time/3600));
  870. $time = ($time%'3600');
  871. $t.=$value["hours"] .":";
  872. }else{
  873. $t.="00:";
  874. }
  875. if($time >= '60'){
  876. $value["minutes"] = sprintf("%02d",floor($time/60));
  877. $time = ($time%'60');
  878. $t.=$value["minutes"] .":";
  879. }else{
  880. $t.="00:";
  881. }
  882. $value["seconds"] = sprintf("%02d",floor($time));
  883. $t.=$value["seconds"];
  884. return $t;
  885. }else{
  886. return $time;
  887. }
  888. }
  889. private function ajax_page($page){
  890. return preg_replace("(<a[^>]*page[=|/](\d+).+?>(.+?)<\/a>)","<a href='javascript:;' class='ajax-page' data-page='$1'>$2</a>",$page);
  891. }
  892. private function ajax_page_memo($page,$memo){
  893. return preg_replace("(<a[^>]*page[=|/](\d+).+?>(.+?)<\/a>)","<a href='javascript:;' class='ajax-page' data-page='$1' data-memo='".$memo."'>$2</a>",$page);
  894. }
  895. }