From 1f26a41d520957981528c15ce39cf1455daed68a Mon Sep 17 00:00:00 2001 From: msm8976 Date: Sat, 30 Nov 2024 16:44:17 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=AF=8F=E6=97=A5=E8=A7=82?= =?UTF-8?q?=E7=9C=8B=E5=A4=A7=E4=BA=8E=E7=AD=89=E4=BA=8E20=E7=BA=A7?= =?UTF-8?q?=E7=9A=84=E9=85=8D=E7=BD=AE=E9=80=89=E9=A1=B9=EF=BC=8C=E9=BB=98?= =?UTF-8?q?=E8=AE=A4=E5=85=B3=E9=97=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 当前逻辑会导致大于等于20级的粉丝牌每点亮3天熄灭1天:第四天发送弹幕时由第一天弹幕点亮的牌子还未熄灭,熄灭后只能由第五天的弹幕进行点亮。可以通过每日观看至少5分钟直播来续期3天的CD,但可能导致运行过长时间,默认关闭。 --- main.py | 2 ++ src/user.py | 32 ++++++++++++++++++++++++++------ users.example.yaml | 3 +++ 3 files changed, 31 insertions(+), 6 deletions(-) diff --git a/main.py b/main.py index 4ed8f088..456ab9a0 100644 --- a/main.py +++ b/main.py @@ -31,6 +31,7 @@ assert users["DANMAKU_CD"] >= 0, "DANMAKU_CD参数错误" assert users["WATCHINGLIVE"] >= 0, "WATCHINGLIVE参数错误" assert users["WEARMEDAL"] in [0, 1], "WEARMEDAL参数错误" + assert users.get("WATCHINGALL", 0) in [0, 1], "WATCHINGALL参数错误" config = { "ASYNC": users["ASYNC"], "LIKE_CD": users["LIKE_CD"], @@ -40,6 +41,7 @@ "WEARMEDAL": users["WEARMEDAL"], "SIGNINGROUP": users.get("SIGNINGROUP", 2), "PROXY": users.get("PROXY"), + "WATCHINGALL": users.get("WATCHINGALL", 0), } except Exception as e: log.error(f"读取配置文件失败,请检查配置文件格式是否正确: {e}") diff --git a/src/user.py b/src/user.py index 24f06d69..5ee720da 100644 --- a/src/user.py +++ b/src/user.py @@ -32,6 +32,7 @@ def __init__(self, access_token: str, whiteUIDs: str = '', bannedUIDs: str = '', self.config = config self.medals = [] # 用户所有勋章 self.medalsNeedDo = [] # 用户所有勋章,等级小于20的 未满1500的 + self.medalsOthers = [] # 剩余勋章,仅观看直播 self.session = ClientSession(timeout=ClientTimeout(total=3), trust_env = True) self.api = BiliApi(self, self.session) @@ -83,6 +84,7 @@ async def getMedals(self): """ self.medals.clear() self.medalsNeedDo.clear() + self.medalsOthers.clear() async for medal in self.api.getFansMedalandRoomID(): if self.whiteList == [0]: if medal['medal']['target_id'] in self.bannedList: @@ -95,8 +97,9 @@ async def getMedals(self): self.log.success(f"{medal['anchor_info']['nick_name']} 在白名单中,加入任务") [ self.medalsNeedDo.append(medal) - for medal in self.medals if medal['medal']['level'] < 20 and medal['medal']['today_feed'] < 1500 + else self.medalsOthers.append(medal) + for medal in self.medals ] async def like_v3(self, failedMedals: list = []): @@ -204,11 +207,14 @@ async def sendmsg(self): return self.message + self.errmsg await self.getMedals() nameList1, nameList2, nameList3, nameList4 = [], [], [], [] + unlightList = [] for medal in self.medals: - if medal['medal']['level'] >= 20: - continue today_feed = medal['medal']['today_feed'] nick_name = medal['anchor_info']['nick_name'] + if not medal['medal']['is_lighted']: + unlightList.append(nick_name) + if medal['medal']['level'] >= 20: + continue if today_feed >= 1500: nameList1.append(nick_name) elif 1200 <= today_feed < 1500: @@ -217,11 +223,11 @@ async def sendmsg(self): nameList3.append(nick_name) elif today_feed < 300: nameList4.append(nick_name) - self.message.append(f"【{self.name}】 今日亲密度获取情况如下(20级以下):") + self.message.append(f"【{self.name}】 今日亲密度获取情况如下:") for l, n in zip( - [nameList1, nameList2, nameList3, nameList4], - ["【1500】", "【1200至1500】", "【300至1200】", "【300以下】"], + [nameList1, nameList2, nameList3, nameList4, unlightList], + ["【1500】", "【1200至1500】", "【300至1200】", "【300以下】", "【未点亮】"], ): if len(l) > 0: self.message.append(f"{n}" + ' '.join(l[:5]) + f"{'等' if len(l) > 5 else ''}" + f' {len(l)}个') @@ -250,6 +256,7 @@ async def watchinglive(self): return HEART_MAX = self.config['WATCHINGLIVE'] self.log.log("INFO", f"每日{HEART_MAX}分钟任务开始") + self.log.log("INFO", f"预计共需运行{HEART_MAX*len(self.medalsNeedDo)+5*self.config['WATCHINGALL']*len(self.medalsOthers)}分钟") n = 0 for medal in self.medalsNeedDo: n += 1 @@ -264,6 +271,19 @@ async def watchinglive(self): ) await asyncio.sleep(60) self.log.log("SUCCESS", f"每日{HEART_MAX}分钟任务完成") + if not self.config['WATCHINGALL']: + self.log.log("INFO", "大于等于20级每日观看直播任务关闭") + return + n = 0 + for medal in self.medalsOthers: + n += 1 + for heartNum in range(5): + tasks = [] + tasks.append(self.api.heartbeat(medal['room_info']['room_id'], medal['medal']['target_id'])) + await asyncio.gather(*tasks) + await asyncio.sleep(60) + self.log.log("INFO",f"{medal['anchor_info']['nick_name']} 5次心跳包已发送({n}/{len(self.medalsOthers)})") + self.log.log("SUCCESS", f"大于等于20级每日观看任务完成") async def signInGroups(self): if not self.config['SIGNINGROUP']: diff --git a/users.example.yaml b/users.example.yaml index 869deee2..463d1787 100644 --- a/users.example.yaml +++ b/users.example.yaml @@ -30,6 +30,9 @@ DANMAKU_CD: 6 # 弹幕间隔时间,单位秒,默认6秒,设置为0则不发弹 WATCHINGLIVE: 25 # 每日每直播间观看时长,单位 min ,设置为0则关闭, 默认 25 分钟 # 总观看时长为未满20级牌子数*每直播间观看时长 +WATCHINGALL: 0 # 是否观看大于等于20级牌子直播间,来保持粉丝牌持续点亮状态,默认关闭,设置为1则开启 +# 所需观看时长为大于等于20级牌子数*5分钟,关闭时大于等于20级粉丝牌会每点亮3天熄灭1天 + WEARMEDAL: 0 # 是否弹幕打卡时自动带上当前房间的粉丝牌,避免房间有粉丝牌等级禁言,默认关闭,设置为1则开启 SIGNINGROUP: 0 # 应援团签到CD时间,单位秒,默认2秒,设置为0则不签到