From 4154eb452f31fa5a5fe6c7660330ccb737df244c Mon Sep 17 00:00:00 2001 From: z66 <1415243231@qq.com> Date: Thu, 30 Oct 2025 17:24:28 +0800 Subject: [PATCH] =?UTF-8?q?=E9=92=89=E9=92=89api?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- applications/reporter/README.md | 254 ------ applications/reporter/data_source_example.py | 135 ---- applications/reporter/dingtalk_example.py | 149 ---- applications/reporter/dingtalk_webhook.py | 236 ------ applications/reporter/example_usage.py | 136 ---- applications/reporter/调用api.py | 234 ------ deploy/start.bat | 3 +- logs/application.log | 66 ++ logs/errors.log | 741 ++++++++++++++++++ processors/processor_rss_data.py | 26 +- system_management/scheduler/task_scheduler.py | 1 - test/钉钉api测试.ipynb | 67 ++ tools/task_manager.ipynb | 426 ++++++---- utils/Ding_api.py | 41 + 14 files changed, 1192 insertions(+), 1323 deletions(-) delete mode 100644 applications/reporter/README.md delete mode 100644 applications/reporter/data_source_example.py delete mode 100644 applications/reporter/dingtalk_example.py delete mode 100644 applications/reporter/dingtalk_webhook.py delete mode 100644 applications/reporter/example_usage.py delete mode 100644 applications/reporter/调用api.py create mode 100644 test/钉钉api测试.ipynb create mode 100644 utils/Ding_api.py diff --git a/applications/reporter/README.md b/applications/reporter/README.md deleted file mode 100644 index 962bcdf..0000000 --- a/applications/reporter/README.md +++ /dev/null @@ -1,254 +0,0 @@ -# 报告生成器使用说明 - -## 功能概述 - -本模块提供了日报和周报生成功能,主要特点: - -1. **AI智能筛选**:从AI分析结果表获取已筛选的相关内容(是否相关=1) -2. **多格式输出**:同时生成HTML和Markdown格式的报告 -3. **钉钉推送**:支持自动推送到钉钉群 -4. **可扩展数据源**:支持添加多个数据源(RSS、投诉、API等) -5. **灵活模板系统**:支持内置HTML模板和外部HTML模板 - -## 快速开始 - -### 生成日报(24小时内数据) - -```python -from applications.reporter.daily import DailyReporter - -reporter = DailyReporter() -result = reporter.generate() -print(f"日报已生成:") -print(f" HTML: {result.get('html_path')}") -print(f" Markdown: {result.get('markdown_path')}") -``` - -### 生成周报(7天内数据) - -```python -from applications.reporter.weekly import WeeklyReporter - -reporter = WeeklyReporter() -result = reporter.generate() -print(f"周报已生成:") -print(f" HTML: {result.get('html_path')}") -print(f" Markdown: {result.get('markdown_path')}") -``` - -## 钉钉推送配置 - -### 1. 获取钉钉Webhook地址 - -1. 在钉钉群中,点击"群设置" -> "智能群助手" -> "添加机器人" -2. 选择"自定义"机器人 -3. 设置机器人名称和头像 -4. 复制Webhook地址(格式:`https://oapi.dingtalk.com/robot/send?access_token=xxx`) - -### 2. 配置Webhook地址 - -**方式1:通过环境变量(推荐)** - -```bash -export DINGTALK_WEBHOOK="https://oapi.dingtalk.com/robot/send?access_token=xxx" -``` - -**方式2:在config.py中配置** - -```python -DINGTALK_WEBHOOK = "https://oapi.dingtalk.com/robot/send?access_token=xxx" -``` - -**方式3:在代码中指定** - -```python -from applications.reporter.daily import DailyReporter - -reporter = DailyReporter(dingtalk_webhook="https://oapi.dingtalk.com/robot/send?access_token=xxx") -result = reporter.generate() -``` - -### 3. 控制推送行为 - -```python -# 生成报告但不推送到钉钉 -reporter = DailyReporter() -result = reporter.generate(send_dingtalk=False) - -# 不保存Markdown文件 -result = reporter.generate(save_markdown=False) - -# 同时控制 -result = reporter.generate(save_markdown=True, send_dingtalk=True) -``` - -### 4. 钉钉消息格式 - -- 自动使用Markdown格式发送 -- 如果内容过长(超过5000字符),会自动截断并显示摘要 -- 包含报告文件路径提示 - -## 添加自定义数据源 - -### 1. 创建数据源类 - -数据源类需要继承 `DataSource` 基类并实现以下方法: - -```python -from applications.reporter.base_reporter import DataSource -from typing import List, Dict, Any -from datetime import datetime - -class MyCustomDataSource(DataSource): - def fetch_data(self, start_time: datetime, end_time: datetime) -> List[Dict[str, Any]]: - """获取指定时间范围内的数据""" - # 返回格式: - return [ - { - 'title': '标题', - 'link': '链接', - 'summary': '摘要', - 'publish_time': '发布时间', - 'source_url': '来源URL' - } - ] - - def get_source_name(self) -> str: - return "数据源名称" -``` - -### 2. 添加到报告生成器 - -```python -from applications.reporter.daily import DailyReporter -from my_module import MyCustomDataSource - -reporter = DailyReporter() -custom_source = MyCustomDataSource(...) -reporter.add_data_source(custom_source) - -# 生成报告(会自动包含新数据源的数据) -report_path = reporter.generate() -``` - -## 使用外部HTML模板 - -### 1. 创建HTML模板文件 - -创建外部HTML模板文件(如 `custom_template.html`): - -```html - - -
- -{m.group(0)}', raw_content,
- flags=re.DOTALL)
-
- # 处理普通代码块
- code_block_patterns = [
- r'```markdown(.*?)```',
- r'```(.*?)```',
- r'~~~(.*?)~~~'
- ]
-
- for pattern in code_block_patterns:
- matches = re.findall(pattern, raw_content, re.DOTALL)
- if matches:
- return matches[0].strip()
-
- return raw_content.strip()
-
-
-def enhance_html_structure(soup):
- """增强HTML结构,特别处理图表"""
- # 图表块特殊处理
- for pre in soup.find_all('pre', class_='chart-block'):
- chart_type = 'mermaid' if 'mermaid' in pre.get_text() else 'vega-lite' if 'vega-lite' in pre.get_text() else 'chart'
- pre['class'] = f'chart-container {chart_type}-container'
- pre['data-chart-type'] = chart_type
-
- # 添加图表渲染占位符
- div = soup.new_tag('div', **{
- 'class': 'rendered-chart',
- 'data-chart-spec': pre.get_text()
- })
- pre.insert_after(div)
-
- # 表格增强
- for table in soup.find_all('table'):
- table['class'] = 'data-table'
- if not table.find('thead'):
- first_row = table.find('tr')
- if first_row:
- first_row.name = 'thead'
- for cell in first_row.find_all('td'):
- cell.name = 'th'
-
- # 代码块增强
- for pre in soup.find_all('pre'):
- if not any(
- cls in pre.get('class', []) for cls in ['chart-container', 'mermaid-container', 'vega-lite-container']):
- if not pre.find('code'):
- code = soup.new_tag('code')
- code.string = pre.get_text()
- pre.clear()
- pre.append(code)
- pre['class'] = 'code-block'
-
- return soup
-
-
-def generate_analysis_report(markdown_file):
- """生成自适应分析报告的主函数"""
- # 1. 读取Markdown文件
- with open(markdown_file, 'r', encoding='utf-8') as file:
- input_content = file.read()
-
- # 2. 调用API
- client = OpenAI(
- base_url='https://qianfan.baidubce.com/v2',
- api_key='bce-v3/ALTAK-X8C1AorvpdAI3ILPiRerh/4022de183e6b0a38e6b3baeb8af19e937f4a73d4'
- )
-
- response = client.chat.completions.create(
- model="ernie-x1-turbo-32k",
- messages=[{
- "role": "user",
- "content": f"{input_content}\n\n请生成专业的数据分析报告,要求:\n"
- "1. 使用规范的Markdown格式\n"
- "2. 包含业务表现分析、产品结构洞察、优化实施方案\n"
- "3. 增加门店维度的数据分析"
- "4.每个分析下需要展示对应的明细数据"
- }]
- )
-
- # 3. 处理API返回内容
- raw_content = response.choices[0].message.content
- processed_md = process_markdown_content(raw_content)
-
- # 4. 转换为HTML并增强结构
- html_content = markdown.markdown(processed_md, extensions=['tables', 'fenced_code', 'codehilite'])
- soup = BeautifulSoup(html_content, 'html.parser')
- enhanced_soup = enhance_html_structure(soup)
-
- # 5. 生成完整HTML报告(包含图表渲染支持)
- html_template = f"""
-
-
-
-
- at 0x0000024191C1D610, file "C:\Users\zy187\AppData\Local\Temp\ipykernel_15044\1819114417.py", line 1>
+
+ File "C:\Users\zy187\AppData\Local\Temp\ipykernel_15044\1819114417.py", line 45, in
+ run_task_with_details(2)
+ └
+
+ File "C:\Users\zy187\AppData\Local\Temp\ipykernel_15044\1819114417.py", line 16, in run_task_with_details
+ result = manager.run_task_synchronously(task_id)
+ │ │ └ 2
+ │ └
+ └ <__main__.TaskManager object at 0x00000241919D6AB0>
+
+> File "C:\Users\zy187\AppData\Local\Temp\ipykernel_15044\1757831752.py", line 122, in run_task_synchronously
+ self.scheduler._execute_task_logic(task)
+ │ │ │ └ {'task_id': 2, 'task_name': 'RSS基于规则数据处理', 'task_type': 'processor', 'module_path': 'processors.processor_rss_data', 'cron_ex...
+ │ │ └
+ │ └
+ └ <__main__.TaskManager object at 0x00000241919D6AB0>
+
+ File "d:\Idea Project\intelligence_system\system_management\scheduler\task_scheduler.py", line 278, in _execute_task_logic
+ raise AttributeError(f"模块 {module_name} 中未找到类 {class_name}")
+ │ └ 'processor_rss_data'
+ └ 'processors'
+
+AttributeError: 模块 processors 中未找到类 processor_rss_data
+
+Traceback (most recent call last):
+
+ File "", line 198, in _run_module_as_main
+ File "", line 88, in _run_code
+ File "d:\ProgramTools\anaconda3\envs\intelligence_system\Lib\site-packages\ipykernel_launcher.py", line 18, in
+ app.launch_new_instance()
+ │ └ >
+ └
+ └
+ File "d:\ProgramTools\anaconda3\envs\intelligence_system\Lib\site-packages\ipykernel\kernelapp.py", line 739, in start
+ self.io_loop.start()
+ │ │ └
+ │ └
+ └
+ File "d:\ProgramTools\anaconda3\envs\intelligence_system\Lib\site-packages\tornado\platform\asyncio.py", line 211, in start
+ self.asyncio_loop.run_forever()
+ │ │ └
+ │ └ <_WindowsSelectorEventLoop running=True closed=False debug=False>
+ └
+ File "d:\ProgramTools\anaconda3\envs\intelligence_system\Lib\asyncio\base_events.py", line 645, in run_forever
+ self._run_once()
+ │ └
+ └ <_WindowsSelectorEventLoop running=True closed=False debug=False>
+ File "d:\ProgramTools\anaconda3\envs\intelligence_system\Lib\asyncio\base_events.py", line 1999, in _run_once
+ handle._run()
+ │ └
+ └ , ...],))>)>
+ File "d:\ProgramTools\anaconda3\envs\intelligence_system\Lib\asyncio\events.py", line 88, in _run
+ self._context.run(self._callback, *self._args)
+ │ │ │ │ │ └
+ │ │ │ │ └ , ...],))>)>
+ │ │ │ └
+ │ │ └ , ...],))>)>
+ │ └
+ └ , ...],))>)>
+ File "d:\ProgramTools\anaconda3\envs\intelligence_system\Lib\site-packages\ipykernel\kernelbase.py", line 519, in dispatch_queue
+ await self.process_one()
+ │ └
+ └
+ File "d:\ProgramTools\anaconda3\envs\intelligence_system\Lib\site-packages\ipykernel\kernelbase.py", line 508, in process_one
+ await dispatch(*args)
+ │ └ ([, ')>, , >
+ File "d:\ProgramTools\anaconda3\envs\intelligence_system\Lib\site-packages\ipykernel\kernelbase.py", line 400, in dispatch_shell
+ await result
+ └
+ File "d:\ProgramTools\anaconda3\envs\intelligence_system\Lib\site-packages\ipykernel\ipkernel.py", line 368, in execute_request
+ await super().execute_request(stream, ident, parent)
+ │ │ └ {'header': {'date': datetime.datetime(2025, 10, 30, 5, 48, 20, 70000, tzinfo=tzutc()), 'msg_id': '7653bb92-3d92-4584-b5fd-f30...
+ │ └ [b'be29372e-3914-4138-ba04-8dcacb3dcfbe']
+ └
+ File "d:\ProgramTools\anaconda3\envs\intelligence_system\Lib\site-packages\ipykernel\kernelbase.py", line 767, in execute_request
+ reply_content = await reply_content
+ └
+ File "d:\ProgramTools\anaconda3\envs\intelligence_system\Lib\site-packages\ipykernel\ipkernel.py", line 455, in do_execute
+ res = shell.run_cell(
+ │ └
+ └
+ File "d:\ProgramTools\anaconda3\envs\intelligence_system\Lib\site-packages\ipykernel\zmqshell.py", line 577, in run_cell
+ return super().run_cell(*args, **kwargs)
+ │ └ {'store_history': True, 'silent': False, 'cell_id': 'vscode-notebook-cell:/d%3A/Idea%20Project/intelligence_system/tools/task...
+ └ ('# 手动执行任务(异步方式,快速返回)\ndef run_task_manually(task_id):\n display(Markdown(f"### 正在手动执行任务ID {task_id}..."))\n success = ...
+ File "d:\ProgramTools\anaconda3\envs\intelligence_system\Lib\site-packages\IPython\core\interactiveshell.py", line 3098, in run_cell
+ result = self._run_cell(
+ │ └
+ └
+ File "d:\ProgramTools\anaconda3\envs\intelligence_system\Lib\site-packages\IPython\core\interactiveshell.py", line 3153, in _run_cell
+ result = runner(coro)
+ │ └
+ └
+ File "d:\ProgramTools\anaconda3\envs\intelligence_system\Lib\site-packages\IPython\core\async_helpers.py", line 128, in _pseudo_sync_runner
+ coro.send(None)
+ │ └
+ └
+ File "d:\ProgramTools\anaconda3\envs\intelligence_system\Lib\site-packages\IPython\core\interactiveshell.py", line 3362, in run_cell_async
+ has_raised = await self.run_ast_nodes(code_ast.body, cell_name,
+ │ │ │ │ └ 'C:\\Users\\zy187\\AppData\\Local\\Temp\\ipykernel_15044\\1819114417.py'
+ │ │ │ └ [, ,
+ │ └
+ └
+ File "d:\ProgramTools\anaconda3\envs\intelligence_system\Lib\site-packages\IPython\core\interactiveshell.py", line 3607, in run_ast_nodes
+ if await self.run_code(code, result, async_=asy):
+ │ │ │ │ └ False
+ │ │ │ └ at 0x0000024191C1D610, file "C:\Users\zy187\AppData\Local\Temp\ipykernel_15044\1819114417.py", line 1>
+ │ └
+ └
+ File "d:\ProgramTools\anaconda3\envs\intelligence_system\Lib\site-packages\IPython\core\interactiveshell.py", line 3667, in run_code
+ exec(code_obj, self.user_global_ns, self.user_ns)
+ │ │ │ │ └
+ │ │ │ └
+ │ │ └
+ │ └
+ └ at 0x0000024191C1D610, file "C:\Users\zy187\AppData\Local\Temp\ipykernel_15044\1819114417.py", line 1>
+
+ File "C:\Users\zy187\AppData\Local\Temp\ipykernel_15044\1819114417.py", line 45, in
+ run_task_with_details(2)
+ └
+
+ File "C:\Users\zy187\AppData\Local\Temp\ipykernel_15044\1819114417.py", line 16, in run_task_with_details
+ result = manager.run_task_synchronously(task_id)
+ │ │ └ 2
+ │ └
+ └ <__main__.TaskManager object at 0x00000241919D6AB0>
+
+> File "C:\Users\zy187\AppData\Local\Temp\ipykernel_15044\1757831752.py", line 122, in run_task_synchronously
+ self.scheduler._execute_task_logic(task)
+ │ │ │ └ {'task_id': 2, 'task_name': 'RSS基于规则数据处理', 'task_type': 'processor', 'module_path': 'processors.processor_rss_data', 'cron_ex...
+ │ │ └
+ │ └
+ └ <__main__.TaskManager object at 0x00000241919D6AB0>
+
+ File "d:\Idea Project\intelligence_system\system_management\scheduler\task_scheduler.py", line 278, in _execute_task_logic
+ raise AttributeError(f"模块 {module_name} 中未找到类 {class_name}")
+ │ └ 'processor_rss_data'
+ └ 'processors'
+
+AttributeError: 模块 processors 中未找到类 processor_rss_data
+2025-10-30 13:56:55.941 | ERROR | 1757831752:141 - 任务执行失败: RSS基于规则数据处理
+ → module: 'TaskNotebook'
+Traceback (most recent call last):
+
+ File "", line 198, in _run_module_as_main
+ File "", line 88, in _run_code
+ File "d:\ProgramTools\anaconda3\envs\intelligence_system\Lib\site-packages\ipykernel_launcher.py", line 18, in
+ app.launch_new_instance()
+ │ └ >
+ └
+ └
+ File "d:\ProgramTools\anaconda3\envs\intelligence_system\Lib\site-packages\ipykernel\kernelapp.py", line 739, in start
+ self.io_loop.start()
+ │ │ └
+ │ └
+ └
+ File "d:\ProgramTools\anaconda3\envs\intelligence_system\Lib\site-packages\tornado\platform\asyncio.py", line 211, in start
+ self.asyncio_loop.run_forever()
+ │ │ └
+ │ └ <_WindowsSelectorEventLoop running=True closed=False debug=False>
+ └
+ File "d:\ProgramTools\anaconda3\envs\intelligence_system\Lib\asyncio\base_events.py", line 645, in run_forever
+ self._run_once()
+ │ └
+ └ <_WindowsSelectorEventLoop running=True closed=False debug=False>
+ File "d:\ProgramTools\anaconda3\envs\intelligence_system\Lib\asyncio\base_events.py", line 1999, in _run_once
+ handle._run()
+ │ └
+ └ , ...],))>)>
+ File "d:\ProgramTools\anaconda3\envs\intelligence_system\Lib\asyncio\events.py", line 88, in _run
+ self._context.run(self._callback, *self._args)
+ │ │ │ │ │ └
+ │ │ │ │ └ , ...],))>)>
+ │ │ │ └
+ │ │ └ , ...],))>)>
+ │ └
+ └ , ...],))>)>
+ File "d:\ProgramTools\anaconda3\envs\intelligence_system\Lib\site-packages\ipykernel\kernelbase.py", line 519, in dispatch_queue
+ await self.process_one()
+ │ └
+ └
+ File "d:\ProgramTools\anaconda3\envs\intelligence_system\Lib\site-packages\ipykernel\kernelbase.py", line 508, in process_one
+ await dispatch(*args)
+ │ └ ([, ')>, , >
+ File "d:\ProgramTools\anaconda3\envs\intelligence_system\Lib\site-packages\ipykernel\kernelbase.py", line 400, in dispatch_shell
+ await result
+ └
+ File "d:\ProgramTools\anaconda3\envs\intelligence_system\Lib\site-packages\ipykernel\ipkernel.py", line 368, in execute_request
+ await super().execute_request(stream, ident, parent)
+ │ │ └ {'header': {'date': datetime.datetime(2025, 10, 30, 5, 56, 55, 692000, tzinfo=tzutc()), 'msg_id': '788ee0fd-a13f-4e53-98b0-e9...
+ │ └ [b'be29372e-3914-4138-ba04-8dcacb3dcfbe']
+ └
+ File "d:\ProgramTools\anaconda3\envs\intelligence_system\Lib\site-packages\ipykernel\kernelbase.py", line 767, in execute_request
+ reply_content = await reply_content
+ └
+ File "d:\ProgramTools\anaconda3\envs\intelligence_system\Lib\site-packages\ipykernel\ipkernel.py", line 455, in do_execute
+ res = shell.run_cell(
+ │ └
+ └
+ File "d:\ProgramTools\anaconda3\envs\intelligence_system\Lib\site-packages\ipykernel\zmqshell.py", line 577, in run_cell
+ return super().run_cell(*args, **kwargs)
+ │ └ {'store_history': True, 'silent': False, 'cell_id': 'vscode-notebook-cell:/d%3A/Idea%20Project/intelligence_system/tools/task...
+ └ ('# 手动执行任务(异步方式,快速返回)\ndef run_task_manually(task_id):\n display(Markdown(f"### 正在手动执行任务ID {task_id}..."))\n success = ...
+ File "d:\ProgramTools\anaconda3\envs\intelligence_system\Lib\site-packages\IPython\core\interactiveshell.py", line 3098, in run_cell
+ result = self._run_cell(
+ │ └
+ └
+ File "d:\ProgramTools\anaconda3\envs\intelligence_system\Lib\site-packages\IPython\core\interactiveshell.py", line 3153, in _run_cell
+ result = runner(coro)
+ │ └
+ └
+ File "d:\ProgramTools\anaconda3\envs\intelligence_system\Lib\site-packages\IPython\core\async_helpers.py", line 128, in _pseudo_sync_runner
+ coro.send(None)
+ │ └
+ └
+ File "d:\ProgramTools\anaconda3\envs\intelligence_system\Lib\site-packages\IPython\core\interactiveshell.py", line 3362, in run_cell_async
+ has_raised = await self.run_ast_nodes(code_ast.body, cell_name,
+ │ │ │ │ └ 'C:\\Users\\zy187\\AppData\\Local\\Temp\\ipykernel_15044\\1819114417.py'
+ │ │ │ └ [, ,
+ │ └
+ └
+ File "d:\ProgramTools\anaconda3\envs\intelligence_system\Lib\site-packages\IPython\core\interactiveshell.py", line 3607, in run_ast_nodes
+ if await self.run_code(code, result, async_=asy):
+ │ │ │ │ └ False
+ │ │ │ └ at 0x0000024191CC1DF0, file "C:\Users\zy187\AppData\Local\Temp\ipykernel_15044\1819114417.py", line 1>
+ │ └
+ └
+ File "d:\ProgramTools\anaconda3\envs\intelligence_system\Lib\site-packages\IPython\core\interactiveshell.py", line 3667, in run_code
+ exec(code_obj, self.user_global_ns, self.user_ns)
+ │ │ │ │ └
+ │ │ │ └
+ │ │ └
+ │ └
+ └ at 0x0000024191CC1DF0, file "C:\Users\zy187\AppData\Local\Temp\ipykernel_15044\1819114417.py", line 1>
+
+ File "C:\Users\zy187\AppData\Local\Temp\ipykernel_15044\1819114417.py", line 45, in
+ run_task_with_details(2)
+ └
+
+ File "C:\Users\zy187\AppData\Local\Temp\ipykernel_15044\1819114417.py", line 16, in run_task_with_details
+ result = manager.run_task_synchronously(task_id)
+ │ │ └ 2
+ │ └
+ └ <__main__.TaskManager object at 0x00000241919D6AB0>
+
+> File "C:\Users\zy187\AppData\Local\Temp\ipykernel_15044\1757831752.py", line 122, in run_task_synchronously
+ self.scheduler._execute_task_logic(task)
+ │ │ │ └ {'task_id': 2, 'task_name': 'RSS基于规则数据处理', 'task_type': 'processor', 'module_path': 'processors.processor_rss_data', 'cron_ex...
+ │ │ └
+ │ └
+ └ <__main__.TaskManager object at 0x00000241919D6AB0>
+
+ File "d:\Idea Project\intelligence_system\system_management\scheduler\task_scheduler.py", line 278, in _execute_task_logic
+ raise AttributeError(f"模块 {module_name} 中未找到类 {class_name}")
+ │ └ 'processor_rss_data'
+ └ 'processors'
+
+AttributeError: 模块 processors 中未找到类 processor_rss_data
+
+Traceback (most recent call last):
+
+ File "", line 198, in _run_module_as_main
+ File "", line 88, in _run_code
+ File "d:\ProgramTools\anaconda3\envs\intelligence_system\Lib\site-packages\ipykernel_launcher.py", line 18, in
+ app.launch_new_instance()
+ │ └ >
+ └
+ └
+ File "d:\ProgramTools\anaconda3\envs\intelligence_system\Lib\site-packages\ipykernel\kernelapp.py", line 739, in start
+ self.io_loop.start()
+ │ │ └
+ │ └
+ └
+ File "d:\ProgramTools\anaconda3\envs\intelligence_system\Lib\site-packages\tornado\platform\asyncio.py", line 211, in start
+ self.asyncio_loop.run_forever()
+ │ │ └
+ │ └ <_WindowsSelectorEventLoop running=True closed=False debug=False>
+ └
+ File "d:\ProgramTools\anaconda3\envs\intelligence_system\Lib\asyncio\base_events.py", line 645, in run_forever
+ self._run_once()
+ │ └
+ └ <_WindowsSelectorEventLoop running=True closed=False debug=False>
+ File "d:\ProgramTools\anaconda3\envs\intelligence_system\Lib\asyncio\base_events.py", line 1999, in _run_once
+ handle._run()
+ │ └
+ └ , ...],))>)>
+ File "d:\ProgramTools\anaconda3\envs\intelligence_system\Lib\asyncio\events.py", line 88, in _run
+ self._context.run(self._callback, *self._args)
+ │ │ │ │ │ └
+ │ │ │ │ └ , ...],))>)>
+ │ │ │ └
+ │ │ └ , ...],))>)>
+ │ └
+ └ , ...],))>)>
+ File "d:\ProgramTools\anaconda3\envs\intelligence_system\Lib\site-packages\ipykernel\kernelbase.py", line 519, in dispatch_queue
+ await self.process_one()
+ │ └
+ └
+ File "d:\ProgramTools\anaconda3\envs\intelligence_system\Lib\site-packages\ipykernel\kernelbase.py", line 508, in process_one
+ await dispatch(*args)
+ │ └ ([, ')>, , >
+ File "d:\ProgramTools\anaconda3\envs\intelligence_system\Lib\site-packages\ipykernel\kernelbase.py", line 400, in dispatch_shell
+ await result
+ └
+ File "d:\ProgramTools\anaconda3\envs\intelligence_system\Lib\site-packages\ipykernel\ipkernel.py", line 368, in execute_request
+ await super().execute_request(stream, ident, parent)
+ │ │ └ {'header': {'date': datetime.datetime(2025, 10, 30, 5, 56, 55, 692000, tzinfo=tzutc()), 'msg_id': '788ee0fd-a13f-4e53-98b0-e9...
+ │ └ [b'be29372e-3914-4138-ba04-8dcacb3dcfbe']
+ └
+ File "d:\ProgramTools\anaconda3\envs\intelligence_system\Lib\site-packages\ipykernel\kernelbase.py", line 767, in execute_request
+ reply_content = await reply_content
+ └
+ File "d:\ProgramTools\anaconda3\envs\intelligence_system\Lib\site-packages\ipykernel\ipkernel.py", line 455, in do_execute
+ res = shell.run_cell(
+ │ └
+ └
+ File "d:\ProgramTools\anaconda3\envs\intelligence_system\Lib\site-packages\ipykernel\zmqshell.py", line 577, in run_cell
+ return super().run_cell(*args, **kwargs)
+ │ └ {'store_history': True, 'silent': False, 'cell_id': 'vscode-notebook-cell:/d%3A/Idea%20Project/intelligence_system/tools/task...
+ └ ('# 手动执行任务(异步方式,快速返回)\ndef run_task_manually(task_id):\n display(Markdown(f"### 正在手动执行任务ID {task_id}..."))\n success = ...
+ File "d:\ProgramTools\anaconda3\envs\intelligence_system\Lib\site-packages\IPython\core\interactiveshell.py", line 3098, in run_cell
+ result = self._run_cell(
+ │ └
+ └
+ File "d:\ProgramTools\anaconda3\envs\intelligence_system\Lib\site-packages\IPython\core\interactiveshell.py", line 3153, in _run_cell
+ result = runner(coro)
+ │ └
+ └
+ File "d:\ProgramTools\anaconda3\envs\intelligence_system\Lib\site-packages\IPython\core\async_helpers.py", line 128, in _pseudo_sync_runner
+ coro.send(None)
+ │ └
+ └
+ File "d:\ProgramTools\anaconda3\envs\intelligence_system\Lib\site-packages\IPython\core\interactiveshell.py", line 3362, in run_cell_async
+ has_raised = await self.run_ast_nodes(code_ast.body, cell_name,
+ │ │ │ │ └ 'C:\\Users\\zy187\\AppData\\Local\\Temp\\ipykernel_15044\\1819114417.py'
+ │ │ │ └ [, ,
+ │ └
+ └
+ File "d:\ProgramTools\anaconda3\envs\intelligence_system\Lib\site-packages\IPython\core\interactiveshell.py", line 3607, in run_ast_nodes
+ if await self.run_code(code, result, async_=asy):
+ │ │ │ │ └ False
+ │ │ │ └ at 0x0000024191CC1DF0, file "C:\Users\zy187\AppData\Local\Temp\ipykernel_15044\1819114417.py", line 1>
+ │ └
+ └
+ File "d:\ProgramTools\anaconda3\envs\intelligence_system\Lib\site-packages\IPython\core\interactiveshell.py", line 3667, in run_code
+ exec(code_obj, self.user_global_ns, self.user_ns)
+ │ │ │ │ └
+ │ │ │ └
+ │ │ └
+ │ └
+ └ at 0x0000024191CC1DF0, file "C:\Users\zy187\AppData\Local\Temp\ipykernel_15044\1819114417.py", line 1>
+
+ File "C:\Users\zy187\AppData\Local\Temp\ipykernel_15044\1819114417.py", line 45, in
+ run_task_with_details(2)
+ └
+
+ File "C:\Users\zy187\AppData\Local\Temp\ipykernel_15044\1819114417.py", line 16, in run_task_with_details
+ result = manager.run_task_synchronously(task_id)
+ │ │ └ 2
+ │ └
+ └ <__main__.TaskManager object at 0x00000241919D6AB0>
+
+> File "C:\Users\zy187\AppData\Local\Temp\ipykernel_15044\1757831752.py", line 122, in run_task_synchronously
+ self.scheduler._execute_task_logic(task)
+ │ │ │ └ {'task_id': 2, 'task_name': 'RSS基于规则数据处理', 'task_type': 'processor', 'module_path': 'processors.processor_rss_data', 'cron_ex...
+ │ │ └
+ │ └
+ └ <__main__.TaskManager object at 0x00000241919D6AB0>
+
+ File "d:\Idea Project\intelligence_system\system_management\scheduler\task_scheduler.py", line 278, in _execute_task_logic
+ raise AttributeError(f"模块 {module_name} 中未找到类 {class_name}")
+ │ └ 'processor_rss_data'
+ └ 'processors'
+
+AttributeError: 模块 processors 中未找到类 processor_rss_data
+2025-10-30 13:57:11.125 | ERROR | 1757831752:141 - 任务执行失败: RSS基于规则数据处理
+ → module: 'TaskNotebook'
+Traceback (most recent call last):
+
+ File "", line 198, in _run_module_as_main
+ File "", line 88, in _run_code
+ File "d:\ProgramTools\anaconda3\envs\intelligence_system\Lib\site-packages\ipykernel_launcher.py", line 18, in
+ app.launch_new_instance()
+ │ └ >
+ └
+ └
+ File "d:\ProgramTools\anaconda3\envs\intelligence_system\Lib\site-packages\ipykernel\kernelapp.py", line 739, in start
+ self.io_loop.start()
+ │ │ └
+ │ └
+ └
+ File "d:\ProgramTools\anaconda3\envs\intelligence_system\Lib\site-packages\tornado\platform\asyncio.py", line 211, in start
+ self.asyncio_loop.run_forever()
+ │ │ └
+ │ └ <_WindowsSelectorEventLoop running=True closed=False debug=False>
+ └
+ File "d:\ProgramTools\anaconda3\envs\intelligence_system\Lib\asyncio\base_events.py", line 645, in run_forever
+ self._run_once()
+ │ └
+ └ <_WindowsSelectorEventLoop running=True closed=False debug=False>
+ File "d:\ProgramTools\anaconda3\envs\intelligence_system\Lib\asyncio\base_events.py", line 1999, in _run_once
+ handle._run()
+ │ └
+ └ , ...],))>)>
+ File "d:\ProgramTools\anaconda3\envs\intelligence_system\Lib\asyncio\events.py", line 88, in _run
+ self._context.run(self._callback, *self._args)
+ │ │ │ │ │ └
+ │ │ │ │ └ , ...],))>)>
+ │ │ │ └
+ │ │ └ , ...],))>)>
+ │ └
+ └ , ...],))>)>
+ File "d:\ProgramTools\anaconda3\envs\intelligence_system\Lib\site-packages\ipykernel\kernelbase.py", line 519, in dispatch_queue
+ await self.process_one()
+ │ └
+ └
+ File "d:\ProgramTools\anaconda3\envs\intelligence_system\Lib\site-packages\ipykernel\kernelbase.py", line 508, in process_one
+ await dispatch(*args)
+ │ └ ([, ')>, , >
+ File "d:\ProgramTools\anaconda3\envs\intelligence_system\Lib\site-packages\ipykernel\kernelbase.py", line 400, in dispatch_shell
+ await result
+ └
+ File "d:\ProgramTools\anaconda3\envs\intelligence_system\Lib\site-packages\ipykernel\ipkernel.py", line 368, in execute_request
+ await super().execute_request(stream, ident, parent)
+ │ │ └ {'header': {'date': datetime.datetime(2025, 10, 30, 5, 57, 10, 815000, tzinfo=tzutc()), 'msg_id': '132b59a7-4a02-4a8d-a25c-e2...
+ │ └ [b'4c713768-9d1a-49ca-83ed-6814787009a5']
+ └
+ File "d:\ProgramTools\anaconda3\envs\intelligence_system\Lib\site-packages\ipykernel\kernelbase.py", line 767, in execute_request
+ reply_content = await reply_content
+ └
+ File "d:\ProgramTools\anaconda3\envs\intelligence_system\Lib\site-packages\ipykernel\ipkernel.py", line 455, in do_execute
+ res = shell.run_cell(
+ │ └
+ └
+ File "d:\ProgramTools\anaconda3\envs\intelligence_system\Lib\site-packages\ipykernel\zmqshell.py", line 577, in run_cell
+ return super().run_cell(*args, **kwargs)
+ │ └ {'store_history': True, 'silent': False, 'cell_id': 'vscode-notebook-cell:/d%3A/Idea%20Project/intelligence_system/tools/task...
+ └ ('# 手动执行任务(异步方式,快速返回)\ndef run_task_manually(task_id):\n display(Markdown(f"### 正在手动执行任务ID {task_id}..."))\n success = ...
+ File "d:\ProgramTools\anaconda3\envs\intelligence_system\Lib\site-packages\IPython\core\interactiveshell.py", line 3098, in run_cell
+ result = self._run_cell(
+ │ └
+ └
+ File "d:\ProgramTools\anaconda3\envs\intelligence_system\Lib\site-packages\IPython\core\interactiveshell.py", line 3153, in _run_cell
+ result = runner(coro)
+ │ └
+ └
+ File "d:\ProgramTools\anaconda3\envs\intelligence_system\Lib\site-packages\IPython\core\async_helpers.py", line 128, in _pseudo_sync_runner
+ coro.send(None)
+ │ └