Skip to content

Commit

Permalink
Merge pull request #5 from Ailitonia/dev
Browse files Browse the repository at this point in the history
B站相关插件优化
  • Loading branch information
Ailitonia committed Feb 8, 2021
2 parents 5446af7 + ed3c95a commit bd838a1
Show file tree
Hide file tree
Showing 10 changed files with 228 additions and 89 deletions.
1 change: 1 addition & 0 deletions .env.dev
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ SESSION_EXPIRE_TIMEOUT=60

# B站相关插件Cookie配置(可选)
# 强烈建议您正确配置此项, 否则B站动态及直播间监控很可能被B站风控限制!
BILI_UID=
BILI_SESSDATA=
BILI_CSRF=

Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@

## 当前适配nonebot2版本

[Nonebot2 PreRelease v2.0.0a9](https://github.com/nonebot/nonebot2/releases/tag/v2.0.0a9)
[Nonebot2 PreRelease v2.0.0a9.post1](https://github.com/nonebot/nonebot2/releases/tag/v2.0.0a9.post1)

## 配套使用的api

Expand Down
2 changes: 1 addition & 1 deletion omega_miya/plugins/Omega_help/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ async def handle_first_receive(bot: Bot, event: GroupMessageEvent, state: T_Stat
else:
# 如果用户没有发送参数, 则发送功能列表并结束此命令
plugins_list = '\n'.join(p.export.custom_name for p in plugins)
await bot_help.finish(f'我现在支持的插件有: \n\n{plugins_list}\n\n输入"/help [插件]"即可查看对应帮助')
await bot_help.finish(f'我现在支持的插件有: \n\n{plugins_list}\n\n注意: 群组权限等级未达到要求的命令不会被响应\n输入"/help [插件]"即可查看插件详情及帮助')


@bot_help.got('plugin_name', prompt='你想查询哪个插件的用法呢?')
Expand Down
51 changes: 31 additions & 20 deletions omega_miya/plugins/bilibili_dynamic_monitor/monitor.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
from nonebot import logger, require, get_bots
from nonebot.adapters.cqhttp import MessageSegment
from omega_miya.utils.Omega_Base import DBSubscription, DBDynamic, DBTable
from .utils import get_dynamic_info, get_user_info, get_user_dynamic, pic_2_base64
from .utils import get_user_dynamic_history, get_user_info, get_user_dynamic, get_dynamic_info, pic_2_base64


# 启用检查动态状态的定时任务
Expand Down Expand Up @@ -86,7 +86,7 @@ async def bilibili_dynamic_monitor():
async def check_dynamic(dy_uid):
# 获取动态并返回动态类型及内容
try:
_res = await get_dynamic_info(dy_uid=dy_uid)
_res = await get_user_dynamic_history(dy_uid=dy_uid)
if not _res.success():
logger.error(f'bilibili_dynamic_monitor: 获取动态失败, uid: {dy_uid}, error: {_res.info}')
return
Expand Down Expand Up @@ -117,27 +117,38 @@ async def check_dynamic(dy_uid):
logger.info(f"用户: {dy_uid}/{dynamic_info[num]['name']} 新动态: {dynamic_info[num]['id']}")
# 转发的动态
if dynamic_info[num]['type'] == 1:
# 原动态type=2, 带图片
if dynamic_info[num]['origin']['type'] == 2:
# 处理图片序列
pic_segs = ''
for pic_url in dynamic_info[num]['origin']['origin_pics']:
_res = await pic_2_base64(pic_url)
pic_b64 = _res.result
pic_segs += f'{MessageSegment.image(pic_b64)}\n'
msg = '{}转发了{}的动态!\n\n“{}”\n{}\n{}\n@{}: {}\n{}'.format(
dynamic_info[num]['name'], dynamic_info[num]['origin']['name'],
dynamic_info[num]['content'], dynamic_info[num]['url'], '=' * 16,
dynamic_info[num]['origin']['name'], dynamic_info[num]['origin']['content'],
pic_segs
)
# 原动态为其他类型, 无图
else:
# 获取原动态信息
origin_dynamic_id = dynamic_info[num]['origin']
_dy_res = await get_dynamic_info(dynamic_id=origin_dynamic_id)
if not _dy_res.success():
msg = '{}转发了{}的动态!\n\n“{}”\n{}\n{}\n@{}: {}'.format(
dynamic_info[num]['name'], dynamic_info[num]['origin']['name'],
dynamic_info[num]['name'], 'Unknown',
dynamic_info[num]['content'], dynamic_info[num]['url'], '=' * 16,
dynamic_info[num]['origin']['name'], dynamic_info[num]['origin']['content']
'Unknown', '获取原动态失败'
)
else:
origin_dynamic_info = _dy_res.result
# 原动态type=2, 带图片
if origin_dynamic_info['type'] == 2:
# 处理图片序列
pic_segs = ''
for pic_url in origin_dynamic_info['origin_pics']:
_res = await pic_2_base64(pic_url)
pic_b64 = _res.result
pic_segs += f'{MessageSegment.image(pic_b64)}\n'
msg = '{}转发了{}的动态!\n\n“{}”\n{}\n{}\n@{}: {}\n{}'.format(
dynamic_info[num]['name'], origin_dynamic_info['name'],
dynamic_info[num]['content'], dynamic_info[num]['url'], '=' * 16,
origin_dynamic_info['name'], origin_dynamic_info['content'],
pic_segs
)
# 原动态为其他类型, 无图
else:
msg = '{}转发了{}的动态!\n\n“{}”\n{}\n{}\n@{}: {}'.format(
dynamic_info[num]['name'], origin_dynamic_info['name'],
dynamic_info[num]['content'], dynamic_info[num]['url'], '=' * 16,
origin_dynamic_info['name'], origin_dynamic_info['content']
)
for group_id in notice_group:
for _bot in bots:
try:
Expand Down
125 changes: 70 additions & 55 deletions omega_miya/plugins/bilibili_dynamic_monitor/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
global_config = nonebot.get_driver().config
BILI_SESSDATA = global_config.bili_sessdata
BILI_CSRF = global_config.bili_csrf
BILI_UID = global_config.bili_uid


def check_bili_cookies() -> Result:
Expand Down Expand Up @@ -41,8 +42,8 @@ async def fetch_json(url: str, paras: dict = None) -> Result:
'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://space.bilibili.com',
'referer': 'https://space.bilibili.com/'}
'origin': 'https://t.bilibili.com',
'referer': 'https://t.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)
Expand All @@ -68,7 +69,8 @@ async def get_image(pic_url: str):
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/'}
'origin': 'https://t.bilibili.com',
'referer': 'https://t.bilibili.com/'}
async with session.get(url=pic_url, headers=headers, timeout=timeout) as resp:
_res = await resp.read()
return _res
Expand Down Expand Up @@ -128,10 +130,14 @@ def get_user_dynamic(user_id: int) -> Result:


# 查询动态并返回动态类型及内容
async def get_dynamic_info(dy_uid) -> Result:
async def get_user_dynamic_history(dy_uid) -> Result:
_DYNAMIC_INFO = {} # 这个字典用来放最后的输出结果
url = DYNAMIC_API_URL
payload = {'host_uid': dy_uid}
if BILI_UID:
payload = {'visitor_uid': BILI_UID, 'host_uid': dy_uid,
'offset_dynamic_id': 0, 'need_top': 0, 'platform': 'web'}
else:
payload = {'host_uid': dy_uid, 'offset_dynamic_id': 0, 'need_top': 0, 'platform': 'web'}

result = await fetch_json(url=url, paras=payload)
if not result.success():
Expand Down Expand Up @@ -168,55 +174,10 @@ async def get_dynamic_info(dy_uid) -> Result:
name = cards['desc']['user_profile']['info']['uname']
# 这是转发动态时评论的内容
content = card['item']['content']
# 这是被转发的原动态信息
try:
origin_dy_uid = cards['desc']['origin']['dynamic_id']
__payload = {'dynamic_id': origin_dy_uid}

result = await fetch_json(url=GET_DYNAMIC_DETAIL_API_URL, paras=__payload)
origin_dynamic = dict(result.result)
origin_card = origin_dynamic['data']['card']
origin_name = origin_card['desc']['user_profile']['info']['uname']
origin_pics_list = []
if origin_card['desc']['type'] == 1:
origin_description = json.loads(origin_card['card'])['item']['content']
elif origin_card['desc']['type'] == 2:
origin_description = json.loads(origin_card['card'])['item']['description']
origin_pics = json.loads(origin_card['card'])['item']['pictures']
for item in origin_pics:
try:
origin_pics_list.append(item['img_src'])
except (KeyError, TypeError):
continue
elif origin_card['desc']['type'] == 4:
origin_description = json.loads(origin_card['card'])['item']['content']
elif origin_card['desc']['type'] == 8:
origin_description = json.loads(origin_card['card'])['dynamic']
if not origin_description:
origin_description = json.loads(origin_card['card'])['title']
elif origin_card['desc']['type'] == 16:
origin_description = json.loads(origin_card['card'])['item']['description']
elif origin_card['desc']['type'] == 32:
origin_description = json.loads(origin_card['card'])['title']
elif origin_card['desc']['type'] == 64:
origin_description = json.loads(origin_card['card'])['summary']
elif origin_card['desc']['type'] == 256:
origin_description = json.loads(origin_card['card'])['intro']
elif origin_card['desc']['type'] == 512:
origin_description = json.loads(origin_card['card'])['apiSeasonInfo']['title']
elif origin_card['desc']['type'] == 2048:
origin_description = json.loads(origin_card['card'])['vest']['content']
else:
origin_description = ''
origin = dict({'id': origin_dy_uid, 'type': origin_card['desc']['type'], 'url': '',
'name': origin_name, 'content': origin_description, 'origin': '',
'origin_pics': origin_pics_list})
except Exception as e:
# 原动态被删除
origin = dict({'id': -1, 'type': -1, 'url': '',
'name': 'Unknow', 'content': '原动态被删除', 'origin': repr(e)})
# 这是被转发的原动态id
origin_dynamic_id = cards['desc']['origin']['dynamic_id']
card_dic = dict({'id': dy_id, 'type': 1, 'url': url,
'name': name, 'content': content, 'origin': origin})
'name': name, 'content': content, 'origin': origin_dynamic_id})
_DYNAMIC_INFO[card_num] = card_dic
# type=2, 这是一条原创的动态(有图片)
elif cards['desc']['type'] == 2:
Expand Down Expand Up @@ -352,23 +313,77 @@ async def get_dynamic_info(dy_uid) -> Result:
dy_id = cards['desc']['dynamic_id']
# 这是动态的链接
url = DYNAMIC_URL + str(cards['desc']['dynamic_id'])
name = 'Unknow'
name = 'Unknown'
card_dic = dict({'id': dy_id, 'type': -1, 'url': url,
'name': name, 'content': '', 'origin': ''})
_DYNAMIC_INFO[card_num] = card_dic
return Result(error=False, info='Success', result=_DYNAMIC_INFO)


