js逆向播放量增加,增加视频热度,uuid,sid,buvid3,aid,b_lsid, b_nut 还原实现过程

2023-11-02

本次记录尝试逆向某比里比里视频平台播放量:

主要思路:(不断debug,观察代码设计还原实现)

1.播放量增加必定是点击播放后的记录

2.清空监视器,点击播放开始debug,截取到的就代表包含了增加播放量的包

3.验证截取到的包,测试看哪一个是包含增加播放量的

4.还原模拟发送请求

浏览器逆向debug没有捷径只能不断练习找感觉。懂Java、js越多越好,虽然看的都是经过混淆的代码,但还是能看到实现的过程(本人也还在学习阶段)

测试了超级久太多内容了,这里我也就只能记录还原实现的过程吧

还原cookie内容:

buvid3与b_nut:

这里经过测试是经过某一个请求自动带上的内容,接着从cookie中读出即可

first_req = sessions.get("https://www.bilibili.com/video/BV1fq4y1T7X8/")
bnut_3 = first_req.cookies.get_dict()
b_nut = bnut_3["b_nut"]
buvid3 = bnut_3["buvid3"]

sid与cid:(是b_nut同链接中的返回中正则读出)

first_req_text = first_req.text
re_fin = re.compile ("__INITIAL_STATE__=(?P<dict>.*?);",re.S)
dict_fin = re_fin.search(first_req_text).group("dict")
dict_fins = json.loads(dict_fin)["videoData"]
aid = dict_fins["aid"]
cid = dict_fins["cid"]

CURRENT_FNVAL:

是一个固定值4048

b_lsid:

debug找到后试着读懂:原理就是时间戳,向上去整,转换成16进制,时间搓用o函数处理,然后随机生成0-1的数字,*16接着调用o处理再用“_”将生成的8位与时间搓拼接起来,转为大写

def b_lsid():
    t = ""
    for _ in range(8):
        t += hex(math.ceil(16 * random.uniform(0,1)))[2:].upper()
    result = t.rjust(8,"0")
    times = int(time.time()*1000)
    result2 = hex(times)[2:].upper()
    return result+"_"+result2

print(b_lsid())

#DC51010FA3_1843C354EFF

sid:

sid_dir = sessions.get(f"https://api.bilibili.com/x/player/v2?aid={aid}&cid={cid}")
sid = sid_dir.cookies.get_dict()["sid"]
print(sid)

_uuid:

 经过debug查看代码后,发现这个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 f"{uuid_sec}{time_sec}infoc"

buvid4:

从请求中发现返回值中有b_4与buvid4的值是一样的

buvid4 = sessions.get("https://api.bilibili.com/x/frontend/finger/spi").json()["data"]["b_4"]
print(buvid4)

buvid_fp:

一开始debug发现有点深奥,扣js代码执行后,发现有点不一样,再细看才发现原来是每个视频都固定一个值,值遇我扣js运行出来不一样可能是某参数影响值的变化,因为发现固定的所以没细看了解了

最后整合请求:

代码:

import json
import math
import time
import random
import re
import uuid

import requests
from requests import post

sessions = requests.Session()
sessions.headers.update({
    "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36",
                         })
#buvid3,b_nut
first_req = sessions.get("https://www.bilibili.com/video/BV1fq4y1T7X8/")
bnut_3 = first_req.cookies.get_dict()
b_nut = bnut_3["b_nut"]
buvid3 = bnut_3["buvid3"]

sessions.cookies.set("b_nut", b_nut)
sessions.cookies.set("buvid3", buvid3)
print(buvid3,b_nut)

time.sleep(0.5)

#aid,cid
first_req_text = first_req.text
re_fin = re.compile ("__INITIAL_STATE__=(?P<dict>.*?);",re.S)
dict_fin = re_fin.search(first_req_text).group("dict")
dict_fins = json.loads(dict_fin)["videoData"]
aid = dict_fins["aid"]
cid = dict_fins["cid"]
# print(dict_fin)
# sessions.cookies.set("aid", aid)
# sessions.cookies.set("cid", cid)
print(cid, aid)



#print(b_lsid())
#sid

time.sleep(0.5)

CURRENT_FNVAL = "4048"
sessions.cookies.set("CURRENT_FNVAL", CURRENT_FNVAL)

sid_dir = sessions.get(f"https://api.bilibili.com/x/player/v2?aid={aid}&cid={cid}")
sid = sid_dir.cookies.get_dict()["sid"]
print(sid)
sessions.cookies.set("sid", sid)

def bl_lsid():
    t = ""
    for _ in range(8):
        t += hex(math.ceil(16 * random.uniform(0,1)))[2:].upper()
    result = t.rjust(8,"0")
    times = int(time.time()*1000)
    result2 = hex(times)[2:].upper()
    return result+"_"+result2

