diff --git a/db/message_storage.py b/db/message_storage.py index c71e2e8..1497f9a 100644 --- a/db/message_storage.py +++ b/db/message_storage.py @@ -181,13 +181,13 @@ class MessageStorageDB(BaseDBOperator): 'messages': messages } - def update_message_image_path(self, message_id, image_path): + def update_message_image_path(self, message_id, image_base64str): """ 更新消息的图片路径 Args: message_id: 消息ID - image_path: 图片路径 + image_base64str: 图片base64内容 Returns: bool: 更新成功返回True,否则返回False @@ -196,10 +196,10 @@ class MessageStorageDB(BaseDBOperator): # 构建SQL语句 sql = """ UPDATE messages - SET image_path = %s + SET message_thumb = %s WHERE message_id = %s """ - params = (image_path, message_id) + params = (image_base64str, message_id) # 执行更新操作 result = self.execute_update(sql, params) diff --git a/robot.py b/robot.py index c3292bb..79062f1 100644 --- a/robot.py +++ b/robot.py @@ -414,8 +414,8 @@ class Robot(Job): try: self.message_storage.archive_message(message) # 单独处理图片消息 后续写定时任务自动完成下载。延时处理。 - # if message.msg_type == MessageType.IMAGE: # 图片消息类型 - # self.message_storage.process_image(message) + if message.msg_type == MessageType.IMAGE: # 图片消息类型 + self.message_storage.process_image(message) except Exception as e: self.LOG.error(f"archive_message error: {e}") diff --git a/utils/wechat/message_to_db.py b/utils/wechat/message_to_db.py index f4a3685..113adc4 100644 --- a/utils/wechat/message_to_db.py +++ b/utils/wechat/message_to_db.py @@ -1,3 +1,4 @@ +import asyncio import time from datetime import datetime, timedelta import xml.etree.ElementTree as ET @@ -112,44 +113,32 @@ class MessageStorage: try: # 使用wcf下载图片,确保图片存在 if self.client and msg.msg_id: - # 创建按群ID或个人wxid分割的目录 - target_dir = os.path.join(self.image_dir, msg.roomid if msg.roomid else msg.sender) - # 确保目标目录存在 - if not os.path.exists(target_dir): - os.makedirs(target_dir, exist_ok=True) - # 尝试使用wcf下载图片到分组后的目录 - # json = self.client.download_image(msg.appid, msg.content.xml_content, 2) - # # { - # # "ret": 200, - # # "msg": "操作成功", - # # "data": { - # # "fileUrl": "/download/20240720/wx_BTVoJ_o_r6DpxNCNiycFE/0ca5b675-8e2c-4dc1-b288-3c44a40086ec4" - # # } - # # } - # # 解析JSON http://192.168.2.240:2532/download/20250428/wx_3BC6eSHGE5xEm_hH3__7c/03ab5c03-5524-4a39-aabe-27ca014a4d1e.png - # if json and json.get('data') and json['data'].get('fileUrl'): - # file_url = json['data']['fileUrl'] - # if file_url: - # logger.info(f"记录gewe服务端图片路径成功: {msg.msg_id} -> {file_url}") - # # 后续如果需要使用,则去服务器端提取图片 - # # 直接使用下载后的路径更新数据库 - # self.message_db.update_message_image_path(msg.msg_id, file_url) - # - # return { - # 'success': True, - # 'message_id': msg.msg_id, - # 'roomid': msg.roomid, - # 'sender': msg.sender, - # 'file_path': file_url - # } - # else: - # return { - # 'success': False, - # 'message_id': msg.msg_id, - # 'roomid': msg.roomid, - # 'sender': msg.sender, - # 'error': "图片下载失败" - # } + # 从msg中提取xml内容,获取xml里面的参数 + xml_content = msg.content.clean_content + + root = ET.fromstring(xml_content) + img_elem = root.find("img") + if img_elem is not None: + aeskey = img_elem.attrib.get("aeskey", "") + cdnthumburl = img_elem.attrib.get("cdnthumburl", "") + base64_str = asyncio.run(self.client.download_image(aeskey=aeskey, cdnmidimgurl=cdnthumburl)) + if base64_str: + self.message_db.update_message_image_path(msg.msg_id, "data:image/png;base64," + base64_str) + return { + 'success': True, + 'message_id': msg.msg_id, + 'roomid': msg.roomid, + 'sender': msg.sender, + 'file_path': base64_str + } + else: + return { + 'success': False, + 'message_id': msg.msg_id, + 'roomid': msg.roomid, + 'sender': msg.sender, + 'error': "图片下载失败" + } else: return { 'success': False, diff --git a/wechat_ipad/client/tools.py b/wechat_ipad/client/tools.py index ab46c91..b916197 100644 --- a/wechat_ipad/client/tools.py +++ b/wechat_ipad/client/tools.py @@ -33,12 +33,12 @@ class ToolMixin(WechatAPIClientBase): raise UserLoggedOut("请先登录") async with aiohttp.ClientSession() as session: - json_param = {"Wxid": self.wxid, "AesKey": aeskey, "Cdnmidimgurl": cdnmidimgurl} + json_param = {"Wxid": self.wxid, "FileAesKey": aeskey, "FileNo": cdnmidimgurl} response = await session.post(f'http://{self.ip}:{self.port}/api/Tools/CdnDownloadImage', json=json_param) json_resp = await response.json() if json_resp.get("Success"): - return json_resp.get("Data") + return json_resp.get("Data").get("Image") else: self.error_handler(json_resp)