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

主要思路:(不断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+"_"+result2print(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 uuidimport requests
from requests import postsessions = 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())
#sidtime.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+"_"+result2b_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)

模拟请求成功:

与浏览器中一致:

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

  1. JS逆向——一个新的视频爬虫

    仅限技术交流和学习记录,严禁用于任何商业用途,否则后果自负,侵删 个人觉得坑还挺多,但难度不算大的一篇js逆向. 来吧,先分析. 起初解析pc网页端,感觉有点难度,然后就转到移动网页端了,其实是一模一 ...

  2. JS逆向之x讯视频wasm的ckey分析

    篇幅有限 完整内容及源码关注公众号:ReverseCode,发送 冲 起因 最近对腾讯视频下手了,因为公众号中的视频来源都是腾讯视频,也就是说通过2分钟阅读本文,腾讯视频下整站视频都可以下载下来,也是 ...

  3. python爬虫JS逆向:X咕视频密码与指纹加密分析

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者:煌金的咸鱼 PS:如有需要Python学习资料的小伙伴可以加点击下方 ...

  4. gta python解指纹_python爬虫JS逆向:X咕视频密码与指纹加密分析

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者:煌金的咸鱼 正文 先来看看今天的受害者: aHR0cDovL3d3d ...

  5. pb dw graph增加series_如何快速增加tiktok视频的播放量

    TikTok作为时下最火的社交媒体平台,拥有将近10亿的用户量,并且需多顶级影响者已经从中获取到了大量收益,因此大家都想要在TikTok上获得更多的观看次数并获得更多的粉丝. 我们编制了本指南,指出了 ...

  6. php加入js动态效果,js怎么给输入框增加动画效果

    这次给大家带来js怎么给输入框增加动画效果,js给输入框增加动画效果的注意事项有哪些,下面就是实战案例,一起来看一下. (function() { function p() { window.requ ...

  7. js逆向破解 —— 懂车帝视频链接

    背景 话说下午有一朋友发我一链接懂车帝某视频,让我帮忙看一下这个网页中视频链接是怎么获取的.我断断续续地花了两三个小时,最后终于把它给拿下了.在整个分析的过程中,我觉得还算是有点意思,所以写下这便博客 ...

  8. 懂车帝视频连接--JS逆向

    这个项目,适合JS逆向学习初学者. 懂车帝:https://zjbyte.cn/i6615388842591518733/ 把谷歌开发者工具调处来-network-手机模式,把加载的东西清空,刷新一下 ...

  9. js在指定的td中插入html元素,js在指定位置增加节点函数insertBefore()用法实例

    本文实例讲述了js在指定位置增加节点函数insertBefore()用法.分享给大家供大家参考.具体分析如下: 函数原型如下: insertBefore(参数1,参数2):在指定位置添加节点 具体代码 ...

最新文章

  1. 网站如何进行渠道跟踪_开发网站不知道如何进行推广?5个技巧教会你
  2. (六)OpenStack---M版---双节点搭建---Neutron安装和配置
  3. OVS packet处理流程(三十二)
  4. Unix整理笔记——起步——里程碑M2
  5. ITK:处理矢量图像的N个分量
  6. nvml.dll 英伟达公司提供的动态库用途
  7. java项目中的classpath
  8. 设计模式 — 简单工厂模式
  9. 双流join(SparkStreaming)
  10. 免费的东东真给力:轻松实现代码变更与缺陷,任务和需求的紧密关联.
  11. d2rq java,知识图谱学习与实践(6)——从结构化数据进行知识抽取(D2RQ介绍)...
  12. ES6深入浅出-1 新版变量声明:let 和 const-2.视频 let和const
  13. java replace三个参数_javascript replace()第二个参数为函数时的参数用法
  14. CMMI3-CMMI5认证费用及认证周期
  15. 洛谷试炼场 普及常见模板
  16. Android Wifi移植
  17. Zabbix设置微信报警
  18. 怎么看服务器硬盘数据信息,如何查看服务器的硬盘数量
  19. 【vue大师晋级之路第二集:深入了解组件】第3章——自定义事件
  20. 关于“在efi系统上,windows只能安装到gpt分区”的问题的解决方法的讨论(典型的宏基4750g)

热门文章

  1. 部署zabbix监控
  2. 生物特征识别技术在宠物监控中的应用
  3. docker启动容器服务之后访问失败
  4. 高数 | 傅里叶级数、狄利克雷收敛定理、正弦级数与余弦级数
  5. mysql ld preload,LD_PRELOAD替换进程底层函数
  6. C语言如何改变字符串的值,C语言中字符串的赋值
  7. LInux Vim不能右键粘贴
  8. Linux系统Centos修改主机名
  9. Java分布式架构, Dubbo面试题汇总
  10. 2021年LED贴膜屏品牌排行榜 贴膜屏厂家综合评测