最近有需要,需要在网页前端显示网站流量,虽然可以自己做统计但不想浪费资源,所以就使用百度统计的接口,查了官方文档看得我有点懵逼,本来有点了解但是通过百度搜索相关文章,发现更让我无语,教程都是百度商业版本,简直就是。。。
本文章api接口是百度账号版本
一、获取数据API
开通数据,需要一定的条件,达不到条件的自己可以动手刷一下自己的网站。
获取到的数据分别为:API Key和Secret Key,后面的操作会用到这两个。
二、获取网站ID
网站ID是你获取数据对应的网站,下面的值所有站都是可以通用的,如果你想同时查询两个站,只需要运行两次查询,在获取网站流量数据的时候改这个值就可以了,获取如图下所示:
三、获取code值
http://openapi.baidu.com/oauth/2.0/authorize?response_type=code&client_id={CLIENT_ID}&redirect_uri=oob&scope=basic&display=popup
点击链接打开浏览器获取,链接里面的 {CLIENT_ID} 把它删除了,替换成步骤一获取到 API Key,例如我的:
http://openapi.baidu.com/oauth/2.0/authorize?response_type=code&client_id=pPxxxxxxxxxxxxxxHvXz&redirect_uri=oob&scope=basic&display=popup
需要进行登录,复制code值,当执行下面步骤四获取access token值时,只有一次机会,访问过code就会发生变化,所以先不要急着关闭,后面可能还需用到。
四、获取access token值(可以不进行获取,程序获取)
注意:一旦你点击了链接,code的有效期只有一次,需要重新更新code值,这里你可以不进行操作,只需要操作上面三个步骤,这里是用来展示效果的。
http://openapi.baidu.com/oauth/2.0/token?grant_type=authorization_code&code={CODE}&client_id={CLIENT_ID}&client_secret={CLIENT_SECRET}&redirect_uri=oob
链接里面的{CLIENT_ID}填写你的API Key,{CLIENT_SECRET}填写你的Secret Key,{CODE}填写你刚才拿到的CODE。
你可以自己手动替换测试,它会返回几个值,其中重点是 ACCESS_TOKEN 和 REFRESH_TOKEN。
五、运行程序条件以及其他
1.需要python3的requests模块,如果你没有安装请安装,在shell环境下,模块安装如下:
python -m pip install -i https://pypi.tuna.tsinghua.edu.cn/simple requests
2.文件需要读写权限,在运行过程会创建baidu_token文件,这个文件保存着我们访问接口的token,更新token也是该文件。
3.默认只查询 网站概况(趋势数据),其中有浏览量、访客数、IP数。
4.一般而言获取到的数据应该提取生成其他数据文件,这样方便前端获取,但是这样需要一直运行且性能是也是问题,除非使用的是python的web框架,但我个人还是使用php,这里就不考虑了。
5.没有做实时访客,有需要的可以自己查看文档,只需要替换一下get_pv_uv_ip函数里面的url地址,响应的参数自己设置就可以了,实在是不懂的或者其他进群问我吧,有时间就回答。
以下是代码,根据上面获取到的值修改
import requests
import time
import json
import os
CLIENT_ID = '你的,值放在单引号里面' # API Key
CLIENT_SECRET = '你的' # Secret Key
siteId = '你的' # 站点的id
home_time = time.strftime("%Y-%m-%d %H:%M:%S", time.gmtime())
stop_time = int(home_time.split(' ')[0].replace('-', '')) - 0 # 结束时间 减 0 是当天的时间,减 1 是昨天,减 2 是前天
start_time = stop_time - 2 # 开始时间 减2就是获取三天的数据
# 获取 code值 的地址,默认打印出来 不会进行访问
code_url = f'http://openapi.baidu.com/oauth/2.0/authorize?response_type=code&client_id={CLIENT_ID}&redirect_uri=oob&scope=basic&display=popup'
print('请点击链接获取:',code_url) # 请手动点击该链接,点击链接后进行登录,在登录成功的页面复制 code值,如果获取到了code_url则把它注释了
CODE = '215e190fa1ce17575f275a8db3e5cf98' # 注意:以下的操作,当操作有误,code值就会改变,要重新填写新的code,值在上面这个链接获取
if len(CODE) < 15:
print('CODE值有误,请重新填写')
time.sleep(10000)
global ACCESS_TOKEN, REFRESH_TOKEN # ACCESS_TOKEN的有效期为一个月, REFRESH_TOKEN是当ACCESS_TOKEN过期用来重新刷新使用的,有效期十年
# 读取文件
def read_token():
with open('baidu_token.txt', 'r') as f:
return f.read()
# 写入文件
def write_token(data):
with open('baidu_token.txt', 'w') as f:
f.write(data)
# 获取 ACCESS_TOKEN
def get_access_token(CODE, CLIENT_ID, CLIENT_SECRET):
try:
access_url = f'http://openapi.baidu.com/oauth/2.0/token?grant_type=authorization_code&code={CODE}&client_id={CLIENT_ID}&client_secret={CLIENT_SECRET}&redirect_uri=oob'
access_data = requests.get(access_url)
if access_data.status_code == 200:
print('获取 ACCESS_TOKEN 成功,请重新运行')
write_token(json.dumps(access_data.json()))
elif access_data.status_code == 400:
print('CODE值过期了,请重新获取填写', access_data.status_code)
except Exception as e:
print(e)
# 更新 ACCESS_TOKEN
def update_token(REFRESH_TOKEN, CLIENT_ID, CLIENT_SECRET):
update_url = f'http://openapi.baidu.com/oauth/2.0/token?grant_type=refresh_token&refresh_token={REFRESH_TOKEN}&client_id={CLIENT_ID}&client_secret={CLIENT_SECRET}'
update_data = requests.get(update_url)
if update_data.status_code == 200:
print('更新 ACCESS_TOKEN 成功,请重新运行')
write_token(json.dumps(update_data.json()))
else:
print('更新 ACCESS_TOKEN 失败')
# 获取网站概况(趋势数据): 浏览量、访客数、IP数
def get_pv_uv_ip(access_token, siteId, start_time, stop_time):
getapi_url = f'https://openapi.baidu.com/rest/2.0/tongji/report/getData?access_token={access_token}&site_id={siteId}&method=overview/getTimeTrendRpt&start_date={start_time}&end_date={stop_time}&metrics=pv_count,visitor_count,ip_count'
getapi_data = requests.get(getapi_url)
if getapi_data.status_code == 200:
print('获取数据成功!')
if getapi_data.json().get('error_msg'):
print('Access token 过期了')
update_token(REFRESH_TOKEN, CLIENT_ID, CLIENT_SECRET)
return getapi_data.json()
else:
print('报错:未知原因,我暂时没遇到')
return False
# 判断文件是否存在
if os.path.exists('baidu_token.txt'):
try:
token_data = json.loads(read_token())
ACCESS_TOKEN = token_data.get('access_token')
REFRESH_TOKEN = token_data.get('refresh_token')
except Exception as e:
print('报错:未知原因,我暂时没遇到')
print(e)
else:
get_access_token(CODE, CLIENT_ID, CLIENT_SECRET)
get_api = get_pv_uv_ip(ACCESS_TOKEN, siteId, start_time, stop_time)
if not get_api:
print("没有获取到数据")
else:
api_data = get_api.get('result')
timeSpan = api_data.get('timeSpan')[0].split(' - ')
items_time = api_data.get('items')[0]
items_data = api_data.get('items')[1]
for i in range(len(items_data)):
print('从{}到{}的数据如下'.format(timeSpan[0], timeSpan[1]))
print('日期:' + items_time[i][0])
print(' 浏览量PV:{} 访客数UV:{} IP 数:{}'.format(items_data[i][0], items_data[i][1], items_data[i][2]))