B站视频刷播放量

B站视频刷播放量

视频地址: https://www.bilibili.com/video/BV1WR4y1F7gH

第一步:找到哪个请求会涨播放。

怎么找?打开视频按下F12后,清除网络连接请求,再点击播放后,会发送很多请求,分析这些请求,哪些像是在涨播放。

看下面的这三个请求可能就是我们需要的请求:

请求一 now:

请求二 heartbeat:

请求三 h5:

然后通过代码模拟,模拟之后发现播放是涨的。

最后发现 h5的请求是会涨播放量的,链接: https://api.bilibili.com/x/click-interface/click/web/h5

扩展知识:

(1)h5,涨播放量。 ==> 这是我们要解决的。

(2)heartbeat,涨播放量 + 播放时长(每15s发送一次请求) ==> 这不是我们要解决的。

然后再做减法:去除掉依然是涨的,说明不是核心的,再去掉,再去掉,最后发现最终指定的N个,最后我们只需要搞那N个就可以了。

第二步:分析URL https://www.bilibili.com/video/BV1WR4y1F7gH

- 地址:https://api.bilibili.com/x/click-interface/click/web/h5

- URL参数:无

- 请求头:无

对于请求体:

- aid:

- cid:

上面这两个值aid和cid猜想:

(下面引出爬虫和逆向的一个重要思想:很多时候都是要靠不断的猜想和验证,不断的寻找;如果寻找到了,验证到是他了,那么就是他;如果验证失败,那就继续找,继续验证)

猜想一:之前请求返回COOKIE,这些请求携带。(之前请求模拟)

猜想二:响应体中返回

JSON

HTML

猜想三:其他请求响应头

猜想四:内部通过js代码生成

猜想五:直接百度搜索“bilibili aid cid”,别人已经做过了

关于搜索注意事项:

(1)搜索的时候,如果多个页面都有搜索到,那么可以分别测试一下,可以打个断点,看看走不走。

(2)使用放大镜🔍 ,而不是Filter。使用Filter只会从URL中查找关键字,而放大镜会从全局中搜索。

拿着aid 的值去在下面的搜索框搜索。

需要看的是h5 请求之前的,并且是那种返回回来的数据,而不是发送请求的时候携带的数据。所以需要一个一个的找。

比如下面的就不是,下面的是在请求URL中携带的。

下面的aid才是我们需要的,aid的值嵌套到页面返回了。

同时也通过上面发现了cid的值也可以获取到。

所以aid和cid的值可以通过下面的代码获取到:

import requests

import json

import re

res = requests.get("https://www.bilibili.com/video/BV1ne4y1H7Zk")

# ["",]

data_list = re.findall(r'__INITIAL_STATE__=(.+);\(function', res.text)

data_dict = json.loads(data_list[0])

aid = data_dict['aid']

cid = data_dict['videoData']['cid']

print(aid)

print(cid)

对于Cookie,在h5找到Cookies 一项如下:

怎么知道上面哪些参数是不是必须的:去除掉播放量依然是涨的,其他不带也能涨,那就不带,说明不是核心的,可以再去掉。

- buvid3

- CURRENT_FNVAL

- b_lsid

- _uuid

- sid

- buvid4

cookie的来源猜想:

之前请求返回COOKIE,这些请求携带。(之前请求模拟)

响应体中返回- JSON- HTML

响应头

js代码生成

buvid3

import requests

session = requests.Session()

session.headers.update({

"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36"

})

video_url = "https://www.bilibili.com/video/BV1ne4y1H7Zk/"

res = session.get(video_url)

print(res.cookies.get_dict())

# {'b_nut': '1664528708', 'buvid3': 'E4C54B76-FFC4-CF38-190E-0A9A184C02C908456infoc'}

注意:上面代码中的 video_url = "https://www.bilibili.com/video/BV1ne4y1H7Zk/",如果最后的地址不带 "/",即 video_url = "https://www.bilibili.com/video/BV1ne4y1H7Zk" 这样式的,结果可能会为空。

CURRENT_FNVAL

CURRENT_FNVAL 值经过反复尝试,发现是固定值 4048。

b_lsid和_uuid

在spi请求之前,未发现有返回 b_lsid和_uuid的位置,那么就可能是js算法生成。

b_lsid

var e = this.splitDate();

t = Object(f.b)(e.millisecond)

t = "".concat(Object(f.c)(8), "_").concat(t);

清除cookie,断点调试:

所以,e就是时间戳。

e = new Date(Date.now()).getTime()

import time

e = int(time.time()*1000)

所以,t的就是对时间戳转换16进制再变大写。

