共计 2459 个字符,预计需要花费 7 分钟才能阅读完成。
我的项目地址
https://github.com/jonssonyan…
开发工具
- python 3.7.9
- pycharm 2019.3.5
代码
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' | |
# 申请头 | |
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 传递的参数 | |
self.data = { | |
'roomid': room_id, | |
'csrf_token': '','csrf':'', | |
'visit_id': '', | |
} | |
# 日志写对象 | |
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'] | |
# 获取发言 | |
text = content['text'] | |
# 获取发言工夫 | |
timeline = content['timeline'] | |
# 记录发言 | |
msg = timeline + '' + nickname +': ' + text | |
# 判断对应音讯是否存在于日志,如果和最初一条雷同则打印并保留 | |
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): | |
# 创立 bDanmu 实例 | |
bDanmu = Danmu(room_id) | |
while True: | |
# 暂停避免 cpu 占用过高 | |
time.sleep(delay) | |
# 获取弹幕 | |
bDanmu.get_danmu() | |
def author(): | |
# 弹出对话框 | |
messagebox.showinfo(title='对于', message='作者:阿壮 Jonson\n 日期:2021 年 2 月 4 日 \n 微信公众号:科技猫') | |
# 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='对于', command=author) | |
# 创立菜单栏实现后,配置让菜单栏 menubar 显示进去 | |
window.config(menu=menubar) | |
# 滚动条 | |
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) | |
# 滚动条动,列表跟着动 | |
sc.config(command=listb.yview) | |
# 获取字符串(题目,提醒,初始值)room_id = simpledialog.askstring(title='请输出房间号', prompt='请输出房间号:' | |
, initialvalue='21089733') | |
if room_id is not None: | |
# 创立获取弹幕线程 | |
try: | |
t = threading.Thread(target=bilibili, args=(0.5, str(room_id),)) | |
t.setDaemon(True) | |
t.start() | |
except: | |
print("Error: 启动失败!请查看房间号是否正确") | |
# 进入循环显示 | |
window.mainloop() |
编译
应用第三方包:pyinstaller
命令
pyinstaller -F -w bilibli-danmu.py
参数解释
- -F,-onefile 产生单个的可执行文件
- -w,–windowed,–noconsolc 指定程序运行时不显示命令行窗口(仅对 Windows 无效)
PyInstaller 反对的罕用选项
补充
- 执行完命令之后会在我的项目目录下多出 dist 文件夹,编译后的文件就在该文件夹下
- pyinstaller 不能够跨平台编译,windows 平台下只能编译成 windows 下的执行文件 (.exe),同理 mac linux 也是一样
正文完