【Python】通过哔哩哔哩弹幕获取发送者id

哔哩哔哩弹幕逆向

用途

查找bilibili.com中弹幕的发送者

如何使用

终端中输入:

python bili_reverse.py

然后会提示让你输入BV号,你输入弹幕所在的BV号,开头带不带BV无所谓

然后程序会列出此BV号下的所有视频与其cid

1
输入你要找的弹幕所在的cid

然后程序会列出此cid下的所有弹幕与其发送者用户hash

2
输入你要逆向的用户hash

3
稍等片刻就可以逆向出弹幕发送者啦
4
5

代码

# -*- coding: UTF-8 -*-
# 初学者学习python的副产品
import requests                                 #网页
from scrapy.selector import Selector
import binascii                                 #转码
from tqdm import tqdm                           #进度条
import webbrowser                               #打开浏览器
import re                                       #正则表达式



def crc32asii(v):
    return '%x' % (binascii.crc32(v) & 0xffffffff)

def findUid(toBeFind , begin = 1 , end = 900000000 ):
    #穷举法逆向用户hash
    ans = []
    print("逆向中……")
    for i in tqdm(range( begin , end )):
        c = crc32asii(bytes(str(i), encoding='utf-8'))
        if(toBeFind == c):
            ans.append(i)
            print("找到:" + str(i) )
            if( input("极小可能哈希重值,是否继续? y/n :") != 'y' ):
                break
    return ans


def cid2hash(cid):
    t = ''
    url = 'https://api.bilibili.com/x/v1/dm/list.so?oid='+str(cid)
    body = requests.get(url).content
    xbody = Selector(text=str(body, encoding='utf-8'))
    lists = xbody.xpath("//d")

    for li in lists:
        content = li.xpath("./text()").get()
        par = li.xpath("./@p").get()
        pattern = re.compile(r'(?<=,0,)\w+(?=,)') 
        #正则表达式可能不严谨
        sentence = str(par)
        idHash = re.search(pattern, sentence )
        # idHash.group(0)提取搜索到的值
        text = 'hash: ' + str(idHash.group(0))+ " | " + str(content)+'\n' 
        t = t + text
    print(t)

def bvid2cid(bvid):
    # api来自 https://www.v2ex.com/t/655711
    url = 'https://danmu.u2sb.top/api/other/bilibili/queryaid/?bvid=' + str(bvid)
    urlReturn = requests.get(url)
    zidian = urlReturn.json()
    if(zidian['data'] == None):
        print('查无此BV!')
        return -1
    for i in zidian['data']['pageList']:
        print('cid:%10d  |  p%d %s'  % (i['cid'] , i['page'] , i['part']))
    return 0

def main():
    bvid = input("输入bv号:")
    while(bvid2cid(bvid) == -1):
        bvid = input("重新输入bv号:")
    cid = input("输入你选择的cid:")
    cid2hash(cid)
    yourHash = input("选择弹幕用户hash:")
    ans = findUid(yourHash)
    print("uid = " + str(ans))
    if(input("是否打开用户主页? y/n :") == 'y'):
        for i in ans:
            webbrowser.open("https://space.bilibili.com/" + str(i))
    return 0



if __name__ == '__main__':
    main()

此文同时发布于

知乎-python实现通过哔哩哔哩弹幕获取发送者id

GitHub

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

框架主义者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值