diff --git a/GenshinUID/__init__.py b/GenshinUID/__init__.py
index 11cf894e..07569711 100644
--- a/GenshinUID/__init__.py
+++ b/GenshinUID/__init__.py
@@ -1,6 +1,11 @@
+import os
import re
-from typing import Any, List, Literal, Optional
+import asyncio
+from pathlib import Path
+from base64 import b64encode
+from typing import Any, List, Union, Literal, Optional
+import aiofiles
from nonebot.log import logger
from nonebot.adapters import Bot
from nonebot.matcher import Matcher
@@ -66,6 +71,7 @@ async def get_notice_message(bot: Bot, ev: Event):
val = raw_data['file']['url']
name = raw_data['file']['name']
message = [Message('file', f'{name}|{val}')]
+ # onebot_v11
else:
return
@@ -150,19 +156,6 @@ async def send_char_adv(bot: Bot, ev: Event):
group_id = None
user_id = raw_data['author_id']
msg_id = raw_data['message_id']
- # ntchat
- elif 'data' in raw_data and 'from_wxid' in raw_data['data']:
- messages = raw_data['message']
- msg_id = str(raw_data['data']['msgid'])
- if (
- 'raw_msg' in raw_data['data']
- and 'xml' in raw_data['data']['raw_msg']
- ):
- match = re.search(
- r'(\d+)', raw_data['data']['raw_msg']
- )
- if match:
- message.append(Message('reply', match.group(1)))
# onebot
elif 'sender' in raw_data:
if raw_data['sender'].role == 'owner':
@@ -186,31 +179,62 @@ async def send_char_adv(bot: Bot, ev: Event):
user_id = raw_data['event'].sender.sender_id.union_id
msg_id = str(raw_data['event'].message.message_id)
# ntchat
- if 'data' in raw_data:
+ elif 'data' in raw_data:
if 'chatroom' in raw_data['data']['to_wxid']:
group_id = raw_data['data']['to_wxid']
if 'image' in raw_data['data']:
message.append(Message('image', raw_data['data']['image']))
if 'from_wxid' in raw_data['data']:
user_id = raw_data['data']['from_wxid']
+ messages = raw_data['message']
+ msg_id = str(raw_data['data']['msgid'])
+ if (
+ 'raw_msg' in raw_data['data']
+ and 'xml' in raw_data['data']['raw_msg']
+ ):
+ match = re.search(
+ r'(\d+)', raw_data['data']['raw_msg']
+ )
+ if match:
+ message.append(Message('reply', match.group(1)))
if 'at_user_list' in raw_data['data']:
_at_list = raw_data['data']['at_user_list']
if _at_list:
at_list = [Message('at', i) for i in _at_list]
at_list.pop(0)
message.extend(at_list)
+ if 'type' in raw_data and raw_data['type'] == 11055:
+ val = raw_data['file']
+ name = raw_data['file_name']
+ await asyncio.sleep(2)
+ if (
+ os.path.exists(val)
+ and os.path.getsize(val) <= 5 * 1024 * 1024
+ and str(name).endswith(".json")
+ ):
+ message.append(await convert_file(val, name)) # type: ignore
# OneBot V12 (仅在 ComWechatClient 测试)
if bot.adapter.get_name() == 'OneBot V12':
# v12msgid = raw_data['id'] # V12的消息id
- # time = raw_data['time'] # 返回格式 2023-04-01 16:38:51+00:00
-
- messages = raw_data['original_message']
# self = raw_data['self'] # 返回 platform='xxx' user_id='wxid_xxxxx'
# platform = self.platform # 机器人平台
+ # V12还支持频道等其他平台,速速Pr!
+
+ messages = raw_data['original_message'] # 消息
self_id = bot.self_id # 机器人账号ID
msg_id = raw_data['message_id'] # 消息ID
sp_bot_id = 'onebot_v12'
+ if 'alt_message' in raw_data and '[文件]' in raw_data['alt_message']:
+ file_id = messages[0].data.get('file_id')
+ print('[OB12文件ID]', file_id)
+ if file_id in messages[0].data.values():
+ data = await get_file(bot, file_id)
+ print('[OB12文件]', data)
+ name = data['name']
+ path = data['path']
+ message.append(await convert_file(path, name))
+
if 'group_id' in raw_data:
group_id = raw_data['group_id']
user_id = raw_data['user_id']
@@ -218,7 +242,6 @@ async def send_char_adv(bot: Bot, ev: Event):
else:
user_id = raw_data['user_id']
sp_user_type = 'direct'
- # V12还支持频道等其他平台,速速Pr!
if sp_bot_id:
bot_id = sp_bot_id
@@ -299,7 +322,7 @@ def convert_message(_msg: Any, message: List[Message]):
file_id = _msg.data.get('file_id')
if file_id in _msg.data.values():
message.append(Message('image', _msg.data['file_id']))
- logger.debug(_msg.data["file_id"])
+ logger.debug('[OB12图片]', _msg.data["file_id"])
else:
message.append(Message('image', _msg.data['url']))
elif _msg.type == 'at':
@@ -314,3 +337,32 @@ def convert_message(_msg: Any, message: List[Message]):
if 'user_id' in _msg.data:
message.append(Message('at', _msg.data['user_id']))
return message
+
+
+# 读取文件为base64
+async def convert_file(
+ content: Union[Path, str, bytes], file_name: str
+) -> Message:
+ if isinstance(content, Path):
+ print(content)
+ async with aiofiles.open(str(content), 'rb') as fp:
+ file = await fp.read()
+ elif isinstance(content, bytes):
+ file = content
+ else:
+ async with aiofiles.open(content, 'rb') as fp:
+ file = await fp.read()
+ return Message(
+ type='file',
+ data=f'{file_name}|{b64encode(file).decode()}',
+ )
+
+
+# 获取文件
+async def get_file(bot: Bot, file_id: str):
+ data = await bot.call_api(
+ api="get_file",
+ file_id=f"{file_id}",
+ type="path",
+ )
+ return data