利用百度统计显示网站实时在线人数

3 min read

虽然说百度统计给了一个 Tongji API 用户手册,但并未找到关于 实时在线人数 的接口请求字段,最后通过抓包在 实时访客 页面抓到了抓到了字段。

trend/latest/f

由于百度统计目前两种账号形式,两种账号形式 API接口 地址和 请求参数 均不相同,所以两种账号形式都写了一下。

其中最大的区别就是 百度商业账号 在需要填写 token 的基础上,还需要填写 usernamepassword。(关于百度统计的 token站点ID 如何获取,这里不在赘述,自行百度搜索即可出现大量图文教程。)

这里预设 多账户/多站点 的配置,根据自己的需求填写或新增 $userInfo 内的 array() 即可。

百度商业账号

<?php
header('Access-Control-Allow-Origin:*');
header('Content-type: application/json');

$url = 'https://api.baidu.com/json/tongji/v1/ReportService/getData';
$online = array();
$userInfo = array(
    array(
        'title' => '一号',
        'username' => 'username',
        'password' => 'password',
        'token' => 'token',
        'siteid' => 123456 ,
    ),
    // array(
    //     'title' => '二号',
    //     'username' => 'username',
    //     'password' => 'password',
    //     'token' => 'token',
    //     'siteid' => 123456 ,
    // )
);

foreach ($userInfo as $key => $value) {
    $data = array(
        'header' => array(
        'username' => $value['username'],
        'password' => $value['password'],
        'token' => $value['token'],
        ),
        'body' => array(
        'site_id' => $value['siteid'],
        'method' => 'trend/latest/f',
        )
    );

    $Json = json_decode(curl($url, $data), true);

    if($Json['header']['desc'] != 'success') {
        $reJson = array(
            'code' => 201,
            'msg' => 'error'
        );
        echo json_encode($reJson, JSON_NUMERIC_CHECK | JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
        die;
    }

    array_push($online, array('title' => $value['title'],'online' => $Json['body']['data'][0]['result']['onlineNumber']));

    $reJson = array(
        'code' => 200,
        'msg' => 'success',
        'data' => $online
    );
}

echo json_encode($reJson, JSON_NUMERIC_CHECK | JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);

function curl($url, $data)
{
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
    $output = curl_exec($ch);
    curl_close($ch);
    return $output;
}

百度账号

<?php
header('Access-Control-Allow-Origin:*');
header('Content-type: application/json');

$online = array();
$userInfo = array(
    array(
        'title' => '一号',
        'siteid' => 123456 ,
        'token' => 'token'
    ),
    // array(
    //     'title' => '二号',
    //     'siteid' => 123456 ,
    //     'token' => 'token'
    // )
);

foreach ($userInfo as $key => $value) {
    $url = 'https://openapi.baidu.com/rest/2.0/tongji/report/getData?access_token='. $value['token'] .'&site_id='. $value['siteid'] .'&metrics=&method=trend%2Flatest%2Ff';
    $Json = json_decode(curl($url), true);

    array_push($online, array('title' => $value['title'],'online' => $Json['result']['onlineNumber']));

    $reJson = array(
        'code' => 200,
        'msg' => 'success',
        'data' => $online
    );
}

echo json_encode($reJson, JSON_NUMERIC_CHECK | JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);

function curl($url)
{
    $ch=curl_init((string)$url);
    curl_setopt($ch,CURLOPT_HEADER,false);
    curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,false);
    curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
    curl_setopt($ch,CURLOPT_TIMEOUT,5000);
    $result = curl_exec($ch);
    return $result;
}

返回格式

{
  "code": 200,
  "msg": "success",
  "data": [
    {
      "title": "一号机",
      "online": 5
    }
  ]
}

实时显示

可以利用 JSsetTimeout() 函数来实现定时刷新页面实时在线人数。