1,播放量抓包分析
1.1,播放包的捕获
1.1.1,发现少了对应的几个包
其中now的cookei的值包含这些
而h5的有,多了一个响应值,而bobo的包,只是一个响应播放的图片,就不用管。
2,分析now的cookei
2.2,多次抓包发现变换的值有这些
2.3,开始逐个分析
buvid4的获取,发现在spi请求里面有,用python获取
2.4,获取buvid3,以及b_nut
2.4.1,发现是用buvid4作为cookie发送之后拿到的响应cookei
2.5,拿取b_lsid
2.5.1,全局搜索一眼就看出来赋值位置
2.5.2,找加密就行了,额挺尬尴的就在上面
2.5.3,就不一一找位置,太简单了,简单的扣就行了,直接python改写
2.6,获取_uuid
2.6.1,全局搜索,找到生成位置,控制台输出是obj生成的,是一个自调用方法,一样的进去找生成方法就行了,很简单,直接python改写,记得存入seesion
2.7,拿取sid,在v2找到有响应头,但是他携带表单有变化值,所以,要先拿到aid。cid,的值
2.7.1,主页直接拿源码正则提取出来
2.7.2,直接发送请求获取sid
3,发送now请求,发现播放量没有涨
4,发现h5携带时间问题,对h5发起模拟请求
后续可以上线程池,和代理,实现上百万播放,自此完结撒花*★,°*:.☆( ̄▽ ̄)/$:*.°★* 。
import requests
import re
import time
import execjs
seesion = requests.Session()
py_url = 'https://www.bilibili.com/video/BV168411B7dp/?spm_id_from=444.41.list.card_archive.click'
xxxxx = py_url.split('/')[-2]
header = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36 Edg/107.0.1418.35'
}
def buvid4():
url = 'https://api.bilibili.com/x/frontend/finger/spi'
header = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36 Edg/107.0.1418.35'
}
resp = seesion.get(url).text
buvid4 = re.search('"b_4":"(?P<buvid4>.+?)"}', resp).group('buvid4')
return buvid4
buvid4 = buvid4()
seesion.cookies.set('buvid4',buvid4)
def buvid3():
resp = seesion.get(py_url,headers=header)
buvid3_cookie = resp.cookies
return buvid3_cookie
resp = buvid3()
buvid3 = resp['buvid3']
b_nut = resp['b_nut']
seesion.cookies.set('buvid3',buvid3)
seesion.cookies.set('b_nut',b_nut)
def b_lisd():
xx = str(int(time.time() * 1000))
with open("b_lisd.js") as f:
js_code = f.read()
jscode = execjs.compile(js_code)
b_lisd = jscode.call("get", xx)
return b_lisd
b_lisd =b_lisd()
seesion.cookies.set('b_lisd',b_lisd)
def _uuid():
with open("uuid.js") as f:
js_cod = f.read()
jscod = execjs.compile(js_cod)
uuid = jscod.call("n")
return uuid
uuid = _uuid()
seesion.cookies.set('_uuid',uuid)
def ids():
url_cid_aid = 'https://www.bilibili.com/video/%s/'%(xxxxx)
resp = requests.get(url=url_cid_aid, headers=header).text
ret = re.search('"stat":\{"aid":(?P<aid>\d+),"view":(?P<view>\d+),"danmaku',resp)
aid = ret.group("aid")
bfl = ret.group("view")
cidco = re.search('"dynamic":"","cid":(?P<cid>\d+),"dimension"',resp) #bvid":"BV1x84y1W7vC"
cid = cidco.group('cid')
bvid = re.search('"videoData":\{"bvid":"(?P<bvid>.*?)","aid"',resp)
bvid = bvid.group('bvid')
seesion.cookies.set('cid', cid)
seesion.cookies.set('aid', aid)
seesion.cookies.set('bvid', bvid)
seesion.cookies.set('bfl', bfl)
return cid, aid, bvid, bfl
res = ids()
def sid():
cid, aid, bvid, bfl = ids()
url = "https://api.bilibili.com/x/player/wbi/v2"
sj = str(int(time.time()))
headers = {
"authority": "api.bilibili.com",
"accept": "application/json, text/plain, */*",
"accept-language": "zh-CN,zh;q=0.9",
"cache-control": "no-cache",
"origin": "https://www.bilibili.com",
"pragma": "no-cache",
"referer": "https://www.bilibili.com/video/BV1x84y1W7vC/?spm_id_from=333.337.search-card.all.click&vd_source=80ee6b726db01708ed69d633b9c295a7",
"sec-ch-ua": "\"Chromium\";v=\"116\", \"Not)A;Brand\";v=\"24\", \"Google Chrome\";v=\"116\"",
"sec-ch-ua-mobile": "?0",
"sec-ch-ua-platform": "\"Windows\"",
"sec-fetch-dest": "empty",
"sec-fetch-mode": "cors",
"sec-fetch-site": "same-site",
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36"
}
params = {
"aid": aid,
"cid": cid,
"web_location": "1315873",
"w_rid": 'dab758539068282025b1e9401a06fb02',
"wts": sj
}
sid = seesion.get(url, headers=headers,params=params)
re = sid.cookies
return re
re = sid()
sid = re['sid']
seesion.cookies.set('sid', sid)
#剩下固定不变的cookie的整合
sj = str(int(time.time()))
seesion.cookies.set('CURRENT_FNVAL',"4048")
seesion.cookies.set('bili_ticket','eyJhbGciOiJIUzI1NiIsImtpZCI6InMwMyIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2OTQzMTUyMDgsImlhdCI6MTY5NDA1NjAwOCwicGx0IjotMX0.f_DfrhMsLhBGfM9aKWYzBO7jVbgVWgFG5fJrGu8BDlA')
seesion.cookies.set('buvid_fp','a6312429b8aaf9721fbd12dc4dd94e4b')
seesion.cookies.set('bili_ticket_expires',sj)
import random
aid =res[1]
cid =res[0]
qb = res[3]
print('初始播放量', qb)
h5_url = 'https://api.bilibili.com/x/click-interface/click/web/h5'
ctime = int(time.time())
data = {
"aid": aid,
"cid": cid,
"part": "1",
"mid": "0",
"lv": "0",
"ftime":str(ctime - random.randint(100,500)),
"stime": str(ctime),
"jsonp": "jsonp",
"type": "3",
"sub_type": "0",
"from_spmid": "333.999.0.0",
"auto_continued_play": "0",
"refer_url":"" ,
"bsource":"" ,
"spmid": "333.788.0.0",
}
ret = seesion.post(h5_url,headers=header,data=data).json()
print(ret)
qb = res[3]
print('h5请求后的播放',qb)