b_lsid = bl_lsid()
print(b_lsid)
sessions.cookies.set("b_lsid", b_lsid)


#_uuid
def l_uuid():
    uuid_sec = str(uuid.uuid4())
    time_sec = str(int(time.time() * 1000 % 1e5))
    time_sec = time_sec.rjust(5, "0")
    return f"{uuid_sec}{time_sec}infoc"

_uuid = l_uuid()
print(_uuid)
sessions.cookies.set("uuid", _uuid)

time.sleep(0.5)

buvid4 = sessions.get("https://api.bilibili.com/x/frontend/finger/spi").json()["data"]["b_4"]
print(buvid4)
sessions.cookies.set("buvid4", buvid4)


CURRENT_QUALITY = "16"
sessions.cookies.set("CURRENT_QUALITY", CURRENT_QUALITY)

sessions.cookies.set("theme_style", "light")


url = "https://api.bilibili.com/x/click-interface/click/web/h5"
ctime = int(time.time())

data = {
    "aid": aid,
    "cid": cid,
    "part": "1",
    "lv": "0",
    "ftime": ctime - random.randint(100, 500),  # 浏览器首次打开时间
    "stime": ctime,
    "type": "3",
    "sub_type": "0",
    "from_spmid": "",
    "spmid": "333.788.0.0",
    "refer_url": "",
    "csrf": ""
}
sessions.headers.update({
    "content-type": "application/x-www-form-urlencoded",
    "referer": 'https://www.bilibili.com/video/BV1fq4y1T7X8/',
    "origin": 'https://www.bilibili.com',
    "content-length": "138",
    "sec-fetch-site": "same-site",
    "sec-fetch-mode": "cors",
    "sec-fetch-dest": "empty",
})
print(sessions.post(url=url,data=data).text)

模拟请求成功: 

与浏览器中一致: 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

