def run_scheduler():
"""在背景執行排程(Render 環境優化版)"""
# 清除所有現有排程
schedule.clear()
# 設定排程:每週一上午 9:00 執行(台灣時間 UTC+8)
# Render 伺服器通常是 UTC 時間,所以換算成 UTC 時間
schedule.every().monday.at("01:00").do(trigger_weekly_check) # UTC 時間 01:00 = 台灣時間 09:00
# 也可以添加測試排程(每小時執行一次,用於測試)
schedule.every().hour.do(trigger_test_check)
print("⏰ 排程器設定完成:每週一 01:00 UTC (09:00 UTC+8) 自動檢查")
while True:
schedule.run_pending()
time.sleep(60) # 每分鐘檢查一次排程
改成每周一發送報告
async def execute_scheduled_check():
"""執行排程的每周檢查"""
print(f"🔍 執行排程每周檢查...")
# 檢查上週的 PR(上週一到現在)
last_monday = datetime.utcnow() - timedelta(days=7) # 使用 UTC 時間
since_date = last_monday.strftime("%Y-%m-%d")
prs, error = get_merged_prs_since(since_date)
if error:
error_msg = f"❌ 自動檢查失敗: {error}"
print(error_msg)
if CHANGELOG_CHANNEL_ID:
await send_changelog_to_channel(error_msg)
return
if prs:
print(f"📝 發現 {len(prs)} 個上週合併的 PR")
# 計算時間範圍
start_date = last_monday.strftime("%Y-%m-%d")
end_date = datetime.utcnow().strftime("%Y-%m-%d")
changelog_content = f"📊 **每周更新報告 ({start_date} ~ {end_date})**\n\n"
changelog_content += f"本周共合併了 **{len(prs)}** 個 PR\n\n"
for pr in prs:
pr_number = pr['number']
pr_title = pr['title']
pr_url = pr['html_url']
author = pr['user']['login']
merged_at = pr['pull_request']['merged_at']
# 格式化時間
merged_time = datetime.fromisoformat(merged_at.replace('Z', '+00:00'))
formatted_time = merged_time.strftime("%m/%d")
changelog_content += f"• [#{pr_number}]({pr_url}) {pr_title}\n"
changelog_content += f" 👤 {author} | 📅 {formatted_time}\n\n"
if CHANGELOG_CHANNEL_ID:
success = await send_changelog_to_channel(changelog_content)
if success:
print("✅ 排程每周報告發送成功")
else:
print("❌ 排程每周報告發送失敗")
else:
print("📭 上週沒有新合併的 PR")
if CHANGELOG_CHANNEL_ID:
await send_changelog_to_channel("📭 上週沒有新合併的 PR")
進行檢查的作業並統整
成果如下: 於周一上午9:00準時發送報告
由於已將bot部署至render並透過uptimerobot每五分鐘進行監控,確保bot 24/7小時是上線的