本文章的**可能已經過時了,請參考最新**:
博主本人在空閒的時候比較喜歡看一些遊戲直播,發現好多主播都在使用彈幕姬,便對彈幕姬的原理產生了興趣,打算自己動手做乙個彈幕播報的程式
import requests
import win32com.client
import time
old_list =
#建立乙個old_list列表用於輔助後面的text_danmu方法提取新訊息
class danmu():
#定義乙個danmu類
def __init__(self):
self.url = ""
self.headers =
self.data =
#在 __init__方法中先定義好要使用的請求url,請求頭,和請求引數
def speak_text(self,text):
#定義乙個speak_text方法,並建立形參text,用於作為接下來讀取的文字
speak = win32com.client.dispatch("sapi.spvoice")
#建立發聲物件
speak.speak(text)
#使用發生物件讀取文字
def text_danmu(self,html):
#建立乙個text_danmu方法,用於提取彈幕資訊
global old_list
#設定變數作用域,使得該方法可以修改全域性變數old_list的值
temp_list =
#建立乙個temp_list列表用於作為臨時列表輔助提取彈幕訊息
for text in html["data"]["room"]:
#for迴圈提取html字典中巢狀的子字典data中巢狀的子字典room的內容賦值給text變數
#這個html字典來自於get_danmu方法傳遞
#將變數text字典中text鍵的值新增到temp_list中
if temp_list == old_list:
pass
#檢測temp_list臨時列表的內容和old_list是否相同,如果相同則跳過
else:
for text_number in range (1,11):
#建立for迴圈一次將1到10的數字賦給text_number
if "".join(temp_list[:text_number]) in "".join(old_list):
pass
#使用join方法以""為分割符提取temp_list切割後的列表的內容
#使用join方法以""為分割符提取old_list列表的內容
#比較內容是否相同,如果相同則跳過
else:
try:
print (temp_list[text_number-1])
except:
pass
else:
self.speak_text(temp_list[text_number-1])
#嘗試列印temp_list指定索引的內容,如果報錯則跳過
#否則呼叫speak_text方法,進行文字轉語言
old_list = temp_list[:]
#將temp_list的值賦給old_list,進行更新舊資訊列表
def get_danmu(self):
html = requests.post(url=self.url,headers=self.headers,data=self.data)
html.json()
self.text_danmu(eval(html.text))
#定義get_danmu方法
#使用requests.post方法獲取網頁內容
#將網頁返回值以json的資訊載入
#呼叫之前定義的text_danmu方法,傳遞eval處理後的網頁返回值的文字內容
bzhan = danmu()
#建立乙個bzhan例項
while true:
bzhan.get_danmu()
time.sleep(3)
#每三秒鐘呼叫乙個bzhan例項的get_danmu方法
python實現b站直播自動傳送彈幕功能
python 3.6 pycharm import requests import time from tkinter import import random 首先你要登陸b站賬號,然後隨便點選乙個直播間,這裡建議先選擇人氣少的,彈幕少的,這樣方便檢視效果 如上圖所示先開啟開發者工具,定位到xhr...
python 爬蟲 b站彈幕爬蟲
coding utf 8 獲取bilibili直播間彈幕 房間號從網頁源 中獲取 開啟直播畫面後,按ctrl u 開啟網頁源 按ctrl f 搜尋 room id 搜到的 room id 1016中,1016就是房間號 獲取不 間的彈幕 修改 第26行的roomid的值為對應的房間號 import ...
Python3爬蟲 鬥魚彈幕爬蟲
在網上找到了乙份鬥魚彈幕伺服器第三方接入協議v1.6.2,有了第三方介面,做起來就容易多了。鬥魚後台協議頭設計如下 這裡的訊息長度是我們傳送的資料部分的長度和頭部的長度之和,兩個訊息長度是一樣。然後要注意的是該協議使用的是小端整數,所以我們要對資料進行處理後再傳送,這裡可以使用int.to byte...