js逆向播放量增加,增加视频热度,uuid,sid,buvid3,aid,b_lsid, b_nut 还原实现过程 的相关文章

  • Pygame读取MIDI输入

    我参考了Pygame MIDI 文档 https www pygame org docs ref midi html and 这段代码 https stackoverflow com questions 62983509 pygame mi
  • 使用 python 制作本地服务器应用程序的最佳方法

    我想要简单轻松地集成 python 和 vba 人们 如果他们在阅读本文后亲自见到我 阅读本文可能会杀了我 但我正在使用 django 开发服务器来实现此目的 有没有什么简单又好的方法 仅举个例子 我想使用 python 模块 openpy
  • 如何屏蔽 PyTorch 权重参数中的权重?

    我正在尝试在 PyTorch 中屏蔽 强制为零 特定权重值 我试图掩盖的权重是这样定义的def init class LSTM MASK nn Module def init self options inp dim super LSTM
  • 为什么我不能导入 geopandas?

    我唯一的代码行是 import geopandas 它给了我错误 OSError Could not find libspatialindex c library file 以前有人遇到过这个吗 我的脚本运行得很好 直到出现此错误 请注意
  • 替换字符串列表中的 \x00 的最佳方法?

    我有一个来自已解析 PE 文件的值列表 其中包括 x00每个部分末尾的空字节 我希望能够删除 x00字符串中的字节而不删除所有字节 x 文件中的 s 我试过做 replace and re sub 但并没有取得太大成功 使用Python 2
  • 如何自动替换多个文件的文本内容中的字符?

    我有一个文件夹 myfolder包含许多乳胶表 我需要替换其中每个字符 即替换任何minus sign by an en dash 只是为了确定 我们正在替换连字符INSIDE该文件夹中的所有 tex 文件 我不关心 tex 文件名 手动执
  • Python3 查找 2 个列表中有多少个差异才能相等

    假设我们有 2 个列表 always具有相同的长度和always包含字符串 list1 sot sot ts gg gg gg list2 gg gg gg gg gg sot 我们需要找到 其中有多少项list2应该改变 以便它等于lis
  • 将 subprocess.Popen 的输出通过管道传输到文件

    我需要启动一些长时间运行的进程subprocess Popen 并希望拥有stdout and stderr从每个自动管道到单独的日志文件 每个进程将同时运行几分钟 我想要两个日志文件 stdout and stderr 每个进程当进程运行
  • 唯一的图像哈希值即使 EXIF 信息更新也不会改变

    我正在寻找一种方法来为 python 和 php 中的图像创建唯一的哈希值 我考虑过对原始文件使用 md5 和 因为它们可以快速生成 但是当我更新 EXIF 信息 有时时区关闭 时 它会更改总和 并且哈希也会更改 有没有其他方法可以为这些文
  • Python 中的这种赋值方式叫什么? a = b = 真

    我知道关于元组拆包 http docs python org tutorial datastructures html tuples and sequences但是当一行中有多个等号时 这个赋值被称为什么 阿拉a b True 它总是让我有
  • 在wxpython中使用wx.TextCtrl并在按钮单击后显示数据的简单示例 - wx新手

    我正在学习 python 并尝试使用 wxpython 进行 UI 开发 也没有 UI exp 我已经能够创建一个带有面板 按钮和文本输入框的框架 我希望能够在文本框中输入文本 并让程序在单击按钮后对输入框中的文本执行操作 我可以获得一些关
  • FastText - 由于 C++ 扩展未能分配内存,无法加载 model.bin

    我正在尝试使用 FastText Python APIhttps pypi python org pypi fasttext https pypi python org pypi fasttext虽然 据我所知 此 API 无法加载较新的
  • 在 pip.conf 中指定多个可信主机

    这是我尝试在我的中设置的 etc pip conf global trusted host pypi org files pythonhosted org 但是 它无法正常工作 参考 https pip pypa io en stable
  • Python 矩阵每一行的总和

    lista 1 2 3 4 5 6 7 8 9 print lista def filas lista res for elemento in lista x sum lista elemento res append x print re
  • CSV 在列中查找最大值并附加新数据

    大约两个小时前 我问了一个关于从网站读取和写入数据的问题 从那时起 我花了最后两个小时试图找到一种方法来从输出的 A 列读取最大日期值 将该值与刷新的网站数据进行比较 并将任何新数据附加到 csv 文件而不覆盖旧的或创建重复项 目前 100
  • 从 dask 数据框中的日期时间序列获取年份和星期?

    如果我有一个 Pandas 数据框和一个日期时间类型的列 我可以按如下方式获取年份 df year df date dt year 对于 dask 数据框 这是行不通的 如果我先计算 像这样 df year df date compute
  • PyQt 中的线程和信号问题

    我在 PyQt 中的线程之间进行通信时遇到一些问题 我使用信号在两个线程 发送者和监听者 之间进行通信 发送者发送消息 期望被监听者接收 但是 没有收到任何消息 谁能建议可能出了什么问题 我确信这一定很简单 但我已经环顾了几个小时但没有发现
  • 使用“pythonw”(而不是“python”)运行应用程序时找不到模块

    我尝试了这个最小的例子 from flask import Flask app Flask name app route def hello world return Hello World if name main app run deb
  • 从时间序列生成日期特征

    我有一个数据框 其中包含如下列 Date temp data holiday day 01 01 2000 10000 0 1 02 01 2000 0 1 2 03 01 2000 2000 0 3 30 01 2000 200 0 30
  • 将此 MATLAB 代码转换为 Python 时我做错了什么?

    我正在努力将生成波形的 MATLAB 代码转换为 Python 就上下文而言 这是原子力显微镜带激发响应的模拟 与代码错误无关 在 MATLAB 中从 r vec 生成的图形与我在 Python 中生成的图形不同 我是否正确地将 MATLA

