Skip to content

Commit fe27f93

Browse files
committed
feat(Utils): 支持发送图片URL及频道图片处理
- 在 `MediaPayload` 中新增 `url` 字段用于存储媒体链接 - 在 `AutoReplyPayload` 和 `MessageSenderBasePayload` 中新增 `image` 字段,支持通过 URL 发送图片 - 新增 `set_image` 方法用于设置图片 URL - 更新 `GuildMessageEvent.reply` 方法,支持通过 `media.url` 设置图片 - 修改 `send_auto_reply` 函数,支持传递 image 字段 - 更新 `upload_file` 函数,针对频道/频私场景直接返回原图片 URL,不再上传 - 更新文档注释,明确 image 参数仅适用于频道或频道私信场景 - 更新版本号至 2.1.0+13020 - 添加 `python-multipart` 依赖以支持文件处理 Signed-off-by: Shanshui2024 <[email protected]>
1 parent ce9c5b2 commit fe27f93

File tree

3 files changed

+28
-5
lines changed

3 files changed

+28
-5
lines changed

pyproject.toml

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[project]
22
name = "AxTBot-Public"
3-
version = "2.1.0+13010"
3+
version = "2.1.0+13020"
44
description = "AxTBot 社区机器人是由 AxT社区 开发并维护的公共、公益性QQ官方机器人,基于QQ开放平台 ,使用 Python 和 FastAPI 构建"
55
authors = [
66
{name = "Shanshui2024", email = "[email protected]"},
@@ -13,7 +13,8 @@ dependencies = [
1313
"pydantic==2.11.7","pydantic-core==2.33.2","PyNaCl==1.5.0","pypika-tortoise==0.6.1",
1414
"pyreadline3==3.5.4","pytz==2025.2","PyYAML==6.0.2","questionary==2.1.0","sniffio==1.3.1",
1515
"starlette==0.47.2","tortoise-orm==0.25.1","typing-inspection==0.4.1","typing-extensions==4.14.1",
16-
"uvicorn==0.35.0","wcwidth==0.2.13","requests", "tomli", "aiohttp"
16+
"uvicorn==0.35.0","wcwidth==0.2.13","requests", "tomli", "aiohttp",
17+
"python-multipart"
1718
]
1819
requires-python = ">=3.8"
1920
readme = "README.md"

src/Utils/EventClass.py

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -380,6 +380,7 @@ def __init__(self, payload: Optional[Dict] = None):
380380
self.file_info: str = self._payload.get('file_info', '')
381381
self.ttl: int = self._payload.get('ttl', 0)
382382
self.id: str = self._payload.get('id', '')
383+
self.url: str = self._payload.get('url', '')
383384

384385
def to_dict(self) -> Dict[str, Any]:
385386
if not self.file_info: return None
@@ -439,6 +440,7 @@ def __init__(self, event, is_direct_message = False):
439440
self.markdown: MarkdownPayload = None
440441
self.ark: ArkPayload = None
441442
self.media: MediaPayload = None
443+
self.image = None
442444
self.event_id: str = None
443445

444446
def set_content(self, content):
@@ -456,6 +458,9 @@ def set_ark(self, ark: ArkPayload = None):
456458
def set_media(self, media: MediaPayload = None):
457459
self.media = media
458460
return self
461+
def set_image(self, image: str = None):
462+
self.image = image
463+
return self
459464

460465

461466
class MessageSenderBasePayload:
@@ -474,6 +479,7 @@ def __init__(self, payload: Union[Dict[str, Any], str] = None):
474479
:param payload.keyboard: 按钮消息体
475480
:param payload.ark: Ark消息体
476481
:param payload.media: 媒体消息体
482+
:param payload.image: 图片URL(仅适用于频道/频私发送图片)
477483
478484
Powered by [AxTn Network](https://www.axtrk.com) 2023-2025
479485
"""
@@ -494,6 +500,7 @@ def __init__(self, payload: Union[Dict[str, Any], str] = None):
494500
self.keyboard: KeyboardPayload = KeyboardPayload(self._raw_data.get('keyboard'))
495501
self.ark: ArkPayload = ArkPayload(self._raw_data.get('ark'))
496502
self.media: MediaPayload = MediaPayload(self._raw_data.get('media'))
503+
self.image: str = self._raw_data.get('image', '')
497504

498505
def to_dict(self) -> Dict[str, Any]:
499506
"""将对象转换为字典"""
@@ -514,6 +521,8 @@ def to_dict(self) -> Dict[str, Any]:
514521
result['ark'] = self.ark.to_dict()
515522
if self.media.file_uuid:
516523
result['media'] = self.media.to_dict()
524+
if self.image:
525+
result['image'] = self.image
517526

518527
return result
519528

@@ -542,13 +551,15 @@ def mentions(self) -> List[AttrDict]:
542551
def is_direct_message(self) -> bool:
543552
"""是否是私信消息"""
544553
return self.t == "DIRECT_MESSAGE_CREATE"
545-
async def reply(self, content: str, markdown: MarkdownPayload = None, msg_id: str = None, ark: ArkPayload = None):
554+
async def reply(self, content: str, markdown: MarkdownPayload = None, msg_id: str = None, ark: ArkPayload = None, media: MediaPayload = None):
546555
"""快捷回复方法"""
547556
auto_payload = AutoReplyPayload(self, self.t == "DIRECT_MESSAGE_CREATE").set_content(content)
548557
if markdown:
549558
auto_payload.set_markdown(markdown)
550559
if ark:
551560
auto_payload.set_ark(ark)
561+
if media.url:
562+
auto_payload.set_image(media.url)
552563
from src.Utils.MessageSender import send_auto_reply
553564
await send_auto_reply(auto_payload)
554565

src/Utils/MessageSender.py

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -249,6 +249,8 @@ async def send_auto_reply(payload: AutoReplyPayload) -> None:
249249
if payload.media:
250250
base_payload.media = payload.media
251251
base_payload.msg_type = 7
252+
if payload.image:
253+
base_payload.image = payload.image
252254
if payload.group_id:
253255
if payload.markdown or payload.ark:
254256
base_payload.content = " "
@@ -275,9 +277,14 @@ async def upload_file(payload: MediaUploadPayload):
275277
"""上传文件至QQ服务器,返回文件信息
276278
277279
:param payload: MediaUploadPayload 上传文件的负载
278-
:return: dict or None 上传成功返回文件,失败返回None
280+
:return dict: 文件信息 or None
281+
:return url: 传入原url 用于处理频道图片
279282
280-
详见:https://bot.q.qq.com/wiki/develop/api-v2/server-inter/message/send-receive/rich-media.html
283+
---
284+
285+
详见:
286+
- 群聊/私聊:https://bot.q.qq.com/wiki/develop/api-v2/server-inter/message/send-receive/rich-media.html
287+
- 频道/频私:https://bot.q.qq.com/wiki/develop/api-v2/server-inter/message/post_messages.html
281288
282289
Powered by AxTn Network 2023-2025
283290
"""
@@ -286,6 +293,10 @@ async def upload_file(payload: MediaUploadPayload):
286293
url = open_url + f"/v2/groups/{payload.event.group_id}/files"
287294
elif payload.event.event_type == "私信":
288295
url = open_url + f"/v2/users/{payload.event.user_id}/files"
296+
elif payload.event.event_type in ["频道艾特", "私域频道", "频道私信"]:
297+
url = payload.url # 频道图片上传使用原url
298+
return MediaPayload({"url": payload.url})
299+
289300
else:
290301
logger.error(f"上传文件失败: 不支持的消息类型 {payload.event.event_type}")
291302
return None

0 commit comments

Comments
 (0)