https://github.com/jonssonyan...
import threading
import time
import tkinter.simpledialog
from tkinter import END, simpledialog, messagebox
import requests
class Danmu():
def __init__(self, room_id):
# 彈幕url
self.url = 'https://api.live.bilibili.com/xlive/web-room/v1/dM/gethistory'
# 請(qǐng)求頭
self.headers = {
'Host': 'api.live.bilibili.com',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:78.0) Gecko/20100101 Firefox/78.0',
}
# 定義POST傳遞的參數(shù)
self.data = {
'roomid': room_id,
'csrf_token': '',
'csrf': '',
'visit_id': '',
}
# 日志寫對(duì)象
self.log_file_write = open('danmu.log', mode='a', encoding='utf-8')
# 讀取日志
log_file_read = open('danmu.log', mode='r', encoding='utf-8')
self.log = log_file_read.readlines()
def get_danmu(self):
# 暫停0.5防止cpu占用過高
time.sleep(1)
# 獲取直播間彈幕
html = requests.post(url=self.url, headers=self.headers, data=self.data).json()
# 解析彈幕列表
for content in html['data']['room']:
# 獲取昵稱
nickname = content['nickname']
# 獲取發(fā)言
text = content['text']
# 獲取發(fā)言時(shí)間
timeline = content['timeline']
# 記錄發(fā)言
msg = timeline + ' ' + nickname + ': ' + text
# 判斷對(duì)應(yīng)消息是否存在于日志,如果和最后一條相同則打印并保存
if msg + '\n' not in self.log:
# 打印消息
listb.insert(END, msg)
listb.see(END)
# 保存日志
self.log_file_write.write(msg + '\n')
# 添加到日志列表
self.log.append(msg + '\n')
# 清空變量緩存
nickname = ''
text = ''
timeline = ''
msg = ''
def bilibili(delay, room_id):
# 創(chuàng)建bDanmu實(shí)例
bDanmu = Danmu(room_id)
while True:
# 暫停防止cpu占用過高
time.sleep(delay)
# 獲取彈幕
bDanmu.get_danmu()
def author():
# 彈出對(duì)話框
messagebox.showinfo(title='關(guān)于', message='作者:阿壯Jonson\n日期:2021年2月4日\n微信公眾號(hào):科技貓')
# tkinter GUI
window = tkinter.Tk()
window.title('BiliBli彈幕查看工具')
window.minsize(300, 500)
window.geometry('400x600+250+100')
# 菜單欄
menubar = tkinter.Menu(window)
# Open放在菜單欄中,就是裝入容器
menubar.add_command(label='關(guān)于', command=author)
# 創(chuàng)建菜單欄完成后,配置讓菜單欄menubar顯示出來
window.config(menu=menubar)
# 滾動(dòng)條
sc = tkinter.Scrollbar(window)
sc.pack(side=tkinter.RIGHT, fill=tkinter.Y)
# Listbox控件
listb = tkinter.Listbox(window, yscrollcommand=sc.set)
# 將部件放置到主窗口中
listb.pack(side=tkinter.LEFT, fill=tkinter.BOTH, expand=True)
# 滾動(dòng)條動(dòng),列表跟著動(dòng)
sc.config(command=listb.yview)
# 獲取字符串(標(biāo)題,提示,初始值)
room_id = simpledialog.askstring(title='請(qǐng)輸入房間號(hào)', prompt='請(qǐng)輸入房間號(hào):'
, initialvalue='21089733')
if room_id is not None:
# 創(chuàng)建獲取彈幕線程
try:
t = threading.Thread(target=bilibili, args=(0.5, str(room_id),))
t.setDaemon(True)
t.start()
except:
print("Error: 啟動(dòng)失??!請(qǐng)檢查房間號(hào)是否正確")
# 進(jìn)入循環(huán)顯示
window.mainloop()
-w,--windowed,--noconsolc 指定程序運(yùn)行時(shí)不顯示命令行窗口(僅對(duì) Windows 有效) PyInstaller 支持的常用選項(xiàng)
執(zhí)行完命令之后會(huì)在項(xiàng)目目錄下多出dist文件夾,編譯后的文件就在該文件夾下 pyinstaller 不可以跨平臺(tái)編譯,windows平臺(tái)下只能編譯成windows下的執(zhí)行文件(.exe),同理mac linux也是一樣
到此這篇關(guān)于使用python tkinter開發(fā)一個(gè)爬取B站直播彈幕的工具的文章就介紹到這了,更多相關(guān)python tkinter開發(fā)B站直播彈幕工具內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!