Python指令碼如何在bilibili中查詢彈幕傳送者
總所周知bilibili是沒有辦法直接檢視彈幕的傳送者的,這使得當我們看到一些nt彈幕的時候雖然生氣,卻無可奈何,但是B站是可以遮蔽某個使用者傳送的彈幕的,這說明資料介面裡肯定有使用者資訊,由於最近在學爬蟲,所以我想先找找彈幕介面,分析下里面的資料。
找介面
找介面當然是隨便開啟一個視訊然後F12啦,可是當我找了兩圈後我傻眼了,沒找到啊。。得,不能把時間浪費在這種事情上,果斷開啟百度,不出所料,找到了如下的兩個介面,都是XML格式網頁
https://comment.bilibili.com/+cid
https://api.bilibili.com/x/v1/dm/list.so?oid=+cid
這裡面的cid是一種每個視訊獨有的數字,也就是每一P都有一個cid,查詢cid可以開啟網頁然後F12,再ctrl+f搜尋cid,一般八九位數的就是cid了。
這裡我找到了一個介面,可以通過aid找到cid
https://www.bilibili.com/widget/getPageList?aid=+aid
分析資料
彈幕資料是獲取到了,那麼我們就要從這一堆資料中分析他們的用途了
這裡大概能得到兩個資訊,其中第6個數據為時間戳,第8個數據為使用者uid的某種加密方式。經查詢得到這是使用者uid經過crc32校驗得到的結果轉為16進位制數,所以只能通過uid得到對於的校驗碼,無法反推。。似乎只能通過彩虹表的方式查詢資料了?那麼這串8位16進位制的數字在資料庫中要用什麼方式儲存呢?
就在我決定用bigint儲存資料時,我突然想到,8位16進位制那就是2的32次方,int型的儲存上限時2的31次方,如果用無符號的方式儲存正好是2的32次方,也就是能儲存到0xffffffff這麼大的資料,正好滿足要求。於是果斷換成無符號int,與之對應的id也為無符號int,並將crc32b編碼過後的資料作為主鍵,製成彩虹表存入我的伺服器內。
(粗略的算了一下,6億資料就是需要27G左右的空間…而我的伺服器一共才40G的大小…)
做成網頁供大家使用
接下來的操作似乎就水到渠成了,寫了個python指令碼,該python指令碼接受2個引數,視訊cid和想要搜尋的彈幕關鍵字,返回使用者傳送的彈幕,使用者的crc32b編碼,時間戳。然後用php的exec函式執行python程式碼,並通過搜尋資料庫找出使用者的uid,通過php返回json格式資料給前端。
python程式碼(寫的很爛)
import requests from bs4 import BeautifulSoup import re import io import sys sys.stdout = io.TextIOWrapper(sys.stdout.buffer,encoding='utf-8') req = requests.get('https://comment.bilibili.com/'+sys.argv[1]+'.xml') req.encoding = req.apparent_encoding soup = BeautifulSoup(req.text,'html.parser').find_all(name='d') result = "" for i in soup: s = re.sub('<(.*?)>','',str(i)) index = 0 if(len(sys.argv[2])>0): index = s.find(str(sys.argv[2])) if(index!=-1): result+=str(i).split(",")[6]+","+s+","+str(i).split(",")[4]+"," print(result)
效果展示
前端程式碼就是隨便寫的~至少功能實現了嘛
這裡說一下為什麼是NULL,因為我的伺服器還在可憐巴巴的往資料庫內寫入彩虹表資料。。預計需要4天~
今天加了個暴力破解的功能,避免了查詢結果為NULL,但是相對的查詢速度會非常慢。
最後!附上該工具的連結:點我
總結
到此這篇關於Python指令碼如何在bilibili中查詢彈幕傳送者的文章就介紹到這了,更多相關bilibili彈幕傳送者內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!