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


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

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

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

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

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

    4.还原模拟发送请求

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

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

    还原cookie内容:

    buvid3与b_nut:

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

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

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

    1. first_req_text = first_req.text
    2. re_fin = re.compile ("__INITIAL_STATE__=(?P.*?);",re.S)
    3. dict_fin = re_fin.search(first_req_text).group("dict")
    4. dict_fins = json.loads(dict_fin)["videoData"]
    5. aid = dict_fins["aid"]
    6. cid = dict_fins["cid"]

    CURRENT_FNVAL:

    是一个固定值4048

    b_lsid:

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

    1. def b_lsid():
    2. t = ""
    3. for _ in range(8):
    4. t += hex(math.ceil(16 * random.uniform(0,1)))[2:].upper()
    5. result = t.rjust(8,"0")
    6. times = int(time.time()*1000)
    7. result2 = hex(times)[2:].upper()
    8. return result+"_"+result2
    9. print(b_lsid())
    10. #DC51010FA3_1843C354EFF

    sid:

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

    _uuid:

     经过debug查看代码后,发现这个uuid没有魔改也只是随机的性质生成再拼接内容

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

    buvid4:

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

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

    buvid_fp:

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

    最后整合请求:

    代码:

    1. import json
    2. import math
    3. import time
    4. import random
    5. import re
    6. import uuid
    7. import requests
    8. from requests import post
    9. sessions = requests.Session()
    10. sessions.headers.update({
    11. "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",
    12. })
    13. #buvid3,b_nut
    14. first_req = sessions.get("https://www.bilibili.com/video/BV1fq4y1T7X8/")
    15. bnut_3 = first_req.cookies.get_dict()
    16. b_nut = bnut_3["b_nut"]
    17. buvid3 = bnut_3["buvid3"]
    18. sessions.cookies.set("b_nut", b_nut)
    19. sessions.cookies.set("buvid3", buvid3)
    20. print(buvid3,b_nut)
    21. time.sleep(0.5)
    22. #aid,cid
    23. first_req_text = first_req.text
    24. re_fin = re.compile ("__INITIAL_STATE__=(?P.*?);",re.S)
    25. dict_fin = re_fin.search(first_req_text).group("dict")
    26. dict_fins = json.loads(dict_fin)["videoData"]
    27. aid = dict_fins["aid"]
    28. cid = dict_fins["cid"]
    29. # print(dict_fin)
    30. # sessions.cookies.set("aid", aid)
    31. # sessions.cookies.set("cid", cid)
    32. print(cid, aid)
    33. #print(b_lsid())
    34. #sid
    35. time.sleep(0.5)
    36. CURRENT_FNVAL = "4048"
    37. sessions.cookies.set("CURRENT_FNVAL", CURRENT_FNVAL)
    38. sid_dir = sessions.get(f"https://api.bilibili.com/x/player/v2?aid={aid}&cid={cid}")
    39. sid = sid_dir.cookies.get_dict()["sid"]
    40. print(sid)
    41. sessions.cookies.set("sid", sid)
    42. def bl_lsid():
    43. t = ""
    44. for _ in range(8):
    45. t += hex(math.ceil(16 * random.uniform(0,1)))[2:].upper()
    46. result = t.rjust(8,"0")
    47. times = int(time.time()*1000)
    48. result2 = hex(times)[2:].upper()
    49. return result+"_"+result2
    50. b_lsid = bl_lsid()
    51. print(b_lsid)
    52. sessions.cookies.set("b_lsid", b_lsid)
    53. #_uuid
    54. def l_uuid():
    55. uuid_sec = str(uuid.uuid4())
    56. time_sec = str(int(time.time() * 1000 % 1e5))
    57. time_sec = time_sec.rjust(5, "0")
    58. return f"{uuid_sec}{time_sec}infoc"
    59. _uuid = l_uuid()
    60. print(_uuid)
    61. sessions.cookies.set("uuid", _uuid)
    62. time.sleep(0.5)
    63. buvid4 = sessions.get("https://api.bilibili.com/x/frontend/finger/spi").json()["data"]["b_4"]
    64. print(buvid4)
    65. sessions.cookies.set("buvid4", buvid4)
    66. CURRENT_QUALITY = "16"
    67. sessions.cookies.set("CURRENT_QUALITY", CURRENT_QUALITY)
    68. sessions.cookies.set("theme_style", "light")
    69. url = "https://api.bilibili.com/x/click-interface/click/web/h5"
    70. ctime = int(time.time())
    71. data = {
    72. "aid": aid,
    73. "cid": cid,
    74. "part": "1",
    75. "lv": "0",
    76. "ftime": ctime - random.randint(100, 500), # 浏览器首次打开时间
    77. "stime": ctime,
    78. "type": "3",
    79. "sub_type": "0",
    80. "from_spmid": "",
    81. "spmid": "333.788.0.0",
    82. "refer_url": "",
    83. "csrf": ""
    84. }
    85. sessions.headers.update({
    86. "content-type": "application/x-www-form-urlencoded",
    87. "referer": 'https://www.bilibili.com/video/BV1fq4y1T7X8/',
    88. "origin": 'https://www.bilibili.com',
    89. "content-length": "138",
    90. "sec-fetch-site": "same-site",
    91. "sec-fetch-mode": "cors",
    92. "sec-fetch-dest": "empty",
    93. })
    94. print(sessions.post(url=url,data=data).text)

    模拟请求成功: 

    与浏览器中一致: 

     

     

  • 相关阅读:
    【数据库】数据库绪论,你都会了吗
    JAVA版的数据结构——链表
    netty系列之:来,手把手教你使用netty搭建一个DNS tcp服务器
    DocCMS keyword SQL注入漏洞复现 [附POC]
    自定义类型:结构体,声明,变量初始化,结构体内存对齐。
    CeresScanMatcher 匹配的使用步骤与实例解析
    mysql跨库关联查询(dblink)
    AttitudeFactor.h/AttitudeFactor.cpp
    装修知识总结
    kdxf speex
  • 原文地址:https://blog.csdn.net/weixin_47481982/article/details/127666941