diff --git a/README.md b/README.md index b7dd42d..7f6cdf1 100644 --- a/README.md +++ b/README.md @@ -28,7 +28,7 @@ MoviePilot三方插件市场:https://github.com/thsrite/MoviePilot-Plugins/ - [短剧刮削 3.2](docs%2FShortPlayMonitor.md) - 云盘实时监控 2.1 - 源文件恢复 1.2 -- [微信消息转发 2.4](docs%2FWeChatForward.md) +- [微信消息转发 2.5](docs%2FWeChatForward.md) - 订阅下载统计 1.5 - [自定义命令 1.7](docs%2FCustomCommand.md) - docker自定义任务 1.3 diff --git a/package.json b/package.json index 92c2919..fd6d2ac 100644 --- a/package.json +++ b/package.json @@ -282,11 +282,12 @@ "name": "微信消息转发", "description": "根据正则转发通知到其他WeChat应用。", "labels": "消息通知", - "version": "2.4", + "version": "2.5", "icon": "Wechat_A.png", "author": "thsrite", "level": 1, "history": { + "v2.5": "增强额外消息发送", "v2.4": "修复配置修改后不重建缓存bug", "v2.3": "增加重建缓存,丰富转发历史", "v2.2": "增加消息发送历史", diff --git a/plugins/wechatforward/__init__.py b/plugins/wechatforward/__init__.py index d39578b..8ce0736 100644 --- a/plugins/wechatforward/__init__.py +++ b/plugins/wechatforward/__init__.py @@ -5,7 +5,6 @@ from datetime import datetime from app.core.config import settings from app.db.subscribe_oper import SubscribeOper -from app.modules.wechat import WeChat from app.plugins import _PluginBase from app.core.event import eventmanager from app.schemas.types import EventType, MessageChannel, MediaType @@ -22,7 +21,7 @@ class WeChatForward(_PluginBase): # 插件图标 plugin_icon = "Wechat_A.png" # 插件版本 - plugin_version = "2.4" + plugin_version = "2.5" # 插件作者 plugin_author = "thsrite" # 作者主页 @@ -56,7 +55,9 @@ class WeChatForward(_PluginBase): "corpid": "", "appsecret": "", "pattern": "已入库", - "extra_confs": [], + "extra_confs": [ + + ], }, { "remark": "站点签到数据统计", @@ -201,7 +202,7 @@ class WeChatForward(_PluginBase): "pattern": pattern, "extra_confs": extra_confs, } - logger.info(f"WeChat配置 {remark} token请求成功") + logger.info(f"WeChat配置 {remark} 配置成功:{self._wechat_token_pattern_confs[appid]}") if self._rebuild: self._rebuild = False @@ -637,29 +638,29 @@ class WeChatForward(_PluginBase): wechat_conf = self._wechat_token_pattern_confs.get(wechat_appid) if not wechat_conf or not wechat_conf.get("pattern"): continue + # 匹配正则 - if not re.search(wechat_conf.get("pattern"), title): - continue + if re.search(wechat_conf.get("pattern"), title): + # 忽略userid + if self._ignore_userid and re.search(self._ignore_userid, title): + userid = None + else: + # 特定消息指定用户 + userid = self.__specify_userid(title=title, text=text, userid=userid) - # 忽略userid - if self._ignore_userid and re.search(self._ignore_userid, title): - userid = None - else: - # 特定消息指定用户 - userid = self.__specify_userid(title=title, text=text, userid=userid) + access_token = self.__flush_access_token(appid=wechat_appid) + if not access_token: + logger.error("未获取到有效token,请检查配置") + continue - access_token = self.__flush_access_token(appid=wechat_appid) - if not access_token: - logger.error("未获取到有效token,请检查配置") - continue - - # 发送消息 - if image: - self.__send_image_message(title=title, text=text, image_url=image, userid=userid, - access_token=wechat_conf.get("access_token"), appid=wechat_appid) - else: - self.__send_message(title=title, text=text, userid=userid, access_token=wechat_conf.get("access_token"), - appid=wechat_appid) + # 发送消息 + if image: + self.__send_image_message(title=title, text=text, image_url=image, userid=userid, + access_token=wechat_conf.get("access_token"), appid=wechat_appid) + else: + self.__send_message(title=title, text=text, userid=userid, + access_token=wechat_conf.get("access_token"), + appid=wechat_appid) # 发送额外消息 # 开始下载 > userid > {name} 后台下载任务已提交,请耐心等候入库通知。 > appid @@ -667,6 +668,7 @@ class WeChatForward(_PluginBase): if wechat_conf.get("extra_confs"): self.__send_extra_msg(wechat_appid=wechat_appid, extra_confs=wechat_conf.get("extra_confs"), + access_token=wechat_conf.get("access_token"), title=title, text=text) @@ -691,7 +693,7 @@ class WeChatForward(_PluginBase): return userid - def __send_extra_msg(self, wechat_appid, extra_confs, title, text): + def __send_extra_msg(self, wechat_appid, extra_confs, access_token, title, text): """ 根据自定义规则发送额外消息 """ @@ -705,16 +707,16 @@ class WeChatForward(_PluginBase): extra_userid = extra_conf.get("userid") extra_msg = extra_conf.get("msg") - # 处理变量{name} - if str(extra_msg).find('{name}') != -1: - extra_msg = extra_msg.replace('{name}', self.__parse_tv_title(title)) - # 正则匹配额外消息表达式 if re.search(extra_pattern, title): logger.info(f"{title} 正则匹配到额外消息 {extra_pattern}") + + # 处理变量{name} + if str(extra_msg).find('{name}') != -1: + extra_msg = extra_msg.replace('{name}', self.__parse_tv_title(title)) + # 搜索消息,获取消息text中的用户 - userid_pattern = r"用户:(.*?)\n" - result = re.search(userid_pattern, text) + result = re.search(r"用户:(.*?)\n", text) if not result: # 订阅消息,获取消息text中的用户 pattern = r"来自用户:(.*?)$" @@ -749,6 +751,8 @@ class WeChatForward(_PluginBase): # 匹配订阅title if f"{subscribe.name} ({subscribe.year})" in title: is_subscribe = True + break + # 电视剧之前该用户订阅下载过,不再发送额外消息 if is_subscribe: logger.warn( @@ -756,44 +760,25 @@ class WeChatForward(_PluginBase): continue logger.info(f"消息用户{user_id} 匹配到目标用户 {extra_userid}") - # 发送额外消息 - if str(settings.WECHAT_APP_ID) == str(wechat_appid): - # 直接发送 - WeChat().send_msg(title=extra_msg, userid=user_id) - logger.info(f"{settings.WECHAT_APP_ID} 发送额外消息 {extra_msg} 成功") - # 保存已发送消息 - if "开始下载" in str(title): - self._extra_msg_history[f"{user_id}-{self.__parse_tv_title(title)}"] = time.strftime( - "%Y-%m-%d %H:%M:%S", time.localtime(time.time())) - is_save_history = True - else: - for wechat_idx in self._pattern_token.keys(): - wechat_conf = self._pattern_token.get(wechat_idx) - if (wechat_conf and wechat_conf.get("appid") - and str(wechat_conf.get("appid")) == str(wechat_appid)): - access_token, appid = self.__flush_access_token(appid=wechat_appid) - if not access_token: - logger.error("未获取到有效token,请检查配置") - continue - self.__send_message(title=extra_msg, - userid=user_id, - access_token=access_token, - appid=appid) - logger.info(f"{appid} 发送额外消息 {extra_msg} 成功") - # 保存已发送消息 - if "开始下载" in str(title): - self._extra_msg_history[ - f"{user_id}-{self.__parse_tv_title(title)}"] = time.strftime( - "%Y-%m-%d %H:%M:%S", time.localtime(time.time())) - is_save_history = True + + self.__send_message(title=extra_msg, + userid=user_id, + access_token=access_token, + appid=wechat_appid) + logger.info(f"{wechat_appid} 发送额外消息 {extra_msg} 成功") + # 保存已发送消息 + if "开始下载" in str(title): + self._extra_msg_history[ + f"{user_id}-{self.__parse_tv_title(title)}"] = time.strftime( + "%Y-%m-%d %H:%M:%S", time.localtime(time.time())) + is_save_history = True # 保存额外消息历史 if is_save_history: self.save_data(key="extra_msg", value=self._extra_msg_history) - @staticmethod - def __parse_tv_title(title): + def __parse_tv_title(self, title): """ 解析title标题 """ @@ -803,15 +788,38 @@ class WeChatForward(_PluginBase): # 电影 功夫熊猫 (2008) 开始下载 # 电影 功夫熊猫 (2008) 已添加订阅 # 电视剧 追风者 (2024) S01 E01-E04 开始下载 - # 电视剧 追风者 (2024) S01 E01-E04 已添加订阅 - if 'E' in sub_title_str: - continue + # 电视剧 追风者 (2024) S01 已添加订阅 if '开始下载' in sub_title_str: continue if '已添加订阅' in sub_title_str: continue _title += f"{sub_title_str} " - return str(_title.rstrip()) + return self.__convert_season_episode(str(_title.rstrip())) + + @staticmethod + def __convert_season_episode(text): + season_pattern = re.compile(r'S(\d+)') + episode_pattern = re.compile(r'E(\d+)') + + def replace_season(match): + return f'第{int(match.group(1)):,}季' + + def replace_episode(match): + return f'第{int(match.group(1)):,}集' + + def convert_episode_range(text): + pattern = re.compile(r'E(\d+)-E(\d+)') + result = pattern.sub(lambda x: f'第{int(x.group(1)):02d}-{int(x.group(2)):02d}集', text) + return result + + text = re.sub(season_pattern, replace_season, text) + + if text.count("-") == 1: + text = convert_episode_range(text) + else: + text = re.sub(episode_pattern, replace_episode, text) + + return text def __flush_access_token(self, appid: int, force: bool = False): """ @@ -1008,3 +1016,50 @@ class WeChatForward(_PluginBase): 退出插件 """ pass + + +if __name__ == '__main__': + def __parse_tv_title(title): + """ + 解析title标题 + """ + titles = title.split(" ") + _title = "" + for sub_title_str in titles: + # 电影 功夫熊猫 (2008) 开始下载 + # 电影 功夫熊猫 (2008) 已添加订阅 + # 电视剧 追风者 (2024) S01 E01-E04 开始下载 + # 电视剧 追风者 (2024) S01 已添加订阅 + if '开始下载' in sub_title_str: + continue + if '已添加订阅' in sub_title_str: + continue + _title += f"{sub_title_str} " + return __convert_season_episode(str(_title.rstrip())) + + + def __convert_season_episode(text): + season_pattern = re.compile(r'S(\d+)') + episode_pattern = re.compile(r'E(\d+)') + + def replace_season(match): + return f'第{int(match.group(1)):,}季' + + def replace_episode(match): + return f'第{int(match.group(1)):,}集' + + def convert_episode_range(text): + pattern = re.compile(r'E(\d+)-E(\d+)') + result = pattern.sub(lambda x: f'第{int(x.group(1)):02d}-{int(x.group(2)):02d}集', text) + return result + + text = re.sub(season_pattern, replace_season, text) + if text.count("-") == 1: + text = convert_episode_range(text) + else: + text = re.sub(episode_pattern, replace_episode, text) + + return text + + + print(__parse_tv_title("时光代理人 (2021) S02 E01-E22 开始下载"))