某AC站JS编码弹幕数据

0x01 工具

python3, chrome

0x02 查找接口

这里一共找到3个接口,第一个接口:

https://api.bilibili.com/x/v1/dm/list.so?oid=xxxxxx

其返回的内容是:
在这里插入图片描述
该接口目前只能请求到1000条数据,可能有别的参数可以控制翻页,但目前没有找到。

第二个接口:

# 通过oid和月份获取该月哪些天有弹幕数据
https://api.bilibili.com/x/v2/dm/history/index?type=1&oid=xxxxxx&month=2020-05

返回的内容:
在这里插入图片描述
通过上面返回的日期构造url(需要携带登录后的cookie):

# 通过oid和日期获取当天的弹幕数据
https://api.bilibili.com/x/v2/dm/history?type=1&oid=xxxxxxx&date=2020-07-11

返回的内容:
在这里插入图片描述
这里重点分析第三个接口:

https://api.bilibili.com/x/v2/dm/web/seg.so?type=1&oid=xxxxx&pid=xxxx&segment_index=1

老规矩,F12打开,查看该接口返回的内容,发现:
在这里插入图片描述
全部乱码,但可以看到其实格式是和第一个接口请求返回的应该是一样的。

0x03 响应内容

直接使用python请求看看:

#!/usr/bin/env python
# -*- coding: UTF-8 -*-

import requests

def main():
    url = 'https://api.bilibili.com/x/v2/dm/web/seg.so?type=1&oid=xxx&pid=xxx&segment_index=1'
    headers = {
        'accept': '*/*', 
        'accept-encoding': 'gzip, deflate, br', 
        'accept-language': 'zh-CN,zh;q=0.9', 
        'origin': 'https://www.bilibili.com', 
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36'
    }
    html = requests.request(url=url, method='get', headers=headers)
    print(html.text)


if __name__ == '__main__':
    main()

返回结果:
在这里插入图片描述
实际上是可以看到弹幕内容的,但是还有部分内容无法看到。若想要看到完整的内容怎么办,通过JS调试查看是怎么编码的,继续往下。
先将返回的内容转为十六进制,由于html.text的数据类型本身就是bytes类型,所以直接转:

def bytesToHexString(bs):
    return ['%02X ' % b for b in bs]

转换后得到十六进制的列表:
在这里插入图片描述

0x04 分析接口使用到的JS

打开chrome,F12,刷新页面,找到链接,随便下几个断点:
在这里插入图片描述
然后开始枯燥的单步调试。。。
发现请求位置:
在这里插入图片描述
继续。。。
这里我们看看返回的内容:
在这里插入图片描述
好像有一丢丢眼熟,我们将刚才请求到的十六进制转为十进制瞅瞅。
稍微修改一下刚才转换的代码:

def bytesToHexString(bs):
    return [int('%02X ' % b, 16) for b in bs]

转换得到:
在这里插入图片描述
和上面的数据一模一样,只是上边的是有符号整数,说明思路没错,数据需要这样转换来编码。

此处发现疑似转换编码的地方:
在这里插入图片描述
继续进去来到:
在这里插入图片描述
柳暗花明,这个位置就是编码的地方。
接下来就是将这部分用到的JS代码全部扣下来,整理完成后先在浏览器试试:
在这里插入图片描述

0x05 python调用JS

由于对编码加密算法不太熟悉,不清楚python是否有现成的编码方式直接调用,所以通过python调用JS的方式编码解析。

#!/usr/bin/env python
# -*- coding: UTF-8 -*-

import requests
import execjs


def main():
    url = 'https://api.bilibili.com/x/v2/dm/web/seg.so?type=1&oid=xxxx&pid=xxxxx&segment_index=1'
    headers = {
        'accept': '*/*',
        'accept-encoding': 'gzip, deflate, br',
        'accept-language': 'zh-CN,zh;q=0.9',
        'origin': 'https://www.bilibili.com',
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36'
    }
    html = requests.request(url=url, method='get', headers=headers)
    tt = bytesToHexString(html.content)
    with open(r'D:\Desktop\bili.js', 'r') as f:
        js_data = f.read()
    ctx = execjs.compile(js_data)
    ret = ctx.call('run', tt)
    print(ret)