Math.ceil 方法用于对数值向上取整,即得到大于或等于该数值的最小整数

import time

e = int(time.time()*1000)

t = hex(e)[2:].upper()

print(t)

e = 8

, a = function(e) {

for (var t = "", n = 0; n < e; n++)

t += o(16 * Math.random()); // 生成 16*随机小数 -> 十六进制

// t

return s(t, e)

}

// 长度小于8,则在前面补0

, s = function(e, t) {

var n = "";

if (e.length < t)

for (var r = 0; r < t - e.length; r++)

n += "0";

return n + e

}

, o = function(e) {

return Math.ceil(e).toString(16).toUpperCase()

}

import math

import random

data = ""

for i in range(8):

v1 = math.ceil(16 * random.uniform(0, 1))

v2 = hex(v1)[2:].upper()

data += v2

result = data.rjust(8, "0")

print(result)

还原最后,再讲两个字符串拼接起来,就是 b_lsid了

import time

import math

import random

data = ""

for i in range(8):

v1 = math.ceil(16 * random.uniform(0, 1))

v2 = hex(v1)[2:].upper()

data += v2

result = data.rjust(8, "0")

e = int(time.time()*1000)

t = hex(e)[2:].upper()

b_lsid = "{}_{}".format(result,t)

print(b_lsid)

_uuid

再在当前页面继续搜索 _uuid

import time

import uuid

def gen_uuid():

uuid_sec = str(uuid.uuid4())

time_sec = str(int(time.time() * 1000 % 1e5))

time_sec = time_sec.rjust(5, "0")

return "{}{}infoc".format(uuid_sec, time_sec)

_uuid = gen_uuid()

print(_uuid)

buvid4

import math

import random

import time

import uuid

import requests

import re

import json

def gen_uuid():

uuid_sec = str(uuid.uuid4())

time_sec = str(int(time.time() * 1000 % 1e5))

time_sec = time_sec.rjust(5, "0")

return "{}{}infoc".format(uuid_sec, time_sec)

def gen_b_lsid():

data = ""

for i in range(8):

v1 = math.ceil(16 * random.uniform(0, 1))

v2 = hex(v1)[2:].upper()

data += v2

result = data.rjust(8, "0")

e = int(time.time() * 1000)

t = hex(e)[2:].upper()

b_lsid = "{}_{}".format(result, t)

return b_lsid

session = requests.Session()

session.headers.update({

"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36"

})

video_url = "https://www.bilibili.com/video/BV1Pi4y1D7uJ"

res = session.get(video_url)

_uuid = gen_uuid()

session.cookies.set('_uuid', _uuid)

b_lsid = gen_b_lsid()

session.cookies.set('b_lsid', b_lsid)

session.cookies.set("CURRENT_FNVAL", "4048")

res = session.get("https://api.bilibili.com/x/frontend/finger/spi")

buvid4 = res.json()['data']['b_4']

print(buvid4)

sid

import math

import random

import time

import uuid

import requests

import re

import json

def gen_uuid():

uuid_sec = str(uuid.uuid4())

time_sec = str(int(time.time() * 1000 % 1e5))

time_sec = time_sec.rjust(5, "0")

return "{}{}infoc".format(uuid_sec, time_sec)

def gen_b_lsid():

data = ""

for i in range(8):

v1 = math.ceil(16 * random.uniform(0, 1))

v2 = hex(v1)[2:].upper()

data += v2

result = data.rjust(8, "0")

e = int(time.time() * 1000)

t = hex(e)[2:].upper()

b_lsid = "{}_{}".format(result, t)

return b_lsid

video_url = "https://www.bilibili.com/video/BV1Pi4y1D7uJ"

bvid = video_url.rsplit("/")[-1]

session = requests.Session()

session.headers.update({

"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36"

})

res = session.get(video_url)

data_list = re.findall(r'__INITIAL_STATE__=(.+);\(function', res.text)

data_dict = json.loads(data_list[0])

aid = data_dict['aid']

cid = data_dict['videoData']['cid']

_uuid = gen_uuid()

session.cookies.set('_uuid', _uuid)

b_lsid = gen_b_lsid()

session.cookies.set('b_lsid', b_lsid)

session.cookies.set("CURRENT_FNVAL", "4048")

res = session.get("https://api.bilibili.com/x/frontend/finger/spi")

buvid4 = res.json()['data']['b_4']

session.cookies.set("CURRENT_BLACKGAP", "0")

session.cookies.set("blackside_state", "0")

res = session.get(

url='https://api.bilibili.com/x/player/v2',

params={

"cid": cid,

"aid": aid,

"bvid": bvid,

}

)

