import schedule # 导入 schedule 实现定时任务执行器 import time # 导入time库,用于控制时间间隔 import os # 导入os模块用于文件和目录操作 import signal # 导入signal库,用于信号处理 import sys # 导入sys库,用于执行系统相关的操作 from datetime import datetime # 导入 datetime 模块用于获取当前日期 from config import Config # 导入配置管理类 from github_client import GitHubClient # 导入GitHub客户端类,处理GitHub API请求 from hacker_news_client import HackerNewsClient from notifier import Notifier # 导入通知器类,用于发送通知 from report_generator import ReportGenerator # 导入报告生成器类 from llm import LLM # 导入语言模型类,可能用于生成报告内容 from subscription_manager import SubscriptionManager # 导入订阅管理器类,管理GitHub仓库订阅 from logger import LOG # 导入日志记录器 def graceful_shutdown(signum, frame): # 优雅关闭程序的函数,处理信号时调用 LOG.info("[优雅退出]守护进程接收到终止信号") sys.exit(0) # 安全退出程序 def github_job(subscription_manager, github_client, report_generator, notifier, days): LOG.info("[开始执行定时任务]GitHub Repo 项目进展报告") subscriptions = subscription_manager.list_subscriptions() # 获取当前所有订阅 LOG.info(f"订阅列表:{subscriptions}") for repo in subscriptions: # 遍历每个订阅的仓库,执行以下操作 markdown_file_path = github_client.export_progress_by_date_range(repo, days) # 从Markdown文件自动生成进展简报 report, _ = report_generator.generate_github_report(markdown_file_path) notifier.notify_github_report(repo, report) LOG.info(f"[定时任务执行完毕]") def hn_topic_job(hacker_news_client, report_generator): LOG.info("[开始执行定时任务]Hacker News 热点话题跟踪") markdown_file_path = hacker_news_client.export_top_stories() _, _ = report_generator.generate_hn_topic_report(markdown_file_path) LOG.info(f"[定时任务执行完毕]") def hn_daily_job(hacker_news_client, report_generator, notifier): LOG.info("[开始执行定时任务]Hacker News 今日前沿技术趋势") # 获取当前日期,并格式化为 'YYYY-MM-DD' 格式 date = datetime.now().strftime('%Y-%m-%d') # 生成每日汇总报告的目录路径 directory_path = os.path.join('hacker_news', date) # 生成每日汇总报告并保存 report, _ = report_generator.generate_hn_daily_report(directory_path) notifier.notify_hn_report(date, report) LOG.info(f"[定时任务执行完毕]") def main(): # 设置信号处理器 signal.signal(signal.SIGTERM, graceful_shutdown) config = Config() # 创建配置实例 github_client = GitHubClient(config.github_token) # 创建GitHub客户端实例 hacker_news_client = HackerNewsClient() # 创建 Hacker News 客户端实例 notifier = Notifier(config.email) # 创建通知器实例 llm = LLM(config) # 创建语言模型实例 report_generator = ReportGenerator(llm, config.report_types) # 创建报告生成器实例 subscription_manager = SubscriptionManager(config.subscriptions_file) # 创建订阅管理器实例 # 启动时立即执行(如不需要可注释) # github_job(subscription_manager, github_client, report_generator, notifier, config.freq_days) hn_daily_job(hacker_news_client, report_generator, notifier) # 安排 GitHub 的定时任务 schedule.every(config.freq_days).days.at( config.exec_time ).do(github_job, subscription_manager, github_client, report_generator, notifier, config.freq_days) # 安排 hn_topic_job 每4小时执行一次,从0点开始 schedule.every(4).hours.at(":00").do(hn_topic_job, hacker_news_client, report_generator) # 安排 hn_daily_job 每天早上10点执行一次 schedule.every().day.at("10:00").do(hn_daily_job, hacker_news_client, report_generator, notifier) try: # 在守护进程中持续运行 while True: schedule.run_pending() time.sleep(1) # 短暂休眠以减少 CPU 使用 except Exception as e: LOG.error(f"主进程发生异常: {str(e)}") sys.exit(1) if __name__ == '__main__': main()