def bytesToHexString(bs):
    return [int('%02X ' % b, 16) for b in bs]

if __name__ == '__main__':
    main()

python3运行的时候报错:

Exception in thread Thread-1:
Traceback (most recent call last):
  File "E:\Python36\lib\threading.py", line 916, in _bootstrap_inner
    self.run()
  File "E:\Python36\lib\threading.py", line 864, in run
    self._target(*self._args, **self._kwargs)
  File "E:\Python36\lib\subprocess.py", line 1063, in _readerthread
    buffer.append(fh.read())
UnicodeDecodeError: 'gbk' codec can't decode byte 0xb6 in position 1061: illegal multibyte sequence

Traceback (most recent call last):
  File "D:/directory/test/test01.py", line 29, in <module>
    main()
  File "D:/directory/test/test01.py", line 22, in main
    ret = ctx.call('run', tt)
  File "E:\Python36\lib\site-packages\execjs\_abstract_runtime_context.py", line 37, in call
    return self._call(name, *args)
  File "E:\Python36\lib\site-packages\execjs\_external_runtime.py", line 92, in _call
    return self._eval("{identifier}.apply(this, {args})".format(identifier=identifier, args=args))
  File "E:\Python36\lib\site-packages\execjs\_external_runtime.py", line 78, in _eval
    return self.exec_(code)
  File "E:\Python36\lib\site-packages\execjs\_abstract_runtime_context.py", line 18, in exec_
    return self._exec_(source)
  File "E:\Python36\lib\site-packages\execjs\_external_runtime.py", line 87, in _exec_
    output = self._exec_with_pipe(source)
  File "E:\Python36\lib\site-packages\execjs\_external_runtime.py", line 103, in _exec_with_pipe
    stdoutdata, stderrdata = p.communicate(input=input)
  File "E:\Python36\lib\subprocess.py", line 843, in communicate
    stdout, stderr = self._communicate(input, endtime, timeout)
  File "E:\Python36\lib\subprocess.py", line 1113, in _communicate
    stdout = stdout[0]
IndexError: list index out of range

网上查看资料说是execjs默认使用的是gbk格式,在加载utf-8编码格式的文件的时候会报此错误(实际上我修改文件编码格式后保存再次运行还是报错)。其中一个解决办法是修改execjs的subprocess.py文件:
在这里插入图片描述
修改后保存,再次运行:
在这里插入图片描述
搞定。

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
ac6921a数据手册是一份关于ac6921a芯片的详细说明文档。ac6921a是一款集成电路芯片,具有多种功能和特性。数据手册主要包括芯片的技术规格、功能描述、电气特性、引脚定义、应用电路等内容。 首先,数据手册会详细介绍ac6921a芯片的技术规格。这包括芯片的封装形式、尺寸、工作电压范围以及工作温度范围等。这些规格对于设计电路和应用中的合理选择非常重要。 其次,数据手册会详细描述ac6921a芯片的功能特性。这包括芯片的主要功能模块、支持的通信协议、接口类型、存储容量等。用户可以通过阅读数据手册了解芯片的具体功能,以便根据需要进行系统设计。 数据手册还包含了芯片的电气特性。这些特性包括芯片的工作电流、工作电压、时钟频率等。通过了解这些电气特性,用户可以根据设计需求进行电路连接和供电设计。 同时,数据手册中还会给出ac6921a芯片的引脚定义和引脚功能描述。这些信息对于正确连接芯片以及与其他电路进行通信非常重要。 最后,数据手册会提供一些典型的应用电路图,以帮助用户更好地理解和使用ac6921a芯片。这些电路图可以作为设计参考,或者直接应用于实际项目中。 总之,ac6921a数据手册是一份完整的关于ac6921a芯片的技术文档。通过阅读数据手册,用户能够了解芯片的技术规格、功能特性、电气特性,以及正确使用芯片的引脚和应用电路等信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值