print(res.cookies.get_dict())

实现刷播放

隧道代理

推荐:享95折

注册连接:https://www.qg.net/?sale=viltf

代码示例

import time

import math

import random

import time

import uuid

import requests

import re

import json

def get_tunnel_proxies():

proxy_host = "tunnel2.qg.net:17955"

proxy_username = "xxxxxxx"

proxy_pwd = "xxxxxxxxxxx"

return {

"http": "http://{}:{}@{}".format(proxy_username, proxy_pwd, proxy_host),

"https": "http://{}:{}@{}".format(proxy_username, proxy_pwd, proxy_host),

}

def gen_uuid():

uuid_sec = str(uuid.uuid4())

time_sec = str(int(time.time() * 1000 % 1e5))

time_sec = time_sec.rjust(5, "0")

return "{}{}infoc".format(uuid_sec, time_sec)

def gen_b_lsid():

data = ""

for i in range(8):

v1 = math.ceil(16 * random.uniform(0, 1))

v2 = hex(v1)[2:].upper()

data += v2

result = data.rjust(8, "0")

e = int(time.time() * 1000)

t = hex(e)[2:].upper()

b_lsid = "{}_{}".format(result, t)

return b_lsid

def play(video_url, proxies):

bvid = video_url.rsplit("/")[-1]

session = requests.Session()

session.proxies = proxies

session.headers.update({

"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36"

})

res = session.get(video_url)

data_list = re.findall(r'__INITIAL_STATE__=(.+);\(function', res.text)

data_dict = json.loads(data_list[0])

aid = data_dict['aid']

cid = data_dict['videoData']['cid']

_uuid = gen_uuid()

session.cookies.set('_uuid', _uuid)

b_lsid = gen_b_lsid()

session.cookies.set('b_lsid', b_lsid)

session.cookies.set("CURRENT_FNVAL", "4048")

res = session.get("https://api.bilibili.com/x/frontend/finger/spi")

buvid4 = res.json()['data']['b_4']

session.cookies.set("buvid4", buvid4)

session.cookies.set("CURRENT_BLACKGAP", "0")

session.cookies.set("blackside_state", "0")

res = session.get(

url='https://api.bilibili.com/x/player/v2',

params={

"cid": cid,

"aid": aid,

"bvid": bvid,

}

)

ctime = int(time.time())

res = session.post(

url="https://api.bilibili.com/x/click-interface/click/web/h5",

data={

"aid": aid,

"cid": cid,

"bvid": bvid,

"part": "1",

"mid": "0",

"lv": "0",

"ftime": ctime - random.randint(100, 500), # 浏览器首次打开时间

"stime": ctime,

"jsonp": "jsonp",

"type": "3",

"sub_type": "0",

"from_spmid": "",

"auto_continued_play": "0",

"refer_url": "",

"bsource": "",

"spmid": ""

}

)

# print(res.text)

def get_video_id_info(video_url, proxies):

session = requests.Session()

bvid = video_url.rsplit('/')[-1]

res = session.get(

url="https://api.bilibili.com/x/player/pagelist?bvid={}&jsonp=jsonp".format(bvid),

proxies=proxies

)

cid = res.json()['data'][0]['cid']

res = session.get(

url="https://api.bilibili.com/x/web-interface/view?cid={}&bvid={}".format(cid, bvid),

proxies=proxies

)

res_json = res.json()

aid = res_json['data']['aid']

view_count = res_json['data']['stat']['view']

duration = res_json['data']['duration']

print("\n视频 {},平台播放量为:{}".format(bvid, view_count))

session.close()

return aid, bvid, cid, duration, int(view_count)

def run():

proxies = get_tunnel_proxies()

video_url = "https://www.bilibili.com/video/BV1N94y1R7K5"

aid, bvid, cid, duration, view_count = get_video_id_info(video_url, proxies)

while True:

try:

get_video_id_info(video_url, proxies)

play(video_url, proxies)

view_count += 1

print("理论刷的播放量:", view_count)

except Exception as e:

pass

if __name__ == '__main__':

run()

相关推荐

官宣!中国男篮新任主教练,是他
我和黑大佬的365天知乎

官宣!中国男篮新任主教练,是他

📅 01-21 👁️ 8527
抖音腿长特效在哪里?让你瞬间拥有完美大长腿
我和黑大佬的365天知乎

抖音腿长特效在哪里?让你瞬间拥有完美大长腿

📅 07-31 👁️ 3217
睫毛怎么变长(怎样才能让睫毛变长?6个自然方法帮你实现)