当前位置: 首页 > 后端技术 > Python

免费直播姬,自制实时显示直播弹幕软件,效果完美!

时间:2023-03-26 19:32:08 Python

使用PythonTkinter开发了一个爬取B站直播弹幕的工具,在这个程序中,我使用的打包工具是pyintaller,GUI使用的是python自带的Tkinter。需要打包文件的朋友可以私信我看看会把项目地址发给你https://github.com/jonssonyan...tkinterimportEND,messageboximportrequests#全局变量,用于标识线程是否退出is_exit=True#B站获取弹幕对象classDanmu():def__init__(self,room_id):#弹幕urlself.url='https://api.live.bilibili.com/xlive/web-room/v1/dM/gethistory'#请求头self.headers={'Host':'api.live.bilibili.com','User-Agent':'Mozilla/5.0(WindowsNT10.0;Win64;x64;rv:78.0)Gecko/20100101Firefox/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('弹幕.log',mode='r',encoding='utf-8')self.log=log_file_read.readlines()defget_danmu(self):#暂停0.5防止cpu占用率过高time.sleep(1)#获取直播弹幕html=requests.post(url=self.url,headers=self.headers,data=self.data).json()#解析弹幕内容html['data']['room']:#获取昵称nickname=content['nickname']#获取语音text=content['text']#获取语音时间timeline=content['timeline']#记录语音msg=timeline+''+nickname+':'+text#判断是否对应消息存在于日志中,如果与上一条相同,则打印并保存ifmsg+'\n'notinself.log:#打印消息listb.insert(END,msg)listb.see(END)#保存日志self.log_file_write.write(msg+'\n')#添加到日志列表self.log.append(msg+'\n')#清除变量缓存nickname=''text=''timeline=''msg=''#线程对象defbilibili(room_id):#创建bDanmu实例bDanmu=Danmu(room_id)#获取弹幕bDanmu.get_danmu()classBilibiliThread(threading.Thread):def__init__(self,room_id=None):threading.Thread.__init__(self)self.room_id=room_id#重写run()方法defrun(self):globalis_exitwhilenotis_exit:bilibili(self.room_id)#暂停,防止cpu占用过多time.sleep(0.5)defauthor():#弹出对话框messagebox.showinfo(title='About',message='作者:阿庄Jonson\n日期:2021年2月4日\n微信公众号:科技猫')#实例化一个对象并创建一个窗口windowwindow=tkinter.Tk()#命名窗口的可视化window.title('哔哩哔哩弹幕查看工具')#设置窗口的大小(长*宽)window.minsize(300,500)window.geometry('400x600+250+100')#菜单栏menubar=tkinter.Menu(window)#open是放在菜单栏里面的,就是加载容器menubar.add_command(label='about',command=author)#在t之后菜单栏创建完成,配置menubar显示菜单栏window.config(menu=menubar)#创建一个在主窗口上生长的主框架frame=tkinter.Frame(window)frame.pack()#创建第二层框架frame长在主框架frame之上#upperframe_t=tkinter.Frame(frame)#接下来frame_b=tkinter.Frame(frame)frame_t.pack(side=tkinter.TOP)frame_b.pack(side=tkinter.BOTTOM)#创建标签tkinter.Label(frame_t,text='请输入房间号:',width=10,font=('宋体',10)).pack(side=tkinter.LEFT)#以纯文本显示default_text=tkinter.StringVar()default_text.set("21089733")e1=tkinter.Entry(frame_t,show=None,width=15,textvariable=default_text,font=('Arial',10))e1.pack(side=tkinter.LEFT)#定义触发事件时的start_point和end_point两个函数(注意:因为Python的执行顺序是从上到下,所以函数必须放在按钮上面)#startdefstart_point():try:room=e1.get()room_int=int(room)e1.configure(state=tkinter.DISABLED)b1.configure(state=tkinter.DISABLED)b2.configure(state=tkinter.NORMAL)ifroom_intisnotNone:globalis_exitis_exit=Falset=BilibiliThread()t.room_id=room_int#creategetBarrage线程t.setDaemon(True)t.start()除了ValueError:消息框。显示信息(title='Warning',message='输入的房间号格式不正确,请重试!')#stopdefend_point():globalis_exitis_exit=Truee1.configure(state=tkinter.NORMAL)b1.configure(state=tkinter.NORMAL)b2.configure(state=tkinter.DISABLED)#创建并放置两个按钮,分别触发两种情况b1=tkinter.Button(frame_t,text='start',width=10,command=start_point,font=('Arial',10))b1.pack(side=tkinter.LEFT)b2=tkinter.Button(frame_t,text='stop',width=10,command=end_point,font=('Arial',10))b2.pack(side=tkinter.LEFT)#滚动条sc=tkinter.Scrollbar(frame_b)sc.pack(side=tkinter.RIGHT,fill=tkinter.Y)#列表框控件listb=tkinter.Listbox(frame_b,yscrollcommand=sc.set,width=200,height=120)#将组件放在主窗口listb.pack(side=tkinter.LEFT,fill=tkinter.BOTH,expand=True)#移动滚动条,list会按照sc.config(command=listb.yview)#主窗口循环显示window.mainloop()效果