From 6dc3fd354e4de5d58fcb09f24f0801727fbba403 Mon Sep 17 00:00:00 2001 From: Ailitonia Date: Sun, 10 Jan 2021 18:04:34 +0800 Subject: [PATCH] fix bug MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 修复订阅B站动态及直播间时不能添加数据库中没有的订阅的错误 - 调整直播间提醒,不发送网页链接 - 修正表情包制作文字为正确位置 --- .../bilibili_dynamic_monitor/__init__.py | 10 +++- .../plugins/bilibili_dynamic_monitor/utils.py | 10 ++-- .../plugins/bilibili_live_monitor/__init__.py | 10 +++- .../plugins/bilibili_live_monitor/monitor.py | 18 +++++-- .../plugins/bilibili_live_monitor/utils.py | 49 ++++++++++++++++++- .../sticker_maker/utils/default_render.py | 2 +- 6 files changed, 86 insertions(+), 13 deletions(-) diff --git a/omega_miya/plugins/bilibili_dynamic_monitor/__init__.py b/omega_miya/plugins/bilibili_dynamic_monitor/__init__.py index a20fe5ab..4d25872c 100644 --- a/omega_miya/plugins/bilibili_dynamic_monitor/__init__.py +++ b/omega_miya/plugins/bilibili_dynamic_monitor/__init__.py @@ -92,6 +92,7 @@ async def handle_uid(bot: Bot, event: Event, state: T_State): logger.error(f'获取用户信息失败, uid: {uid}, error: {_res.info}') await bilibili_dynamic.finish('获取用户信息失败了QAQ, 请稍后再试~') up_name = _res.result.get('name') + state['up_name'] = up_name msg = f'即将{sub_command}【{up_name}】的动态!' await bilibili_dynamic.send(msg) @@ -115,7 +116,8 @@ async def handle_check(bot: Bot, event: Event, state: T_State): logger.info(f"{sub_command}动态成功, group_id: {event.dict().get('group_id')}, uid: {uid}") await bilibili_dynamic.finish(f'{sub_command}成功!') else: - logger.error(f"{sub_command}动态失败, group_id: {event.dict().get('group_id')}, uid: {uid}") + logger.error(f"{sub_command}动态失败, group_id: {event.dict().get('group_id')}, uid: {uid}," + f"info: {_res.info}") await bilibili_dynamic.finish(f'{sub_command}失败了QAQ, 可能并未订阅该用户, 或请稍后再试~') @@ -137,7 +139,11 @@ async def sub_add(bot: Bot, event: Event, state: T_State) -> Result: group_id = event.dict().get('group_id') group = DBGroup(group_id=group_id) uid = state['uid'] - _res = group.subscription_add(sub=DBSubscription(sub_type=2, sub_id=uid)) + sub = DBSubscription(sub_type=2, sub_id=uid) + _res = sub.add(up_name=state.get('up_name'), live_info='动态') + if not _res.success(): + return _res + _res = group.subscription_add(sub=sub) if not _res.success(): return _res result = Result(error=False, info='Success', result=0) diff --git a/omega_miya/plugins/bilibili_dynamic_monitor/utils.py b/omega_miya/plugins/bilibili_dynamic_monitor/utils.py index 9f8c65ff..8a43f183 100644 --- a/omega_miya/plugins/bilibili_dynamic_monitor/utils.py +++ b/omega_miya/plugins/bilibili_dynamic_monitor/utils.py @@ -36,9 +36,13 @@ async def fetch_json(url: str, paras: dict = None) -> Result: try: timeout = aiohttp.ClientTimeout(total=10) async with aiohttp.ClientSession(timeout=timeout) as session: - headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) ' + headers = {'accept': 'application/json, text/plain, */*', + 'accept-encoding': 'gzip, deflate, br', + 'accept-language:': 'zh-CN,zh;q=0.9', + 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) ' 'AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36', - 'referer': 'https://www.bilibili.com/'} + 'origin': 'https://space.bilibili.com', + 'referer': 'https://space.bilibili.com/'} async with session.get(url=url, params=paras, headers=headers, cookies=cookies, timeout=timeout) as rp: _json = await rp.json() result = Result(error=False, info='Success', result=_json) @@ -362,9 +366,9 @@ async def get_dynamic_info(dy_uid) -> Result: 'get_dynamic_info' ] - if __name__ == '__main__': import asyncio + loop = asyncio.get_event_loop() res = loop.run_until_complete(get_dynamic_info(dy_uid=846180)) print(res) diff --git a/omega_miya/plugins/bilibili_live_monitor/__init__.py b/omega_miya/plugins/bilibili_live_monitor/__init__.py index 8518ea62..b66ffeae 100644 --- a/omega_miya/plugins/bilibili_live_monitor/__init__.py +++ b/omega_miya/plugins/bilibili_live_monitor/__init__.py @@ -98,6 +98,7 @@ async def handle_room_id(bot: Bot, event: Event, state: T_State): logger.error(f'获取直播间信息失败, room_id: {room_id}, error: {_res.info}') await bilibili_live.finish('获取直播间信息失败了QAQ, 请稍后再试~') up_name = _res.result.get('name') + state['up_name'] = up_name msg = f'即将{sub_command}【{up_name}】的直播间!' await bilibili_live.send(msg) @@ -121,7 +122,8 @@ async def handle_check(bot: Bot, event: Event, state: T_State): logger.info(f"{sub_command}直播间成功, group_id: {event.dict().get('group_id')}, room_id: {room_id}") await bilibili_live.finish(f'{sub_command}成功!') else: - logger.error(f"{sub_command}直播间失败, group_id: {event.dict().get('group_id')}, room_id: {room_id}") + logger.error(f"{sub_command}直播间失败, group_id: {event.dict().get('group_id')}, room_id: {room_id}," + f"info: {_res.info}") await bilibili_live.finish(f'{sub_command}失败了QAQ, 可能并未订阅该用户, 或请稍后再试~') @@ -143,7 +145,11 @@ async def sub_add(bot: Bot, event: Event, state: T_State) -> Result: group_id = event.dict().get('group_id') group = DBGroup(group_id=group_id) room_id = state['room_id'] - _res = group.subscription_add(sub=DBSubscription(sub_type=1, sub_id=room_id)) + sub = DBSubscription(sub_type=1, sub_id=room_id) + _res = sub.add(up_name=state.get('up_name'), live_info='直播间') + if not _res.success(): + return _res + _res = group.subscription_add(sub=sub) if not _res.success(): return _res # 添加直播间时需要刷新全局监控列表 diff --git a/omega_miya/plugins/bilibili_live_monitor/monitor.py b/omega_miya/plugins/bilibili_live_monitor/monitor.py index 53704146..26c0d405 100644 --- a/omega_miya/plugins/bilibili_live_monitor/monitor.py +++ b/omega_miya/plugins/bilibili_live_monitor/monitor.py @@ -1,7 +1,8 @@ import asyncio from nonebot import logger, require, get_driver, get_bots +from nonebot.adapters.cqhttp import MessageSegment from omega_miya.utils.Omega_Base import DBSubscription, DBTable -from .utils import get_live_info, get_user_info, verify_cookies +from .utils import get_live_info, get_user_info, pic_2_base64, verify_cookies # 初始化直播间标题, 状态 @@ -170,7 +171,12 @@ async def check_live(room_id: int): logger.info(f"直播间: {room_id}/{up_name} 标题变更为: {live_info['title']}") elif live_info['status'] == 1 and live_info['title'] != live_title[room_id]: # 通知有通知权限且订阅了该直播间的群 - msg = f"{up_name}的直播间换标题啦!\n\n【{live_info['title']}】\n{live_info['url']}" + cover_pic = await pic_2_base64(url=live_info.get('cover_img')) + if cover_pic.success(): + msg = f"{up_name}的直播间换标题啦!\n\n【{live_info['title']}】\n{MessageSegment.image(cover_pic.result)}" + else: + # msg = f"{up_name}的直播间换标题啦!\n\n【{live_info['title']}】\n{live_info['url']}" + msg = f"{up_name}的直播间换标题啦!\n\n【{live_info['title']}】" for group_id in notice_group: for _bot in bots: try: @@ -207,7 +213,13 @@ async def check_live(room_id: int): logger.info(f"开播记录: LiveStart! Room: {room_id}/{up_name}, Title: {live_info['title']}, " f"TrueTime: {live_info['time']}") - msg = f"{live_info['time']}\n{up_name}开播啦!\n\n【{live_info['title']}】\n{live_info['url']}" + cover_pic = await pic_2_base64(url=live_info.get('cover_img')) + if cover_pic.success(): + msg = f"{live_info['time']}\n{up_name}开播啦!\n\n【{live_info['title']}】" \ + f"\n{MessageSegment.image(cover_pic.result)}" + else: + # msg = f"{live_info['time']}\n{up_name}开播啦!\n\n【{live_info['title']}】\n{live_info['url']}" + msg = f"{live_info['time']}\n{up_name}开播啦!\n\n【{live_info['title']}】" for group_id in notice_group: for _bot in bots: try: diff --git a/omega_miya/plugins/bilibili_live_monitor/utils.py b/omega_miya/plugins/bilibili_live_monitor/utils.py index 22b52387..a6d199fe 100644 --- a/omega_miya/plugins/bilibili_live_monitor/utils.py +++ b/omega_miya/plugins/bilibili_live_monitor/utils.py @@ -1,5 +1,7 @@ import aiohttp import nonebot +import base64 +from io import BytesIO from omega_miya.utils.Omega_Base import Result LIVE_API_URL = 'https://api.live.bilibili.com/room/v1/Room/get_info' @@ -32,8 +34,12 @@ async def fetch_json(url: str, paras: dict = None) -> Result: try: timeout = aiohttp.ClientTimeout(total=10) async with aiohttp.ClientSession(timeout=timeout) as session: - headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) ' + headers = {'accept': 'application/json, text/plain, */*', + 'accept-encoding': 'gzip, deflate, br', + 'accept-language:': 'zh-CN,zh;q=0.9', + 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) ' 'AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36', + 'origin': 'https://www.bilibili.com', 'referer': 'https://www.bilibili.com/'} async with session.get(url=url, params=paras, headers=headers, cookies=cookies, timeout=timeout) as rp: _json = await rp.json() @@ -49,6 +55,43 @@ async def fetch_json(url: str, paras: dict = None) -> Result: return result +# 图片转base64 +async def pic_2_base64(url: str) -> Result: + async def get_image(pic_url: str): + timeout_count = 0 + error_info = '' + while timeout_count < 3: + try: + timeout = aiohttp.ClientTimeout(total=10) + async with aiohttp.ClientSession(timeout=timeout) as session: + headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) ' + 'AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36', + 'referer': 'https://www.bilibili.com/'} + async with session.get(url=pic_url, headers=headers, timeout=timeout) as resp: + _res = await resp.read() + return _res + except Exception as _e: + error_info += f'{repr(_e)} Occurred in pic_2_base64 trying {timeout_count + 1} using paras: {pic_url}\n' + finally: + timeout_count += 1 + else: + error_info += f'Failed too many times in pic_2_base64 using paras: {pic_url}' + return None + + origin_image_f = BytesIO() + try: + origin_image_f.write(await get_image(pic_url=url)) + except Exception as e: + result = Result(error=True, info=f'pic_2_base64 error: {repr(e)}', result='') + return result + b64 = base64.b64encode(origin_image_f.getvalue()) + b64 = str(b64, encoding='utf-8') + b64 = 'base64://' + b64 + origin_image_f.close() + result = Result(error=False, info='Success', result=b64) + return result + + # 获取直播间信息 async def get_live_info(room_id) -> Result: url = LIVE_API_URL @@ -64,7 +107,8 @@ async def get_live_info(room_id) -> Result: 'url': LIVE_URL + str(room_id), 'title': live_info['data']['title'], 'time': live_info['data']['live_time'], - 'uid': live_info['data']['uid'] + 'uid': live_info['data']['uid'], + 'cover_img': live_info['data']['user_cover'] } result = Result(error=False, info='Success', result=_res) except Exception as e: @@ -111,6 +155,7 @@ async def verify_cookies() -> Result: __all__ = [ 'get_live_info', 'get_user_info', + 'pic_2_base64', 'verify_cookies' ] diff --git a/omega_miya/plugins/sticker_maker/utils/default_render.py b/omega_miya/plugins/sticker_maker/utils/default_render.py index c0207ee8..f6c52110 100644 --- a/omega_miya/plugins/sticker_maker/utils/default_render.py +++ b/omega_miya/plugins/sticker_maker/utils/default_render.py @@ -91,7 +91,7 @@ def stick_maker_temp_whitebg(text: str, image_file: bytes, font_path: str, image font = ImageFont.truetype(font_path, font_size) text_w, text_h = font.getsize_multiline(text) # 计算居中文字位置 - text_coordinate = (((background_w - text_w) // 2), background_h - 100) + text_coordinate = (((background_w - text_w) // 2), image_height + ((100 - text_h) // 2)) draw.multiline_text(text_coordinate, text, font=font, fill=(0, 0, 0))