B站的弹幕宠物是一种创新的直播互动方式,(B站弹幕宠物练级脚本或者B站自动发弹幕(b站弹幕姬)实现途径都大差不差在直播间用脚本自动发弹幕就可以了),B站的弹幕宠物它允许观众通过发送弹幕指令来控制屏幕上的宠物进行各种动作,从而增加直播的趣味性和互动性。以下是对B站弹幕宠物的详细介绍:
弹幕控制:观众可以通过发送特定的弹幕指令,如“左”、“右”、“前”、“后”加上数字表示移动距离,来控制宠物的移动。此外,还有如“跳”、“嗨起来”、“坐下”等动作指令,使宠物能够执行相应的动作。
礼物互动:观众赠送特定礼物,如幸运气球或盲盒道具,可以触发宠物的特殊效果。例如,幸运气球可以让宠物飞起来,而盲盒道具则可以随机改变宠物的形态或赋予其特殊能力。
模型切换:观众可以发送指令切换宠物的模型,B站提供了多种免费的宠物模型供选择,如熊猫、小狗、小猫等,同时还有付费模型如孙悟空、火龙等,增加了宠物的多样性。
修仙玩法:观众和主播可以通过发送弹幕指令参与修仙玩法,提高宠物的修炼速度,尝试突破和升级。这种玩法结合了养成和角色扮演的元素,为直播增添了更多的趣味性和挑战性。
一、猫猫养成的基本玩法
初始选择:用户初次参与猫猫养成时,会从“棉花糖、度假猫、三花”等模型中随机选择一个作为自己的初始猫咪。
互动指令:用户可以通过发送弹幕指令来与猫咪进行互动,如“修炼”、“查询”(显示玩家资料)、“背包”(查看已拥有和可购买的物品)、“购买XXX”(购买物品)、“使用XXX”(使用物品)等。
经验获取与升级:通过喂食(如毛线球)和使用逗猫棒等道具,猫咪可以获得经验并升级。升级后,猫咪可能会解锁新的外观或特效。
二、猫猫养成的特色功能
特效触发:投喂特定数量的礼物(如毛线球、西瓜等)可以触发不同的特效,如猫猫拳、假期躺平卡等。
结婚系统:投喂“喜结良缘”礼物后,猫咪可以进入结婚系统,并与其他猫咪“结婚”并贴贴。
弹幕互动:用户可以通过发送弹幕来参与猫猫养成的互动,如发送“召唤宠物”、“打劫”等指令来与其他玩家互动。
猫猫皮肤:B站会定期更新猫猫的皮肤和特效,用户可以通过购买或参与活动来获得。
今天制作的这一款能在B站能指定直播间、自动发送弹幕的功能的脚本,因为我们B站弹幕宠物直接在直播间里发弹幕就可以被识别到,我们只需要完成弹幕宠物的修炼升级就行,没有必要搞那么多花里胡哨的,只要能稳定的挂机升级就行,所以没做那么多的功能,所以代码很简单。
首先我们去b站找到下面示例代码的直播间,房间号是:3199583 1
下面是最简单的实现代码, 可以直接运行使用# -*-coding: UTF-8 # @Time : 2024/9/18 18:44 # @Author : Cooper # @FileName: 弹幕宠物脚本4.py # @Software: PyCharm # -*-coding: UTF-8 import random import time import requests lis_text2 = ['修仙', '突破', ] # 弹幕宠物的修炼的专属直播间 roomid='3199583' # roomid='32288552' def send(): a = 0 while True: if a: send_meg = random.choice(lis_text2) else: send_meg = '修仙' url = 'https://api.live.bilibili.com/msg/send' data = { 'bubble': '0', 'msg': send_meg, 'color': '16777215', 'mode': '1', 'fontsize': '50', 'rnd': '1726055988', 'roomid': '{}'.format(roomid), 'csrf': '4cb23f0382a5c1d8bda997b24f5be710', # 新账号需要改这里 'csrf_token': '4cb23f0382a5c1d8bda997b24f5be710', # 新账号需要改这里 } data2 = { 'bubble': '0', 'msg': send_meg, 'color': '16777215', 'mode': '1', 'fontsize': '50', 'rnd': '1724769083', 'roomid': '{}'.format(roomid), 'csrf': '59d7ac13d06cfb1f56af44eebc9a9941', # 新账号需要改这里 'csrf_token': '59d7ac13d06cfb1f56af44eebc9a9941', # 新账号需要改这里 } headers = { # 新账号需要改cookie 'Cookie': "LIVE_BUVID=AUTO3516148326950470; buvid4=F5CB8C85-EEDA-07B6-0ADB-2ABB06DD39CE49140-022020211-YdCYHOtTw2Bn6Oi19MWYqg%3D%3D; rpdid=|(J~R)ulJk)u0J'uY~|J)~YYR; header_theme_version=CLOSE; home_feed_column=5; buvid3=4BCA90A2-9358-E481-15AE-497383D8CBC213436infoc; b_nut=1709956413; _uuid=EB811DB5-D10B1-10F58-1B102-EDEE10D4AC5F618283infoc; enable_web_push=DISABLE; FEED_LIVE_VERSION=V_DYN_LIVING_UP; buvid_fp_plain=undefined; fingerprint=13c9bc59234d5413350808d6341b65e8; is-2022-channel=1; CURRENT_BLACKGAP=0; CURRENT_FNVAL=4048; buvid_fp=13c9bc59234d5413350808d6341b65e8; browser_resolution=1874-939; DedeUserID=17648823; DedeUserID__ckMd5=9c54a0d0505112ab; Hm_lvt_8a6e55dbd2870f0f5bc9194cddf32a02=1724755652,1724950044; bili_ticket=eyJhbGciOiJIUzI1NiIsImtpZCI6InMwMyIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3MjYyMjI2ODYsImlhdCI6MTcyNTk2MzQyNiwicGx0IjotMX0.WfTZ3D5AiBmSrAC1e7GFYoEeu_q--HZoTrKANaZeyX0; bili_ticket_expires=1726222626; SESSDATA=381c5870%2C1741515493%2C1400a%2A91CjBm99GTeYTNHMC4ta63srvHW6SmQfzCbdZHtwCRefSuFenDNumOhdv0AZSLC77xBA4SVnNZNU12ZnNDME1RUFZKQlphQzRKcWtWeDdLVERYR1RpWno0RmMwLVp0Q1R2YUJwQ2x4OFlBSUpiVjktYVFXUTBIY2d6cTIyN2tsdHVpSC1TX0k4T3FBIIEC; bili_jct=4cb23f0382a5c1d8bda997b24f5be710; sid=860njx69; b_lsid=CAEEFC13_191E0F40007; PVID=2", 'origin': 'https://live.bilibili.com', 'referer': 'https://live.bilibili.com/blanc/1029?liteVersion=true', 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36', } headers2 = { # 新账号需要改cookie 'Cookie': "LIVE_BUVID=AUTO2716289372509581; buvid3=0A947BA8-C8B5-9629-FC30-620F495459C292687infoc; b_nut=1717818992; _uuid=77CFE354-6B18-88EC-C5104-EF3C6B7CD32604481infoc; buvid4=EA97A437-6A1E-5D77-7EAA-41216E5EE70204642-024060803-uKTCo5OhsuB8ZPKGZhlC%2BA%3D%3D; CURRENT_FNVAL=4048; fingerprint=1e4715b5de92b6bfac1ad49838d7885a; buvid_fp_plain=undefined; buvid_fp=1e4715b5de92b6bfac1ad49838d7885a; DedeUserID=3546699612031082; DedeUserID__ckMd5=5fdb487ae63b2b9f; rpdid=|(J|~|Jkum|)0J'u~u)~mRRYu; bili_ticket=eyJhbGciOiJIUzI1NiIsImtpZCI6InMwMyIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3MjUwMTQxODQsImlhdCI6MTcyNDc1NDkyNCwicGx0IjotMX0.uYScHOUqdQ-wgoSzjsDHo1e4TV_d-DvnEW_WFfbv7FA; bili_ticket_expires=1725014124; SESSDATA=beb38df7%2C1740306987%2C6496e%2A82CjDHbd1etLnNbbSDUXzQwd-Ms9X3xygovQyFjekW5zYPIydQ6Hk4aQ9tdQX9WEtdmSUSVkhzNS1qbFJRUmRwLWg2YURCVHZZczNKeTNhQ09JUFctQkN0ZzlBbk1EY0pKazlINzZZamtua3pMaHRMTzMyUlNmM0tKeEpVT013UlVIZHlpWDhPY2VnIIEC; bili_jct=59d7ac13d06cfb1f56af44eebc9a9941; sid=f20hv94y; Hm_lvt_8a6e55dbd2870f0f5bc9194cddf32a02=1724755017,1724757169; bp_t_offset_3546699612031082=970557188923719680; b_lsid=59C948D8_1919F135EC8; PVID=2", 'origin': 'https://live.bilibili.com', 'referer': 'https://live.bilibili.com/blanc/1029?liteVersion=true', 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36', } a += 1 response = requests.post(url=url, data=data, headers=headers) response2 = requests.post(url=url, data=data2, headers=headers2) print('大号斯蒂芬', response, end='t') print('小号幻雪', response2) time.sleep(200) send()
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172 运行结果,看到了我的b站的大号小号的各自发送了一条弹幕修仙,这时候我的弹幕宠物可以修炼了。 需要改成自己的账号的地方'csrf': '59d7ac13d06cfb1f56af44eebc9a9941', # 新账号需要改这里 'csrf_token': '59d7ac13d06cfb1f56af44eebc9a9941', # 新账号需要改这里 123
和这里
# 新账号需要改cookie # 'Cookie': "LIVE_BUVID=AUTO3516048326950470; buvid4=F5CB8C85-EEDA-07B6-0ADB-2ABB06DD39CE49140-022000211-YdCYHOtTw2Bn6Oi19MWYqg%3D%3D; rpdid=|(J~R)ulJk)u0J'uY~|J)~YYR; header_theme_version=CLOSE; home_feed_column=5; buvid3=4BCA90A2-9358-E481-15AE-497383D8CBC213436infoc; b_nut=1709956413; _uuid=EB811DB5-D10B1-10F58-1B102-EDEE10D4AC5F608283infoc; enable_web_push=DISABLE; FEED_LIVE_VERSION=V_DYN_LIVING_UP; buvid_fp_plain=undefined; fingerprint=13c9bc59234d5413350808d6341b65e8; is-2002-channel=1; CURRENT_BLACKGAP=0; CURRENT_FNVAL=4048; buvid_fp=13c9bc59234d5413350808d6341b65e8; browser_resolution=1874-939; DedeUserID=17648823; DedeUserID__ckMd5=9c54a0d0505112ab; Hm_lvt_8a6e55dbd2870f0f5bc9194cddf32a02=1724755652,1724950044; bili_ticket=eyJhbGciOiJIUzI1NiIsImtpZCI6InMwMyIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3MjYyMjI2ODYsImlhdCI6MTcyNTk2MzQyNiwicGx0IjotMX0.WfTZ3D5AiBmSrAC1e7GFYoEeu_q--HZoTrKANaZeyX0; bili_ticket_expires=1726222626; SESSDATA=381c5870%2C1741515493%2C1400a%2A91CjBm99GTeYTNHMC4ta63srvHW6SmQfzCbdZHtwCRefSuFenDNumOhdv0AZSLC77xBA4SVnNZNU12ZnNDME1RUFZKQlphQzRKcWtWeDdLVERYR1RpWno0RmMwLVp0Q1R2YUJwQ2x4OFlBSUpiVjktYVFXUTBIY2d6cTIyN2tsdHVpSC1TX0k4T3FBIIEC; bili_jct=4cb23f0382a5c1d8bda997b24f5be710; sid=860njx69; b_lsid=CAEEFC13_191E0F40007; PVID=2", 'Cookie': "buvid3=0A929476-B840-32B4-3F5C-3C6C0B162D4648875infoc; b_nut=1725698848; _uuid=E43FA16A-72C10-BA32-81010B-6DC10A197CABB51096infoc; buvid4=C8FA3BCA-213C-F996-DFE4-2123F12CD24451628-024090708-CWDZBzdYGHaDiK77MGDu0g%3D%3D; enable_web_push=DISABLE; header_theme_version=CLOSE; home_feed_column=5; browser_resolution=1872-909; LIVE_BUVID=AUTO5917277516958839; CURRENT_FNVAL=4048; rpdid=|(umRYkkJlYu0J'u~k~~lkYR|; DedeUserID=17648823; DedeUserID__ckMd5=9c54a0d0505112ab; fingerprint=43a705ca1a3b90fb189ed920a459f118; buvid_fp_plain=undefined; bili_ticket=eyJhbGciOiJIUzI1NiIsImtpZCI6InMwMyIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3MzI4MDQzMDQsImlhdCI6MTczMjU0NTA0NCwicGx0IjotMX0.w8reVlT_6Z6dwkgTUnlJljxzesDmATxTX699qjqQYkA; bili_ticket_expires=1732804244; SESSDATA=e472f8ff%2C1748097111%2C71c99%2Ab1CjAww1PHawpPhvi3muS4jtC4w0hfohLoINjbvOLvo6rNixMHQ39OYomIuf4AKWD0YZ8SVlZFTV9zbHZyS085UjhrTjVwODFhRzJVeDNmaUFiOEl3bXNnVnBiR2thcWNyT2luSHJma05zTGxYMzgwMW0yOUNFNFBCMDJhdWJYOWpXenprNDFNazBRIIEC; bili_jct=9724432a18291d5b12dac35c809ac7ef; buvid_fp=43a705ca1a3b90fb189ed920a459f118; b_lsid=AF7331010E_193679E5A40; match_float_version=ENABLE; sid=mfsfdabt; bp_t_offset_17648823=1004043223569530880; PVID=2; Hm_lvt_8a6e55dbd2870f0f5bc9194cddf32a02=1731407078,1732610479; Hm_lpvt_8a6e55dbd2870f0f5bc9194cddf32a02=1732610479; HMACCOUNT=B1D0AE8C1B766655", 1234
在直播间发送666
# -*-coding: UTF-8 # @Time : 2024/9/18 18:44 # @Author : Cooper # @FileName: 弹幕宠物脚本4.py # @Software: PyCharm # -*-coding: UTF-8 import random import time from tkinter import * import requests lis_text2 = ['修仙', '突破', ] def send(): a = 0 while True: if a: send_meg = random.choice(lis_text2) else: send_meg = '修仙' roomid = entry.get() url = 'https://api.live.bilibili.com/msg/send' data = { 'bubble': '0', 'msg': send_meg, 'color': '16777215', 'mode': '1', 'fontsize': '50', 'rnd': '1726055988', 'roomid': '{}'.format(roomid), 'csrf': '4cb23f0382a5c1d8bda997b24f5be710', # 新账号需要改这里 'csrf_token': '4cb23f0382a5c1d8bda997b24f5be710', # 新账号需要改这里 } data2 = { 'bubble': '0', 'msg': send_meg, 'color': '16777215', 'mode': '1', 'fontsize': '50', 'rnd': '1724769083', 'roomid': '{}'.format(roomid), 'csrf': '59d7ac13d06cfb1f56af44eebc9a9941', # 新账号需要改这里 'csrf_token': '59d7ac13d06cfb1f56af44eebc9a9941', # 新账号需要改这里 } headers = { # 新账号需要改cookie 'Cookie': "LIVE_BUVID=AUTO3516148326950470; buvid4=F5CB8C85-EEDA-07B6-0ADB-2ABB06DD39CE49140-022020211-YdCYHOtTw2Bn6Oi19MWYqg%3D%3D; rpdid=|(J~R)ulJk)u0J'uY~|J)~YYR; header_theme_version=CLOSE; home_feed_column=5; buvid3=4BCA90A2-9358-E481-15AE-497383D8CBC213436infoc; b_nut=1709956413; _uuid=EB811DB5-D10B1-10F58-1B102-EDEE10D4AC5F618283infoc; enable_web_push=DISABLE; FEED_LIVE_VERSION=V_DYN_LIVING_UP; buvid_fp_plain=undefined; fingerprint=13c9bc59234d5413350808d6341b65e8; is-2022-channel=1; CURRENT_BLACKGAP=0; CURRENT_FNVAL=4048; buvid_fp=13c9bc59234d5413350808d6341b65e8; browser_resolution=1874-939; DedeUserID=17648823; DedeUserID__ckMd5=9c54a0d0505112ab; Hm_lvt_8a6e55dbd2870f0f5bc9194cddf32a02=1724755652,1724950044; bili_ticket=eyJhbGciOiJIUzI1NiIsImtpZCI6InMwMyIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3MjYyMjI2ODYsImlhdCI6MTcyNTk2MzQyNiwicGx0IjotMX0.WfTZ3D5AiBmSrAC1e7GFYoEeu_q--HZoTrKANaZeyX0; bili_ticket_expires=1726222626; SESSDATA=381c5870%2C1741515493%2C1400a%2A91CjBm99GTeYTNHMC4ta63srvHW6SmQfzCbdZHtwCRefSuFenDNumOhdv0AZSLC77xBA4SVnNZNU12ZnNDME1RUFZKQlphQzRKcWtWeDdLVERYR1RpWno0RmMwLVp0Q1R2YUJwQ2x4OFlBSUpiVjktYVFXUTBIY2d6cTIyN2tsdHVpSC1TX0k4T3FBIIEC; bili_jct=4cb23f0382a5c1d8bda997b24f5be710; sid=860njx69; b_lsid=CAEEFC13_191E0F40007; PVID=2", 'origin': 'https://live.bilibili.com', 'referer': 'https://live.bilibili.com/blanc/1029?liteVersion=true', 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36', } headers2 = { # 新账号需要改cookie 'Cookie': "LIVE_BUVID=AUTO2716289372509581; buvid3=0A947BA8-C8B5-9629-FC30-620F495459C292687infoc; b_nut=1717818992; _uuid=77CFE354-6B18-88EC-C5104-EF3C6B7CD32604481infoc; buvid4=EA97A437-6A1E-5D77-7EAA-41216E5EE70204642-024060803-uKTCo5OhsuB8ZPKGZhlC%2BA%3D%3D; CURRENT_FNVAL=4048; fingerprint=1e4715b5de92b6bfac1ad49838d7885a; buvid_fp_plain=undefined; buvid_fp=1e4715b5de92b6bfac1ad49838d7885a; DedeUserID=3546699612031082; DedeUserID__ckMd5=5fdb487ae63b2b9f; rpdid=|(J|~|Jkum|)0J'u~u)~mRRYu; bili_ticket=eyJhbGciOiJIUzI1NiIsImtpZCI6InMwMyIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3MjUwMTQxODQsImlhdCI6MTcyNDc1NDkyNCwicGx0IjotMX0.uYScHOUqdQ-wgoSzjsDHo1e4TV_d-DvnEW_WFfbv7FA; bili_ticket_expires=1725014124; SESSDATA=beb38df7%2C1740306987%2C6496e%2A82CjDHbd1etLnNbbSDUXzQwd-Ms9X3xygovQyFjekW5zYPIydQ6Hk4aQ9tdQX9WEtdmSUSVkhzNS1qbFJRUmRwLWg2YURCVHZZczNKeTNhQ09JUFctQkN0ZzlBbk1EY0pKazlINzZZamtua3pMaHRMTzMyUlNmM0tKeEpVT013UlVIZHlpWDhPY2VnIIEC; bili_jct=59d7ac13d06cfb1f56af44eebc9a9941; sid=f20hv94y; Hm_lvt_8a6e55dbd2870f0f5bc9194cddf32a02=1724755017,1724757169; bp_t_offset_3546699612031082=970557188923719680; b_lsid=59C948D8_1919F135EC8; PVID=2", 'origin': 'https://live.bilibili.com', 'referer': 'https://live.bilibili.com/blanc/1029?liteVersion=true', 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36', } a += 1 response = requests.post(url=url, data=data, headers=headers) response2 = requests.post(url=url, data=data2, headers=headers2) print('大号斯蒂芬', response, end='t') print('小号幻雪', response2) text.insert(END, '第{}条弹幕发送成功'.format(a)) # 文本框滚动 text.see(END) # 更新 text.update() text.insert(END, '发送内容:{}'.format(send_meg)) time.sleep(200) root = Tk() root.title('B站自动发送弹幕') root.geometry('560x450+400+200') label = Label(root, text='请输入房间ID:', font=('华文行楷', 22)) label.grid() entry = Entry(root, font=('隶书', 20), width=26) entry.grid(row=0, column=1) text = Listbox(root, font=('隶书', 16), width=50, heigh=15) text.grid(row=2, columnspan=2) button1 = Button(root, text='开始发送', font=('隶书', 15), command=send) button1.grid(row=3, column=0) button2 = Button(root, text='退出程序', font=('隶书', 15), command=root.quit) button2.grid(row=3, column=1) root.mainloop()
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697# @Python : 3.13 # @FileName : 弹幕宠物qt版2.2.py # @time : 2004/11/10 10:26 # @Author : Cooper from PyQt5 import QtCore, QtGui, QtWidgets from PyQt5.QtWidgets import QWidget import random import requests from PyQt5.QtCore import QThread, pyqtSignal import time import img_rc from PyQt5.QtWidgets import QDesktopWidget import sys from requests.exceptions import ReadTimeout, HTTPError, RequestException lis_text2 = ['修仙', '突破', '打坐', '修炼', '签到'] a = 0 class QMainWindow(QtWidgets.QMainWindow): """对QMainWindow类重写,实现一些功能""" def closeEvent(self, event): """重写closeEvent方法,实现dialog窗体关闭时执行一些代码 :param event: close()触发的事件 :return: None """ print('这里2') reply = QtWidgets.QMessageBox.question(self, '本程序', "是否要退出程序?", QtWidgets.QMessageBox.Yes | QtWidgets.QMessageBox.No, QtWidgets.QMessageBox.No) if reply == QtWidgets.QMessageBox.Yes: event.accept() else: event.ignore() class WorkerThread(QThread): # 定义一个信号,用于通知主线程任务完成 middle_signal = pyqtSignal(str) finished_signal = pyqtSignal() def run(self): # 耗时任务要放在线程中 try: while True: global a print('ok') # 定义一个信号发送给主线程 self.middle_signal.emit(f"Thread: {a + 1}") time.sleep(500) print(f"Working... {a}") # 任务完成后发射信号 except Exception as e: print(e) self.finished_signal.emit() class Ui_MainWindow(QWidget): def setupUi(self, MainWindow): MainWindow.setObjectName("MainWindow") MainWindow.resize(555, 350) font = QtGui.QFont() font.setFamily("方正姚体简体") MainWindow.setFont(font) icon = QtGui.QIcon() icon.addPixmap(QtGui.QPixmap(":/jpg/Apple.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) MainWindow.setWindowIcon(icon) self.centralwidget = QtWidgets.QWidget(MainWindow) self.centralwidget.setStyleSheet("n" "#centralwidget{border-image: url(:/jpg/ironman.jpg);}") self.centralwidget.setObjectName("centralwidget") self.textBrowser = QtWidgets.QTextBrowser(self.centralwidget) self.textBrowser.setGeometry(QtCore.QRect(0, 75, 550, 230)) palette = QtGui.QPalette() brush = QtGui.QBrush(QtGui.QColor(170, 0, 0)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Text, brush) brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Base, brush) brush = QtGui.QBrush(QtGui.QColor(240, 60, 200)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Window, brush) brush = QtGui.QBrush(QtGui.QColor(170, 0, 0, 130)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.PlaceholderText, brush) brush = QtGui.QBrush(QtGui.QColor(170, 0, 0)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Text, brush) brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Base, brush) brush = QtGui.QBrush(QtGui.QColor(240, 60, 200)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Window, brush) brush = QtGui.QBrush(QtGui.QColor(170, 0, 0, 130)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.PlaceholderText, brush) brush = QtGui.QBrush(QtGui.QColor(120, 120, 120)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Text, brush) brush = QtGui.QBrush(QtGui.QColor(240, 60, 200)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Base, brush) brush = QtGui.QBrush(QtGui.QColor(240, 60, 200)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Window, brush) brush = QtGui.QBrush(QtGui.QColor(0, 0, 0, 130)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.PlaceholderText, brush) self.textBrowser.setPalette(palette) self.textBrowser.setAutoFillBackground(True) self.textBrowser.setObjectName("textBrowser") self.horizontalLayoutWidget = QtWidgets.QWidget(self.centralwidget) self.horizontalLayoutWidget.setGeometry(QtCore.QRect(0, 0, 550, 90)) self.horizontalLayoutWidget.setObjectName("horizontalLayoutWidget") self.horizontalLayout = QtWidgets.QHBoxLayout(self.horizontalLayoutWidget) self.horizontalLayout.setContentsMargins(0, 0, 0, 0) self.horizontalLayout.setObjectName("horizontalLayout") self.label = QtWidgets.QLabel(self.horizontalLayoutWidget) palette = QtGui.QPalette() brush = QtGui.QBrush(QtGui.QColor(170, 0, 0)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.WindowText, brush) brush = QtGui.QBrush(QtGui.QColor(170, 0, 0)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.WindowText, brush) brush = QtGui.QBrush(QtGui.QColor(120, 120, 120)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.WindowText, brush) self.label.setPalette(palette) font = QtGui.QFont() font.setFamily("方正北魏楷书简体") font.setPointSize(20) self.label.setFont(font) self.label.setObjectName("label") self.horizontalLayout.addWidget(self.label) self.lineEdit = QtWidgets.QLineEdit(self.horizontalLayoutWidget) self.lineEdit.setMaximumSize(QtCore.QSize(16777215, 16777215)) font = QtGui.QFont() font.setFamily("SimSun") font.setPointSize(15) self.lineEdit.setFont(font) self.lineEdit.setObjectName("lineEdit") self.horizontalLayout.addWidget(self.lineEdit) self.pushButton = QtWidgets.QPushButton(self.centralwidget) self.pushButton.setGeometry(QtCore.QRect(45, 310, 90, 30)) icon1 = QtGui.QIcon() icon1.addPixmap(QtGui.QPixmap(":/jpg/登录 .png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.pushButton.setIcon(icon1) self.pushButton.setObjectName("pushButton") self.pushButton_2 = QtWidgets.QPushButton(self.centralwidget) self.pushButton_2.setGeometry(QtCore.QRect(370, 310, 90, 30)) icon2 = QtGui.QIcon() icon2.addPixmap(QtGui.QPixmap(":/jpg/退出.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.pushButton_2.setIcon(icon2) self.pushButton_2.setObjectName("pushButton_2") self.label_2 = QtWidgets.QLabel(self.centralwidget) self.label_2.setGeometry(QtCore.QRect(200, 315, 100, 20)) palette = QtGui.QPalette() brush = QtGui.QBrush(QtGui.QColor(255, 85, 0)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.WindowText, brush) brush = QtGui.QBrush(QtGui.QColor(255, 85, 0)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.WindowText, brush) brush = QtGui.QBrush(QtGui.QColor(120, 120, 120)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.WindowText, brush) self.label_2.setPalette(palette) font = QtGui.QFont() font.setFamily("方正卡通简体") font.setPointSize(15) self.label_2.setFont(font) self.label_2.setObjectName("label_2") # 创建QGraphicsOpacityEffect对象 op = QtWidgets.QGraphicsOpacityEffect() op.setOpacity(1) # 0.5是透明度 self.textBrowser.setGraphicsEffect(op) self.textBrowser.setAutoFillBackground(True) MainWindow.setCentralWidget(self.centralwidget) self.retranslateUi(MainWindow) self.pushButton_2.clicked.connect(MainWindow.close) # type: ignore # self.pushButton.clicked.connect(self.label_2.clear) # type: ignore self.pushButton.clicked.connect(self.start_thread) # type: ignore self.pushButton.clicked.connect(self.label_2.clear) # type: ignore self.lineEdit.editingFinished.connect(self.label_2.clear) # type: ignore self.lineEdit.editingFinished.connect(self.start_thread) # type: ignore # 创建线程实例 self.thread = WorkerThread() # 连接信号到槽函数 self.thread.middle_signal.connect(self.on_middle) self.thread.finished_signal.connect(self.on_finished) QtCore.QMetaObject.connectSlotsByName(MainWindow) def retranslateUi(self, MainWindow): _translate = QtCore.QCoreApplication.translate MainWindow.setWindowTitle(_translate("MainWindow", "弹幕宠物修炼")) self.label.setText(_translate("MainWindow", "请输入房间号:")) self.pushButton.setText(_translate("MainWindow", "开始发送")) self.pushButton_2.setText(_translate("MainWindow", "退出程序")) self.label_2.setText(_translate("MainWindow", "等待运行 !")) self.lineEdit.setText(_translate("MainWindow", "1769474447")) self.textBrowser.setHtml(_translate("MainWindow", "<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">n" "<html><head><meta name="qrichtext" content="1" /><style type="text/css">n" "p, li { white-space: pre-wrap; }n" "</style></head><body style=" font-family:'黑体'; font-size:12pt; font-weight:400; font-style:normal;">n" "<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">弹幕列表:</p></body></html>")) def slot(self): print('正在运行') self.updateUi() time.sleep(10) self.textBrowser.clear() def start_thread(self): # 启动线程 self.thread.start() def on_middle(self, message): # 线程中间的处理 print("Thread middle") self.send() self.label.setText(message) def on_finished(self): # 线程完成后的处理 print("Thread finished!") self.label.setText("Thread finished!") def updateUi(self, message): try: text = ' ' message += text self.textBrowser.append("<pre><br> %s </br></pre>" % message) # 显示内容支撑html格式语法 except: self.textBrowser.append("<font color=red>%s is invalid!</font>" % message) def send(self): global a # while True: if a: send_meg = random.choice(lis_text2) else: send_meg = '修仙' roomid = self.lineEdit.text() url = 'https://api.live.bilibili.com/msg/send' data = { 'bubble': '0', 'msg': send_meg, 'color': '16777215', 'mode': '1', 'fontsize': '50', 'rnd': '1726055988', 'roomid': '{}'.format(roomid), 'csrf': '4cb23f0382a5c1d8bda997b24f5be710', # 新账号需要改这里 'csrf_token': '4cb23f0382a5c1d8bda997b24f5be710', # 新账号需要改这里 } data2 = { 'bubble': '0', 'msg': send_meg, 'color': '16777215', 'mode': '1', 'fontsize': '50', 'rnd': '1724769083', 'roomid': '{}'.format(roomid), 'csrf': '59d7ac13d06cfb1f56af44eebc9a9941', # 新账号需要改这里 'csrf_token': '59d7ac13d06cfb1f56af44eebc9a9941', # 新账号需要改这里 } headers = { # 新账号需要改cookie 'Cookie': "LIVE_BUVID=AUTO3516048326950470; buvid4=F5CB8C85-EEDA-07B6-0ADB-2ABB06DD39CE49140-022000211-YdCYHOtTw2Bn6Oi19MWYqg%3D%3D; rpdid=|(J~R)ulJk)u0J'uY~|J)~YYR; header_theme_version=CLOSE; home_feed_column=5; buvid3=4BCA90A2-9358-E481-15AE-497383D8CBC213436infoc; b_nut=1709956413; _uuid=EB811DB5-D10B1-10F58-1B102-EDEE10D4AC5F608283infoc; enable_web_push=DISABLE; FEED_LIVE_VERSION=V_DYN_LIVING_UP; buvid_fp_plain=undefined; fingerprint=13c9bc59234d5413350808d6341b65e8; is-2002-channel=1; CURRENT_BLACKGAP=0; CURRENT_FNVAL=4048; buvid_fp=13c9bc59234d5413350808d6341b65e8; browser_resolution=1874-939; DedeUserID=17648823; DedeUserID__ckMd5=9c54a0d0505112ab; Hm_lvt_8a6e55dbd2870f0f5bc9194cddf32a02=1724755652,1724950044; bili_ticket=eyJhbGciOiJIUzI1NiIsImtpZCI6InMwMyIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3MjYyMjI2ODYsImlhdCI6MTcyNTk2MzQyNiwicGx0IjotMX0.WfTZ3D5AiBmSrAC1e7GFYoEeu_q--HZoTrKANaZeyX0; bili_ticket_expires=1726222626; SESSDATA=381c5870%2C1741515493%2C1400a%2A91CjBm99GTeYTNHMC4ta63srvHW6SmQfzCbdZHtwCRefSuFenDNumOhdv0AZSLC77xBA4SVnNZNU12ZnNDME1RUFZKQlphQzRKcWtWeDdLVERYR1RpWno0RmMwLVp0Q1R2YUJwQ2x4OFlBSUpiVjktYVFXUTBIY2d6cTIyN2tsdHVpSC1TX0k4T3FBIIEC; bili_jct=4cb23f0382a5c1d8bda997b24f5be710; sid=860njx69; b_lsid=CAEEFC13_191E0F40007; PVID=2", 'Cookie': "buvid3=0A929476-B840-32B4-3F5C-3C6C0B162D4648875infoc; b_nut=1725698848; _uuid=E43FA16A-72C10-BA32-81010B-6DC10A197CABB51096infoc; buvid4=C8FA3BCA-213C-F996-DFE4-2123F12CD24451628-024090708-CWDZBzdYGHaDiK77MGDu0g%3D%3D; enable_web_push=DISABLE; header_theme_version=CLOSE; home_feed_column=5; browser_resolution=1872-909; LIVE_BUVID=AUTO5917277516958839; CURRENT_FNVAL=4048; rpdid=|(umRYkkJlYu0J'u~k~~lkYR|; DedeUserID=17648823; DedeUserID__ckMd5=9c54a0d0505112ab; bili_ticket=eyJhbGciOiJIUzI1NiIsImtpZCI6InMwMyIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3MzE2NDIzNjIsImlhdCI6MTczMTM4MzEwMiwicGx0IjotMX0.UN3AO6D2TO5c8wAJSNxu4I8GWImyGjPyj6cnbJq3u4E;", 'origin': 'https://live.bilibili.com', 'referer': 'https://live.bilibili.com/blanc/1029?liteVersion=true', 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36', } headers2 = { # 新账号需要改cookie 'Cookie': "LIVE_BUVID=AUTO2716289372509581; buvid3=0A947BA8-C8B5-9629-FC30-620F495459C292687infoc; b_nut=1717818992; _uuid=77CFE354-6B18-88EC-C5104-EF3C6B7CD32604481infoc; buvid4=EA97A437-6A1E-5D77-7EAA-41216E5EE70204642-024060803-uKTCo5OhsuB8ZPKGZhlC%2BA%3D%3D; CURRENT_FNVAL=4048; fingerprint=1e4715b5de92b6bfac1ad49838d7885a; buvid_fp_plain=undefined; buvid_fp=1e4715b5de92b6bfac1ad49838d7885a; DedeUserID=3546699602031082; DedeUserID__ckMd5=5fdb487ae63b2b9f; rpdid=|(J|~|Jkum|)0J'u~u)~mRRYu; bili_ticket=eyJhbGciOiJIUzI1NiIsImtpZCI6InMwMyIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3MjUwMTQxODQsImlhdCI6MTcyNDc1NDkyNCwicGx0IjotMX0.uYScHOUqdQ-wgoSzjsDHo1e4TV_d-DvnEW_WFfbv7FA; bili_ticket_expires=1725014124; SESSDATA=beb38df7%2C1740306987%2C6496e%2A82CjDHbd1etLnNbbSDUXzQwd-Ms9X3xygovQyFjekW5zYPIydQ6Hk4aQ9tdQX9WEtdmSUSVkhzNS1qbFJRUmRwLWg2YURCVHZZczNKeTNhQ09JUFctQkN0ZzlBbk1EY0pKazlINzZZamtua3pMaHRMTzMyUlNmM0tKeEpVT013UlVIZHlpWDhPY2VnIIEC; bili_jct=59d7ac13d06cfb1f56af44eebc9a9941; sid=f20hv94y; Hm_lvt_8a6e55dbd2870f0f5bc9194cddf32a02=1724755017,1724757169; bp_t_offset_3546699602031082=970557188923719680; b_lsid=59C948D8_1919F135EC8; PVID=2", 'origin': 'https://live.bilibili.com', 'referer': 'https://live.bilibili.com/blanc/1029?liteVersion=true', 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36', } a += 1 print(roomid) try: response = requests.post(url=url, data=data, headers=headers, timeout=10) response2 = requests.post(url=url, data=data2, headers=headers2, timeout=10) print('大号斯蒂芬', response, end='t') print('小号幻雪', response2) except HTTPError: print('httperror') self.updateUi( '第{}条弹幕发送失败, '.format(a) + '发送内容:{}, '.format(send_meg) + '错误原因:{}'.format( 'httperror')) except RequestException: print('reqerror') self.updateUi( '第{}条弹幕发送失败, '.format(a) + '发送内容:{}, '.format(send_meg) + '错误原因:{}'.format( 'reqerror')) except ReadTimeout: print('time out') self.updateUi( '第{}条弹幕发送失败, '.format(a) + '发送内容:{}, '.format(send_meg) + '错误原因:{}'.format( 'time out')) except Exception as e: print(e) self.updateUi( '第{}条弹幕发送失败, '.format(a) + '发送内容:{}, '.format(send_meg) + '错误原因:{}'.format(str(e))) else: self.updateUi('第{}条弹幕发送成功, '.format(a) + '发送内容:{}, '.format(send_meg)) # 必须添加第二个类来继承添加窗口属性不然报错AttributeError: 'Ui_MainWindow' object has no attribute 'geometry' class Agent(Ui_MainWindow, QtWidgets.QWidget, ): def center(self): # 获得屏幕坐标系 screen = QDesktopWidget().screenGeometry() # 获得窗口坐标系 size = self.geometry() # 获得窗口相关坐标 newLeft = (screen.width() - size.width()) // 2 newTop = (screen.height() - size.height()) // 2 # 移动窗口使其居中 self.move(newLeft, newTop) class Ui_MainWindow(Agent): pass def show_MainWindow(): app = QtWidgets.QApplication(sys.argv) # 实例化QApplication类,作为GUI主程序入口 MainWindow = QMainWindow() # 注意修改为了自己重写的QMainWindow类 MainWindow.setStyleSheet("#MainWindow{background-color:#C0E6FF}") # 设置背景颜色 ui = Ui_MainWindow() # 实例化ui类 ui.setupUi(MainWindow) # 设置窗口UI ui.center() # 调用方法使窗口居中 MainWindow.show() # 显示窗口 sys.exit(app.exec_()) # 当窗口创建完成时,需要结束主循环过程 if __name__ == "__main__": show_MainWindow()
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357# @Python : 3.13 # @FileName : 弹幕宠物修炼或猫猫养成练级脚本.py # @time : 2024/11/26 17:27 # @Author : Cooper from PyQt5 import QtCore, QtGui, QtWidgets from PyQt5.QtWidgets import QWidget import random import requests from PyQt5.QtCore import QThread, pyqtSignal import time import img_rc from PyQt5.QtWidgets import QDesktopWidget import sys from requests.exceptions import ReadTimeout, HTTPError, RequestException lis_text = ['喵', '贴贴', '猫猫冲撞', '修炼', 'boom', '签到'] lis_text2 = ['修仙', '突破', '打坐', '修炼', '签到'] a = 0 # 发送弹幕的次数 delay = 600 # 弹幕发送时间间隔 do_work = True # 弹幕是否发送标志位 do_work2 = True # 弹幕是否是第一次发送 do_work3 = True # 弹幕宠物修炼还是猫猫养成练级标志位 class QMainWindow(QtWidgets.QMainWindow): """对QMainWindow类重写,实现一些功能""" def closeEvent(self, event): """重写closeEvent方法,实现dialog窗体关闭时执行一些代码 :param event: close()触发的事件 :return: None """ print('这里2') reply = QtWidgets.QMessageBox.question(self, '本程序', "是否要退出程序?", QtWidgets.QMessageBox.Yes | QtWidgets.QMessageBox.No, QtWidgets.QMessageBox.No) if reply == QtWidgets.QMessageBox.Yes: global do_work do_work = False # 弹幕是否发送标志位 event.accept() else: event.ignore() class WorkerThread(QThread): # 定义一个信号,用于通知主线程任务完成 middle_signal = pyqtSignal(str) finished_signal = pyqtSignal() def run(self): # 耗时任务要放在线程中 try: while do_work: global a # 定义一个信号发送给主线程 self.middle_signal.emit(f"Thread: {a + 1}") print(f"Working... {a}") for i in range(delay): print(i) if not do_work: break time.sleep(1) # 任务完成后发射信号 self.finished_signal.emit() except Exception as e: print(e) self.finished_signal.emit() class Ui_MainWindow(QWidget): def setupUi(self, MainWindow): MainWindow.setObjectName("MainWindow") MainWindow.resize(555, 380) font = QtGui.QFont() font.setFamily("方正姚体简体") MainWindow.setFont(font) icon = QtGui.QIcon() icon.addPixmap(QtGui.QPixmap(":/jpg/Apple.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) MainWindow.setWindowIcon(icon) self.centralwidget = QtWidgets.QWidget(MainWindow) self.centralwidget.setStyleSheet("n" "#centralwidget{border-image: url(:/jpg/ironman.jpg);}") self.centralwidget.setObjectName("centralwidget") self.textBrowser = QtWidgets.QTextBrowser(self.centralwidget) self.textBrowser.setGeometry(QtCore.QRect(0, 75, 550, 230)) palette = QtGui.QPalette() brush = QtGui.QBrush(QtGui.QColor(170, 0, 0)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Text, brush) brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Base, brush) brush = QtGui.QBrush(QtGui.QColor(240, 60, 200)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Window, brush) brush = QtGui.QBrush(QtGui.QColor(170, 0, 0, 130)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.PlaceholderText, brush) brush = QtGui.QBrush(QtGui.QColor(170, 0, 0)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Text, brush) brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Base, brush) brush = QtGui.QBrush(QtGui.QColor(240, 60, 200)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Window, brush) brush = QtGui.QBrush(QtGui.QColor(170, 0, 0, 130)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.PlaceholderText, brush) brush = QtGui.QBrush(QtGui.QColor(120, 120, 120)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Text, brush) brush = QtGui.QBrush(QtGui.QColor(240, 60, 200)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Base, brush) brush = QtGui.QBrush(QtGui.QColor(240, 60, 200)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Window, brush) brush = QtGui.QBrush(QtGui.QColor(0, 0, 0, 130)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.PlaceholderText, brush) self.textBrowser.setPalette(palette) self.textBrowser.setAutoFillBackground(True) self.textBrowser.setObjectName("textBrowser") self.horizontalLayoutWidget = QtWidgets.QWidget(self.centralwidget) self.horizontalLayoutWidget.setGeometry(QtCore.QRect(0, 0, 550, 50)) self.horizontalLayoutWidget.setObjectName("horizontalLayoutWidget") self.horizontalLayout = QtWidgets.QHBoxLayout(self.horizontalLayoutWidget) self.horizontalLayout.setContentsMargins(0, 0, 0, 0) self.horizontalLayout.setObjectName("horizontalLayout") self.label = QtWidgets.QLabel(self.horizontalLayoutWidget) palette = QtGui.QPalette() brush = QtGui.QBrush(QtGui.QColor(170, 0, 0)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.WindowText, brush) brush = QtGui.QBrush(QtGui.QColor(170, 0, 0)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.WindowText, brush) brush = QtGui.QBrush(QtGui.QColor(120, 120, 120)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.WindowText, brush) self.label.setPalette(palette) font = QtGui.QFont() font.setFamily("方正北魏楷书简体") font.setPointSize(20) self.label.setFont(font) self.label.setObjectName("label") self.horizontalLayout.addWidget(self.label) self.lineEdit = QtWidgets.QLineEdit(self.horizontalLayoutWidget) self.lineEdit.setMaximumSize(QtCore.QSize(16777215, 16777215)) font = QtGui.QFont() font.setFamily("SimSun") font.setPointSize(15) self.lineEdit.setFont(font) self.lineEdit.setObjectName("lineEdit") self.lineEdit.setValidator(QtGui.QIntValidator()) # _____________________ self.label_2 = QtWidgets.QLabel(self.centralwidget) self.label_2.setGeometry(QtCore.QRect(0, 40, 200, 30)) palette = QtGui.QPalette() brush = QtGui.QBrush(QtGui.QColor(170, 0, 0)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.WindowText, brush) brush = QtGui.QBrush(QtGui.QColor(170, 0, 0)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.WindowText, brush) brush = QtGui.QBrush(QtGui.QColor(120, 120, 120)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.WindowText, brush) self.label_2.setPalette(palette) font = QtGui.QFont() font.setFamily("方正北魏楷书简体") font.setPointSize(16) self.label_2.setFont(font) self.label_2.setObjectName("label_2") self.lineEdit_2 = QtWidgets.QLineEdit(self.centralwidget) self.lineEdit_2.setGeometry(QtCore.QRect(202, 42, 348, 30)) self.lineEdit_2.setObjectName("lineEdit") font = QtGui.QFont() font.setFamily("SimSun") font.setPointSize(15) self.lineEdit_2.setFont(font) self.lineEdit_2.setObjectName("lineEdit") # 正则表达式匹配0-890的数 self.lineEdit_2.setValidator( QtGui.QRegExpValidator(QtCore.QRegExp("^(890|[1-7][0-9]{0,2}|[1-9][0-9]?|0|8[0-8][0-9])$"))) # _____________________ self.horizontalLayout.addWidget(self.lineEdit) self.pushButton = QtWidgets.QPushButton(self.centralwidget) self.pushButton.setGeometry(QtCore.QRect(40, 310, 90, 30)) icon1 = QtGui.QIcon() icon1.addPixmap(QtGui.QPixmap(":/jpg/登录 .png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.pushButton.setIcon(icon1) self.pushButton.setObjectName("pushButton") self.pushButton_2 = QtWidgets.QPushButton(self.centralwidget) self.pushButton_2.setGeometry(QtCore.QRect(300, 310, 90, 30)) icon2 = QtGui.QIcon() icon2.addPixmap(QtGui.QPixmap(":/jpg/退出.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.pushButton_2.setIcon(icon2) self.pushButton_2.setObjectName("pushButton_2") # self.pushButton_3 = QtWidgets.QPushButton(self.centralwidget) self.pushButton_3.setGeometry(QtCore.QRect(170, 310, 90, 30)) icon3 = QtGui.QIcon() icon3.addPixmap(QtGui.QPixmap(":/jpg/clear.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.pushButton_3.setIcon(icon3) self.pushButton_3.setObjectName("pushButton_3") self.label_3 = QtWidgets.QLabel(self.centralwidget) self.label_3.setGeometry(QtCore.QRect(410, 328, 150, 40)) palette = QtGui.QPalette() brush = QtGui.QBrush(QtGui.QColor(255, 85, 0)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.WindowText, brush) brush = QtGui.QBrush(QtGui.QColor(255, 85, 0)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.WindowText, brush) brush = QtGui.QBrush(QtGui.QColor(120, 120, 120)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.WindowText, brush) self.label_3.setPalette(palette) font = QtGui.QFont() font.setFamily("方正卡通简体") font.setPointSize(20) self.label_3.setFont(font) self.label_3.setObjectName("label_2") # 创建QGraphicsOpacityEffect对象 op = QtWidgets.QGraphicsOpacityEffect() op.setOpacity(1) # 0.5是透明度 self.textBrowser.setGraphicsEffect(op) self.textBrowser.setAutoFillBackground(True) self.radioButton = QtWidgets.QRadioButton(MainWindow) self.radioButton.setGeometry(QtCore.QRect(40, 350, 120, 30)) self.radioButton.setPalette(palette) self.radioButton.setChecked(True) self.radioButton.setObjectName("radioButton") self.radioButton_2 = QtWidgets.QRadioButton(MainWindow) self.radioButton_2.setGeometry(QtCore.QRect(300, 350, 120, 30)) self.radioButton_2.setPalette(palette) self.radioButton_2.setObjectName("radioButton_2") MainWindow.setCentralWidget(self.centralwidget) self.retranslateUi(MainWindow) # 按钮绑定任务 self.pushButton_2.clicked.connect(self.slot4) # type: ignore # self.pushButton.clicked.connect(self.label_2.clear) # type: ignore self.pushButton.clicked.connect(self.start_thread) # type: ignore # self.pushButton.clicked.connect(self.slot2) # type: ignore self.pushButton_3.clicked.connect(self.slot) # type: ignore # self.lineEdit.editingFinished.connect(self.label_3.clear) # type: ignore self.lineEdit.editingFinished.connect(self.slot2) # type: ignore self.lineEdit_2.editingFinished.connect(self.slot3) # type: ignore self.lineEdit_2.textChanged.connect(self.slot3) # type: ignore self.radioButton_2.toggled.connect(self.slot5) # type: ignore # 创建线程实例 self.thread = WorkerThread() # 连接信号到槽函数 self.thread.middle_signal.connect(self.on_middle) self.thread.finished_signal.connect(self.on_finished) QtCore.QMetaObject.connectSlotsByName(MainWindow) def retranslateUi(self, MainWindow): _translate = QtCore.QCoreApplication.translate MainWindow.setWindowTitle(_translate("MainWindow", "弹幕宠物修炼或猫猫养成练级脚本")) self.label.setText(_translate("MainWindow", "请输入房间号:")) self.pushButton.setText(_translate("MainWindow", "开始发送")) self.pushButton_2.setText(_translate("MainWindow", "停止发送")) self.pushButton_3.setText(_translate("MainWindow", "清空列表")) self.label_2.setText(_translate("MainWindow", "弹幕发送时间间隔:")) self.label_3.setText(_translate("MainWindow", "等待运行 !")) self.pushButton.setShortcut('ctrl+d') # 设置登录快捷键(设置一些功能的参数推荐放在当前的retranslateUi下) self.pushButton_2.setShortcut('Ctrl+q') # 设置退出快捷键 self.pushButton_3.setShortcut('Ctrl+s') # 设置退出快捷键 self.lineEdit.setText(_translate("MainWindow", "1769474447")) self.lineEdit_2.setText(_translate("MainWindow", str(delay))) self.radioButton.setText(_translate("Form", "弹幕宠物")) self.radioButton_2.setText(_translate("Form", "猫猫养成")) self.textBrowser.setHtml(_translate("MainWindow", "<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">n" "<html><head><meta name="qrichtext" content="1" /><style type="text/css">n" "p, li { white-space: pre-wrap; }n" "</style></head><body style=" font-family:'黑体'; font-size:12pt; font-weight:400; font-style:normal;">n" "<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">弹幕列表:</p></body></html>")) def slot(self, MainWindow): print('正在运行') # self.textBrowser.clear() self.textBrowser.setHtml( "<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">n" "<html><head><meta name="qrichtext" content="1" /><style type="text/css">n" "p, li { white-space: pre-wrap; }n" "</style></head><body style=" font-family:'黑体'; font-size:12pt; font-weight:400; font-style:normal;">n" "<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">弹幕列表:</p></body></html>") def slot2(self): print('房间号:', self.lineEdit.text()) def slot3(self): # 更新弹幕发送的延时时间 print(self.lineEdit_2.text()) global delay delay = int(self.lineEdit_2.text()) def slot4(self): # 停止发送 global do_work, do_work2 do_work = False do_work2 = False # 设置 QLabel 的样式表以改变字体颜色 self.label_3.setStyleSheet("color: red;") self.label_3.setText('等待运行!') def slot5(self): # 停止发送 print('slot5') global do_work3 do_work3 = not do_work3 if do_work3: self.lineEdit.setText('1769474447') else: self.lineEdit.setText('32534986') print(self.lineEdit.text()) def start_thread(self): global do_work do_work = True # 启动线程 self.label_3.setStyleSheet("color: yellow;") self.label_3.setText('正在运行!') self.thread.start() def on_middle(self, message): # 线程中间的处理 print("Thread middle") self.send() self.label.setText(message) def on_finished(self): # 线程完成后的处理 print("Thread finished!") self.label.setText("Thread finished!") def updateUi(self, message): try: text = ' ' message += text self.textBrowser.append("<pre><br> %s </br></pre>" % message) # 显示内容支撑html格式语法 except: self.textBrowser.append("<font color=red>%s is invalid!</font>" % message) def send(self): global a, do_work2 # print('do_work2:', do_work2) if (not a) | (not do_work2): # print('-'*100) if do_work3: send_meg = '修仙' else: send_meg = '喵' do_work2 = True else: if do_work3: send_meg = random.choice(lis_text2) else: send_meg = random.choice(lis_text) roomid = self.lineEdit.text() url = 'https://api.live.bilibili.com/msg/send' data = { 'bubble': '0', 'msg': send_meg, 'color': '16777215', 'mode': '1', 'fontsize': '50', 'rnd': '1726055988', 'roomid': '{}'.format(roomid), 'csrf': '9724432a18291d5b12dac35c809ac7ef', # 新账号需要改这里 'csrf_token': '9724432a18291d5b12dac35c809ac7ef', # 新账号需要改这里 } data2 = { 'bubble': '0', 'msg': send_meg, 'color': '16777215', 'mode': '1', 'fontsize': '50', 'rnd': '1724769083', 'roomid': '{}'.format(roomid), 'csrf': '59d7ac13d06cfb1f56af44eebc9a9941', # 新账号需要改这里 'csrf_token': '59d7ac13d06cfb1f56af44eebc9a9941', # 新账号需要改这里 } headers = { # 新账号需要改cookie # 'Cookie': "LIVE_BUVID=AUTO3516048326950470; buvid4=F5CB8C85-EEDA-07B6-0ADB-2ABB06DD39CE49140-022000211-YdCYHOtTw2Bn6Oi19MWYqg%3D%3D; rpdid=|(J~R)ulJk)u0J'uY~|J)~YYR; header_theme_version=CLOSE; home_feed_column=5; buvid3=4BCA90A2-9358-E481-15AE-497383D8CBC213436infoc; b_nut=1709956413; _uuid=EB811DB5-D10B1-10F58-1B102-EDEE10D4AC5F608283infoc; enable_web_push=DISABLE; FEED_LIVE_VERSION=V_DYN_LIVING_UP; buvid_fp_plain=undefined; fingerprint=13c9bc59234d5413350808d6341b65e8; is-2002-channel=1; CURRENT_BLACKGAP=0; CURRENT_FNVAL=4048; buvid_fp=13c9bc59234d5413350808d6341b65e8; browser_resolution=1874-939; DedeUserID=17648823; DedeUserID__ckMd5=9c54a0d0505112ab; Hm_lvt_8a6e55dbd2870f0f5bc9194cddf32a02=1724755652,1724950044; bili_ticket=eyJhbGciOiJIUzI1NiIsImtpZCI6InMwMyIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3MjYyMjI2ODYsImlhdCI6MTcyNTk2MzQyNiwicGx0IjotMX0.WfTZ3D5AiBmSrAC1e7GFYoEeu_q--HZoTrKANaZeyX0; bili_ticket_expires=1726222626; SESSDATA=381c5870%2C1741515493%2C1400a%2A91CjBm99GTeYTNHMC4ta63srvHW6SmQfzCbdZHtwCRefSuFenDNumOhdv0AZSLC77xBA4SVnNZNU12ZnNDME1RUFZKQlphQzRKcWtWeDdLVERYR1RpWno0RmMwLVp0Q1R2YUJwQ2x4OFlBSUpiVjktYVFXUTBIY2d6cTIyN2tsdHVpSC1TX0k4T3FBIIEC; bili_jct=4cb23f0382a5c1d8bda997b24f5be710; sid=860njx69; b_lsid=CAEEFC13_191E0F40007; PVID=2", 'Cookie': "buvid3=0A929476-B840-32B4-3F5C-3C6C0B162D4648875infoc; b_nut=1725698848; _uuid=E43FA16A-72C10-BA32-81010B-6DC10A197CABB51096infoc; buvid4=C8FA3BCA-213C-F996-DFE4-2123F12CD24451628-024090708-CWDZBzdYGHaDiK77MGDu0g%3D%3D; enable_web_push=DISABLE; header_theme_version=CLOSE; home_feed_column=5; browser_resolution=1872-909; LIVE_BUVID=AUTO5917277516958839; CURRENT_FNVAL=4048; rpdid=|(umRYkkJlYu0J'u~k~~lkYR|; DedeUserID=17648823; DedeUserID__ckMd5=9c54a0d0505112ab; fingerprint=43a705ca1a3b90fb189ed920a459f118; buvid_fp_plain=undefined; bili_ticket=eyJhbGciOiJIUzI1NiIsImtpZCI6InMwMyIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3MzI4MDQzMDQsImlhdCI6MTczMjU0NTA0NCwicGx0IjotMX0.w8reVlT_6Z6dwkgTUnlJljxzesDmATxTX699qjqQYkA; bili_ticket_expires=1732804244; SESSDATA=e472f8ff%2C1748097111%2C71c99%2Ab1CjAww1PHawpPhvi3muS4jtC4w0hfohLoINjbvOLvo6rNixMHQ39OYomIuf4AKWD0YZ8SVlZFTV9zbHZyS085UjhrTjVwODFhRzJVeDNmaUFiOEl3bXNnVnBiR2thcWNyT2luSHJma05zTGxYMzgwMW0yOUNFNFBCMDJhdWJYOWpXenprNDFNazBRIIEC; bili_jct=9724432a18291d5b12dac35c809ac7ef; buvid_fp=43a705ca1a3b90fb189ed920a459f118; b_lsid=AF7331010E_193679E5A40; match_float_version=ENABLE; sid=mfsfdabt; bp_t_offset_17648823=1004043223569530880; PVID=2; Hm_lvt_8a6e55dbd2870f0f5bc9194cddf32a02=1731407078,1732610479; Hm_lpvt_8a6e55dbd2870f0f5bc9194cddf32a02=1732610479; HMACCOUNT=B1D0AE8C1B766655", 'origin': 'https://live.bilibili.com', 'referer': 'https://live.bilibili.com/blanc/1029?liteVersion=true', 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36', } headers2 = { # 新账号需要改cookie 'Cookie': "LIVE_BUVID=AUTO2716289372509581; buvid3=0A947BA8-C8B5-9629-FC30-620F495459C292687infoc; b_nut=1717818992; _uuid=77CFE354-6B18-88EC-C5104-EF3C6B7CD32604481infoc; buvid4=EA97A437-6A1E-5D77-7EAA-41216E5EE70204642-024060803-uKTCo5OhsuB8ZPKGZhlC%2BA%3D%3D; CURRENT_FNVAL=4048; fingerprint=1e4715b5de92b6bfac1ad49838d7885a; buvid_fp_plain=undefined; buvid_fp=1e4715b5de92b6bfac1ad49838d7885a; DedeUserID=3546699602031082; DedeUserID__ckMd5=5fdb487ae63b2b9f; rpdid=|(J|~|Jkum|)0J'u~u)~mRRYu; bili_ticket=eyJhbGciOiJIUzI1NiIsImtpZCI6InMwMyIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3MjUwMTQxODQsImlhdCI6MTcyNDc1NDkyNCwicGx0IjotMX0.uYScHOUqdQ-wgoSzjsDHo1e4TV_d-DvnEW_WFfbv7FA; bili_ticket_expires=1725014124; SESSDATA=beb38df7%2C1740306987%2C6496e%2A82CjDHbd1etLnNbbSDUXzQwd-Ms9X3xygovQyFjekW5zYPIydQ6Hk4aQ9tdQX9WEtdmSUSVkhzNS1qbFJRUmRwLWg2YURCVHZZczNKeTNhQ09JUFctQkN0ZzlBbk1EY0pKazlINzZZamtua3pMaHRMTzMyUlNmM0tKeEpVT013UlVIZHlpWDhPY2VnIIEC; bili_jct=59d7ac13d06cfb1f56af44eebc9a9941; sid=f20hv94y; Hm_lvt_8a6e55dbd2870f0f5bc9194cddf32a02=1724755017,1724757169; bp_t_offset_3546699602031082=970557188923719680; b_lsid=59C948D8_1919F135EC8; PVID=2", 'origin': 'https://live.bilibili.com', 'referer': 'https://live.bilibili.com/blanc/1029?liteVersion=true', 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36', } a += 1 print(roomid) try: response = requests.post(url=url, data=data, headers=headers, timeout=10) response2 = requests.post(url=url, data=data2, headers=headers2, timeout=10) print('大号斯蒂芬', response, end='t') print('小号幻雪', response2) except HTTPError: print('httperror') self.updateUi( '第{}条弹幕发送失败, '.format(a) + '发送内容:{}, '.format(send_meg) + '错误原因:{}'.format( 'httperror')) except RequestException: print('reqerror') self.updateUi( '第{}条弹幕发送失败, '.format(a) + '发送内容:{}, '.format(send_meg) + '错误原因:{}'.format( 'reqerror')) except ReadTimeout: print('time out') self.updateUi( '第{}条弹幕发送失败, '.format(a) + '发送内容:{}, '.format(send_meg) + '错误原因:{}'.format( 'time out')) except Exception as e: print(e) self.updateUi( '第{}条弹幕发送失败, '.format(a) + '发送内容:{}, '.format(send_meg) + '错误原因:{}'.format(str(e))) else: self.updateUi('第{}条弹幕发送成功, '.format(a) + '发送内容:{}。 '.format(send_meg)) # 必须添加第二个类来继承添加窗口属性不然报错AttributeError: 'Ui_MainWindow' object has no attribute 'geometry' class Agent(Ui_MainWindow, QtWidgets.QWidget): def center(self): # 获得屏幕坐标系 screen = QDesktopWidget().screenGeometry() # 获得窗口坐标系 size = self.geometry() # 获得窗口相关坐标 newLeft = (screen.width() - size.width()) // 2 newTop = (screen.height() - size.height()) // 2 # 移动窗口使其居中 self.move(newLeft, newTop) class Ui_MainWindow(Agent): pass def show_MainWindow(): app = QtWidgets.QApplication(sys.argv) # 实例化QApplication类,作为GUI主程序入口 MainWindow = QMainWindow() # 注意修改为了自己重写的QMainWindow类 MainWindow.setStyleSheet("#MainWindow{background-color:#C0E6FF}") # 设置背景颜色 ui = Ui_MainWindow() # 实例化ui类 ui.setupUi(MainWindow) # 设置窗口UI ui.center() # 调用方法使窗口居中 MainWindow.show() # 显示窗口 sys.exit(app.exec_()) # 当窗口创建完成时,需要结束主循环过程 if __name__ == "__main__": show_MainWindow()
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468相关知识
「直播小技巧」教你使用B站弹幕姬 实时与观众互动!
B站宠物类视频弹幕为什么总有一个“伴侣动物保护法”? NGA玩家社区
我现在看b站萌宠类视频都要关弹幕,神经病太多了 NGA玩家社区
想养宠物?B站劝你冷静
文字版:B站分区规则(下)
探究B站“锤人区”:公民监督自治还是社群恐怖主义?
盘点B站萌宠达人TOP100
【直播回放】b站最甜鲨鱼宠物!? 2024年10月25日22点场
B站电商,须过三关
b站问题 求解答
网址: B站弹幕宠物练级脚本和B站猫猫养成练级脚本或者B站自动发弹幕(b站弹幕姬) https://m.mcbbbk.com/newsview835491.html
上一篇: 梦幻西游宠物修炼在哪里,梦幻西游 |
下一篇: 《问道》宠物心法修炼详解 |