fix: 优化查找媒体文件逻辑
This commit is contained in:
parent
20e4942249
commit
20b976587c
@ -68,7 +68,8 @@ argument-hint: "需要 media_type;可选 count,最多 5。media_type 可为
|
|||||||
4. 根据 `media_type` / `media_types` 查找图片、视频、语音,可一次查找多种类型。
|
4. 根据 `media_type` / `media_types` 查找图片、视频、语音,可一次查找多种类型。
|
||||||
5. 最多返回 5 条。脚本会先取最近匹配的 N 条,再按时间升序输出,因此第一条最早,最后一条最晚。
|
5. 最多返回 5 条。脚本会先取最近匹配的 N 条,再按时间升序输出,因此第一条最早,最后一条最晚。
|
||||||
6. 历史消息查询直接读取数据库 `messages` 表,不调用历史消息 HTTP 接口。
|
6. 历史消息查询直接读取数据库 `messages` 表,不调用历史消息 HTTP 接口。
|
||||||
7. 查到消息记录后,脚本必须先调用客户端下载接口下载媒体,再调用客户端上传接口上传到 CDN,最后只把 CDN URL 返回给智能体。
|
7. 如果消息记录的 `attachment_url` 不为空,直接使用该 URL。
|
||||||
|
8. 如果 `attachment_url` 为空,脚本必须先调用客户端下载接口下载媒体,再调用客户端上传接口上传到 CDN,最后只把 CDN URL 返回给智能体。
|
||||||
|
|
||||||
## 执行步骤
|
## 执行步骤
|
||||||
|
|
||||||
@ -91,8 +92,9 @@ python3 scripts/find_recent_chat_media.py --media_type image --count 1
|
|||||||
- `sender_wxid = ROBOT_SENDER_WX_ID`
|
- `sender_wxid = ROBOT_SENDER_WX_ID`
|
||||||
- `created_at` 在最近十分钟内
|
- `created_at` 在最近十分钟内
|
||||||
- `type` 为图片 `3`、语音 `34`、视频 `43`
|
- `type` 为图片 `3`、语音 `34`、视频 `43`
|
||||||
|
- `attachment_url` 不为空时直接作为媒体 URL 返回
|
||||||
|
|
||||||
脚本会调用以下客户端接口下载和上传媒体:
|
当 `attachment_url` 为空时,脚本会调用以下客户端接口下载和上传媒体:
|
||||||
|
|
||||||
- 下载图片:`GET http://127.0.0.1:{ROBOT_WECHAT_CLIENT_PORT}/api/v1/robot/chat/image/download?message_id=...`
|
- 下载图片:`GET http://127.0.0.1:{ROBOT_WECHAT_CLIENT_PORT}/api/v1/robot/chat/image/download?message_id=...`
|
||||||
- 下载视频:`GET http://127.0.0.1:{ROBOT_WECHAT_CLIENT_PORT}/api/v1/robot/chat/video/download?message_id=...`
|
- 下载视频:`GET http://127.0.0.1:{ROBOT_WECHAT_CLIENT_PORT}/api/v1/robot/chat/video/download?message_id=...`
|
||||||
|
|||||||
@ -296,7 +296,7 @@ def _fetch_history_media_messages(
|
|||||||
|
|
||||||
placeholders = ", ".join(["%s"] * len(message_types))
|
placeholders = ", ".join(["%s"] * len(message_types))
|
||||||
sql = f"""
|
sql = f"""
|
||||||
SELECT id, type, from_wxid, sender_wxid, created_at
|
SELECT id, type, from_wxid, sender_wxid, attachment_url, created_at
|
||||||
FROM messages
|
FROM messages
|
||||||
WHERE from_wxid = %s
|
WHERE from_wxid = %s
|
||||||
AND sender_wxid = %s
|
AND sender_wxid = %s
|
||||||
@ -405,11 +405,6 @@ def main() -> int:
|
|||||||
sys.stdout.write(f"参数格式错误: {exc}\n")
|
sys.stdout.write(f"参数格式错误: {exc}\n")
|
||||||
return 1
|
return 1
|
||||||
|
|
||||||
client_port = os.environ.get("ROBOT_WECHAT_CLIENT_PORT", "").strip()
|
|
||||||
if not client_port:
|
|
||||||
sys.stdout.write("环境变量 ROBOT_WECHAT_CLIENT_PORT 未配置\n")
|
|
||||||
return 1
|
|
||||||
|
|
||||||
from_wx_id = os.environ.get("ROBOT_FROM_WX_ID", "").strip()
|
from_wx_id = os.environ.get("ROBOT_FROM_WX_ID", "").strip()
|
||||||
if not from_wx_id:
|
if not from_wx_id:
|
||||||
sys.stdout.write("环境变量 ROBOT_FROM_WX_ID 未配置\n")
|
sys.stdout.write("环境变量 ROBOT_FROM_WX_ID 未配置\n")
|
||||||
@ -420,7 +415,6 @@ def main() -> int:
|
|||||||
sys.stdout.write("环境变量 ROBOT_SENDER_WX_ID 未配置\n")
|
sys.stdout.write("环境变量 ROBOT_SENDER_WX_ID 未配置\n")
|
||||||
return 1
|
return 1
|
||||||
|
|
||||||
base_url = _client_base_url(client_port)
|
|
||||||
end_time = int(time.time())
|
end_time = int(time.time())
|
||||||
start_time = end_time - HISTORY_MINUTES * 60
|
start_time = end_time - HISTORY_MINUTES * 60
|
||||||
|
|
||||||
@ -449,13 +443,24 @@ def main() -> int:
|
|||||||
items: list[dict[str, Any]] = []
|
items: list[dict[str, Any]] = []
|
||||||
urls_by_type: dict[str, list[str]] = {"image": [], "video": [], "voice": []}
|
urls_by_type: dict[str, list[str]] = {"image": [], "video": [], "voice": []}
|
||||||
try:
|
try:
|
||||||
|
client_port = ""
|
||||||
|
base_url = ""
|
||||||
for message in selected_messages:
|
for message in selected_messages:
|
||||||
message_id = _to_int(message.get("id"))
|
message_id = _to_int(message.get("id"))
|
||||||
media_type = str(message.get("media_type") or "")
|
media_type = str(message.get("media_type") or "")
|
||||||
if message_id <= 0 or media_type not in MEDIA_MESSAGE_TYPES:
|
if message_id <= 0 or media_type not in MEDIA_MESSAGE_TYPES:
|
||||||
continue
|
continue
|
||||||
|
|
||||||
|
media_url = str(message.get("attachment_url") or "").strip()
|
||||||
|
if not media_url:
|
||||||
|
if not client_port:
|
||||||
|
client_port = os.environ.get("ROBOT_WECHAT_CLIENT_PORT", "").strip()
|
||||||
|
if not client_port:
|
||||||
|
raise RuntimeError("环境变量 ROBOT_WECHAT_CLIENT_PORT 未配置")
|
||||||
|
base_url = _client_base_url(client_port)
|
||||||
data, filename, content_type, extension = _download_media(base_url, message_id, media_type)
|
data, filename, content_type, extension = _download_media(base_url, message_id, media_type)
|
||||||
media_url = _upload_media(base_url, message_id, media_type, data, filename, content_type, extension)
|
media_url = _upload_media(base_url, message_id, media_type, data, filename, content_type, extension)
|
||||||
|
|
||||||
urls_by_type[media_type].append(media_url)
|
urls_by_type[media_type].append(media_url)
|
||||||
items.append(
|
items.append(
|
||||||
{
|
{
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user