随机推荐

  • 简单Java前后端分离项目部署

    返回导航页 返回导航页 简单部署 直接运行jar包 1 需要配置安全组 2 服务器需要防火墙开启端口 涉及到的相关命令解释 firewall cmd zone public add port 8080 tcp permanent 开放808
  • Games101第三次作业(渲染管线分析、着色模型分析、双线性插值)

    文章目录 前言 一 作业要求 二 渲染管线分析 1 main函数 1 1main cpp的功能 2 draw函数 2 1draw函数的作用 2 2viewspace下的顶点的法向量 3 rasterize triangle函数 3 1ras
  • VirtualBox上安装Linux的基本配置

    这里主要记录下网络方面的配置 一般情况下都是如上的配置 只有界面名称那里 根据实际情况而定 如果你是有线网 那就要变一下 当系统安装好了 输入可以查询ip地址的命令 一般新安装的linux都不支持ifconfig命令查看 所以直接用 ip
  • java-快速查找文件,文件内容工具

    背景 工作日积月累 PC电脑文件越来越多 有时想找一个文件都不知道在哪 很烦恼 因此写了一个工具可以帮快速查找一些文件 减少查找文件的时间 应用场景 查找关键字文件名 文件目录 查找关键字文件内容 查找关键字特殊文档内容 xml doc p
  • web移动端-2-流动布局-案例学习

    总结 参考 黑马 移动web day3 总结京东M站 1 适配问题 移动端设备尺寸不一致 2 流式布局 随着浏览器尺寸的改变做自适应 掌握 3 当放到移动端预览 通过谷歌浏览器的模拟器 真机调试 服务器和手机设备在同一个局域网内容即可 4
  • 【Google】免翻!Google 最强插件下载中心!

    文章目录 一 极简插件 二 GugeAPPs 三 Extfans 四 插件安装方法 今天我送大家3款超强 Google 浏览器下载插件网站 可以完美解决 Google 浏览器应用中心在国内无法登陆的尴尬境遇 整理不易 点赞多多支持 一 极简
  • DataAnalysis-Maggie-Lecture1

    Lec1 5 31 目标 学习多种数据分析算法和技巧 数据分析应用 期中 project 期末 术语区别 数据科学是领域 统计分析是数学子学科 ML是让电脑自己通过数据和经验改进算法 AI是一种模仿人类的ML 数据挖掘 是处理数据然后发现模
  • Source Insight 4.0安装后首次打开报错

    老早就听说过代码阅读神器Source Insight一直没使用过 今天终于要用到了 兴冲冲的去官网下载安装了Source Insight4 0 安装一切顺利 好感动 Linux上经常各种缺依赖 我都怕了 可能是我比较菜 双击打开 报错 不对
  • Linux ps命令常见实战用法

    文章目录 一 基本介绍 1 1 基本介绍 1 2 常用参数 1 3 字段含义 二 常见用法 2 1 查看所有进程 2 2 查看特定进程信息 参考资料 Linux中的ps命令是Process Status的缩写 当程序运行在系统上时 我们称之
  • 毕业设计-基于机器视觉人脸识别技术课堂签到系统的设计与实现-OpenCV

    目录 前言 课题背景和意义 实现技术思路 一 软件设计 二 系统实现 实现效果图样例 最后 前言 大四是整个大学期间最忙碌的时光 一边要忙着备考或实习为毕业后面临的就业升学做准备 一边要为毕业设计耗费大量精力 近几年各个学校要求的毕设项目越
  • 【机器学习】机器学习算法的随机数据生成

    文章目录 一 前言 二 numpy随机数据生成API 2 1 rand d 0 d 0 d0
  • BeanUtils数据封装与表单JavaBean

    一 BeanUtils工具的解释 1 Apache的Commons组件中 提供了一个实用的工具类BeanUtils 利用它可以方便的将表单数据值填充值Bean中 2 javax servlet ServletRequest getParam
  • Java垃圾回收机制

    众所周知 Java是一个编译一次就可在不同系统上运行的语言 这主要得益于JVM虚拟机 JVM担任着Java内存自动管理的重任 JVM 的 动内存管理主要是进 对象内存的分配与回收 最核 的功能是 堆 内存中对象的分配 与回收 堆 是垃圾收集
  • Solr应用之电商商品搜索备忘

    把以前做电商商品搜索的经验归档一下 电商的搜索功能大体上比较相同 从京东 苏宁 易讯等大型电商都可以观察出来 电商搜索功能大致分为几块 1 商品搜索 列表的展示 带排序功能 可能有些产品会要求一个商品不同规格也聚合成一个展示 2 类别导航区
  • Android Studio SVN 使用

    如何安装配置SVN 请直接参考 SVN在Android Studio中的配置 http www cnblogs com songmeng p 4389446 html 如何使用SVN 本文主要参考了 AndroidStudio配置SVN以及
  • CDN加速下如何识别和限制访问来源

    前言 大多数提供CDN服务的云厂商 基本上都为客户提供了黑白名单 限制单个ip或网段 地域限制 限制某些地区的访问 鉴权 使只有符合规则的用户才可访问 或异常流量的监控和限制等功能 实现了基本的加速网站访问和安全的功能 但是有时候可能会因为
  • 立创EDA专业版修改图纸尺寸

    emmm 修改图纸尺寸 对于大多是软件还是很简单的 也没有什么奇怪的小虫 bug 但 接下来我说下遇到的一些情况和解决方法 遇到的情况 在我原先画的原理图中 我只需要在属性一栏修改下图纸尺寸即可 但最近的一次就不行了 情况变成了这样 emm
  • go 进阶 协程相关: 五. 协程底层从Main方法到调度器

    目录 三 通过runtime mstart SB 启动调度循环了解调度底层 再简单复习一下m p g的关系与调度过程简介 mstart1 初始化设置 schedule 调度函数 1 globrunqget 通过全局队列获取可运行G 通过全局
  • 在线生日快乐网站,可以在线访问,通过网址!

    在线生日快乐网站 可以在线访问 通过网址 详情可私信 详情可私信 点击查看详情
  • js逆向播放量增加,增加视频热度,uuid,sid,buvid3,aid,b_lsid, b_nut 还原实现过程

    本次记录尝试逆向某比里比里视频平台播放量 主要思路 不断debug 观察代码设计还原实现 1 播放量增加必定是点击播放后的记录 2 清空监视器 点击播放开始debug 截取到的就代表包含了增加播放量的包 3 验证截取到的包 测试看哪一个是包