async def get_dynamic_info(dynamic_id) -> Result:
__payload = {'dynamic_id': dynamic_id}
_res = await fetch_json(url=GET_DYNAMIC_DETAIL_API_URL, paras=__payload)
if not _res.success():
return _res
else:
try:
origin_dynamic = dict(_res.result)
origin_card = origin_dynamic['data']['card']
origin_name = origin_card['desc']['user_profile']['info']['uname']
origin_pics_list = []
if origin_card['desc']['type'] == 1:
origin_description = json.loads(origin_card['card'])['item']['content']
elif origin_card['desc']['type'] == 2:
origin_description = json.loads(origin_card['card'])['item']['description']
origin_pics = json.loads(origin_card['card'])['item']['pictures']
for item in origin_pics:
try:
origin_pics_list.append(item['img_src'])
except (KeyError, TypeError):
continue
elif origin_card['desc']['type'] == 4:
origin_description = json.loads(origin_card['card'])['item']['content']
elif origin_card['desc']['type'] == 8:
origin_description = json.loads(origin_card['card'])['dynamic']
if not origin_description:
origin_description = json.loads(origin_card['card'])['title']
elif origin_card['desc']['type'] == 16:
origin_description = json.loads(origin_card['card'])['item']['description']
elif origin_card['desc']['type'] == 32:
origin_description = json.loads(origin_card['card'])['title']
elif origin_card['desc']['type'] == 64:
origin_description = json.loads(origin_card['card'])['summary']
elif origin_card['desc']['type'] == 256:
origin_description = json.loads(origin_card['card'])['intro']
elif origin_card['desc']['type'] == 512:
origin_description = json.loads(origin_card['card'])['apiSeasonInfo']['title']
elif origin_card['desc']['type'] == 2048:
origin_description = json.loads(origin_card['card'])['vest']['content']
else:
origin_description = ''
origin = dict({'id': dynamic_id, 'type': origin_card['desc']['type'], 'url': '',
'name': origin_name, 'content': origin_description, 'origin': '',
'origin_pics': origin_pics_list})
result = Result(error=False, info='Success', result=origin)
except Exception as e:
# 原动态被删除
origin = dict({'id': dynamic_id, 'type': -1, 'url': '',
'name': 'Unknown', 'content': '原动态被删除', 'origin': repr(e)})
result = Result(error=True, info='Dynamic not found', result=origin)
return result


__all__ = [
'pic_2_base64',
'get_user_info',
'get_user_dynamic',
'get_user_dynamic_history',
'get_dynamic_info'
]

if __name__ == '__main__':
import asyncio

loop = asyncio.get_event_loop()
res = loop.run_until_complete(get_dynamic_info(dy_uid=846180))
res = loop.run_until_complete(get_user_dynamic_history(dy_uid=846180))
print(res)
Loading

0 comments on commit bd838a1

Please sign in to comment.