diff --git a/channel/chat_channel.py b/channel/chat_channel.py index 4aa17be..42530ab 100644 --- a/channel/chat_channel.py +++ b/channel/chat_channel.py @@ -241,7 +241,7 @@ class ChatChannel(Channel): reply.content = reply_text elif reply.type == ReplyType.ERROR or reply.type == ReplyType.INFO: reply.content = "[" + str(reply.type) + "]\n" + reply.content - elif reply.type == ReplyType.IMAGE_URL or reply.type == ReplyType.VOICE or reply.type == ReplyType.IMAGE: + elif reply.type == ReplyType.IMAGE_URL or reply.type == ReplyType.VOICE or reply.type == ReplyType.IMAGE or reply.type == ReplyType.FILE or reply.type == ReplyType.VIDEO or reply.type == ReplyType.VIDEO_URL: pass else: logger.error("[WX] unknown reply type: {}".format(reply.type)) diff --git a/channel/wechat/wechat_channel.py b/channel/wechat/wechat_channel.py index 33bce43..be7fbe2 100644 --- a/channel/wechat/wechat_channel.py +++ b/channel/wechat/wechat_channel.py @@ -210,3 +210,24 @@ class WechatChannel(ChatChannel): image_storage.seek(0) itchat.send_image(image_storage, toUserName=receiver) logger.info("[WX] sendImage, receiver={}".format(receiver)) + elif reply.type == ReplyType.FILE: # 新增文件回复类型 + file_storage = reply.content + itchat.send_file(file_storage, toUserName=receiver) + logger.info("[WX] sendFile, receiver={}".format(receiver)) + elif reply.type == ReplyType.VIDEO: # 新增视频回复类型 + video_storage = reply.content + itchat.send_video(video_storage, toUserName=receiver) + logger.info("[WX] sendFile, receiver={}".format(receiver)) + elif reply.type == ReplyType.VIDEO_URL: # 新增视频URL回复类型 + video_url = reply.content + logger.debug(f"[WX] start download video, video_url={video_url}") + video_res = requests.get(video_url, stream=True) + video_storage = io.BytesIO() + size = 0 + for block in video_res.iter_content(1024): + size += len(block) + video_storage.write(block) + logger.info(f"[WX] download video success, size={size}, video_url={video_url}") + video_storage.seek(0) + itchat.send_video(video_storage, toUserName=receiver) + logger.info("[WX] sendVideo url={}, receiver={}".format(video_url, receiver)) diff --git a/plugins/keyword/keyword.py b/plugins/keyword/keyword.py index 2dc87ff..87cd054 100644 --- a/plugins/keyword/keyword.py +++ b/plugins/keyword/keyword.py @@ -2,7 +2,7 @@ import json import os - +import requests import plugins from bridge.context import ContextType from bridge.reply import Reply, ReplyType @@ -51,15 +51,37 @@ class Keyword(Plugin): content = e_context["context"].content.strip() logger.debug("[keyword] on_handle_context. content: %s" % content) if content in self.keyword: - logger.debug(f"[keyword] 匹配到关键字【{content}】") + logger.info(f"[keyword] 匹配到关键字【{content}】") reply_text = self.keyword[content] # 判断匹配内容的类型 - if (reply_text.startswith("http://") or reply_text.startswith("https://")) and any(reply_text.endswith(ext) for ext in [".jpg", ".jpeg", ".png", ".gif", ".webp"]): - # 如果是以 http:// 或 https:// 开头,且.jpg/.jpeg/.png/.gif结尾,则认为是图片 URL + if (reply_text.startswith("http://") or reply_text.startswith("https://")) and any(reply_text.endswith(ext) for ext in [".jpg", ".jpeg", ".png", ".gif", ".img"]): + # 如果是以 http:// 或 https:// 开头,且".jpg", ".jpeg", ".png", ".gif", ".img"结尾,则认为是图片 URL。 reply = Reply() reply.type = ReplyType.IMAGE_URL reply.content = reply_text + + elif (reply_text.startswith("http://") or reply_text.startswith("https://")) and any(reply_text.endswith(ext) for ext in [".pdf", ".doc", ".docx", ".xls", "xlsx",".zip", ".rar"]): + # 如果是以 http:// 或 https:// 开头,且".pdf", ".doc", ".docx", ".xls", "xlsx",".zip", ".rar"结尾,则下载文件到tmp目录并发送给用户 + file_path = "tmp" + if not os.path.exists(file_path): + os.makedirs(file_path) + file_name = reply_text.split("/")[-1] # 获取文件名 + file_path = os.path.join(file_path, file_name) + response = requests.get(reply_text) + with open(file_path, "wb") as f: + f.write(response.content) + #channel/wechat/wechat_channel.py和channel/wechat_channel.py中缺少ReplyType.FILE类型。 + reply = Reply() + reply.type = ReplyType.FILE + reply.content = file_path + + elif (reply_text.startswith("http://") or reply_text.startswith("https://")) and any(reply_text.endswith(ext) for ext in [".mp4"]): + # 如果是以 http:// 或 https:// 开头,且".mp4"结尾,则下载视频到tmp目录并发送给用户 + reply = Reply() + reply.type = ReplyType.VIDEO_URL + reply.content = reply_text + else: # 否则认为是普通文本 reply = Reply() @@ -68,7 +90,7 @@ class Keyword(Plugin): e_context["reply"] = reply e_context.action = EventAction.BREAK_PASS # 事件结束,并跳过处理context的默认逻辑 - + def get_help_text(self, **kwargs): help_text = "关键词过滤" return help_text