fix: check_cares.py 飞书卡片格式修复(card对象转字符串+charset=utf-8),cron脚本路径修复

This commit is contained in:
小唯 A06 2026-07-10 10:07:02 +08:00
parent 6ca624af1e
commit 04884bb67f
1 changed files with 35 additions and 48 deletions

View File

@ -1,7 +1,7 @@
#!/usr/bin/env python3
"""
check_cares.py 牵挂检查与飞书提醒
==================================
# -*- coding: utf-8 -*-
"""check_cares.py — 牵挂检查与飞书提醒
用法
python3 check_cares.py # 检查并推送今天到期的牵挂
python3 check_cares.py --list # 仅列出,不推送
@ -9,8 +9,12 @@ check_cares.py — 牵挂检查与飞书提醒
依赖soulful_core.py同目录
"""
import sys, os
for _ in (sys.stdout, sys.stderr):
try: _.reconfigure(encoding='utf-8', errors='replace')
except Exception: pass
import json, os, sys, urllib.request, urllib.error
import json, urllib.request, urllib.error
from datetime import datetime, timezone
HERMES = os.path.expanduser("~/.hermes")
@ -21,32 +25,22 @@ FEISHU_WEBHOOK = "https://open.feishu.cn/open-apis/bot/v2/hook/446db983-e392-4d2
def send_feishu(title: str, content: str, color: str = "green"):
"""发送飞书消息"""
color_map = {
"green": ("34", "197", "94"),
"yellow": ("255", "185", "0"),
"red": ("255", "65", "54"),
"blue": ("0", "122", "255"),
"purple": ("128", "90", "213"),
color_key = color if color in ("green", "yellow", "red", "blue", "purple") else "blue"
card_obj = {
"header": {
"title": {"tag": "plain_text", "content": f"🎗️ {title}"},
"template": color_key,
},
"elements": [
{"tag": "markdown", "content": content},
],
}
r, g, b = color_map.get(color, color_map["blue"])
payload = {
"msg_type": "interactive",
"card": {
"header": {
"title": {"tag": "plain_text", "content": f"🎗️ {title}"},
"template": color,
},
"elements": [
{"tag": "div", "content": {"tag": "lark_md", "content": content}},
],
},
"card": json.dumps(card_obj, ensure_ascii=False),
}
data = json.dumps(payload, ensure_ascii=False).encode("utf-8")
req = urllib.request.Request(
FEISHU_WEBHOOK,
data=data,
headers={"Content-Type": "application/json"},
)
data = json.dumps(payload, ensure_ascii=True).encode("utf-8")
req = urllib.request.Request(FEISHU_WEBHOOK, data=data, headers={"Content-Type": "application/json; charset=utf-8"})
try:
with urllib.request.urlopen(req, timeout=10) as resp:
return json.loads(resp.read())
@ -63,15 +57,13 @@ def generate_warm_text(care: dict, index: int = 1) -> str:
follow_up_date = care.get("follow_up_date", "")
tags = care.get("tags", [])
# 语气选择
if reminder_count == 0:
opener = f"你之前说过"
opener = "你之前说过"
elif reminder_count == 1:
opener = f"上次提醒过一次了,还是想问一下"
opener = "上次提醒过一次了,还是想问一下"
else:
opener = f"已经提醒 {reminder_count} 次了,这件重要的事"
# 标签辅助语气
tag_hints = {
"工作": "关于工作的事",
"生活": "生活里的小事",
@ -84,7 +76,6 @@ def generate_warm_text(care: dict, index: int = 1) -> str:
tag_hint = tag_hints[t]
break
# 组合文案
parts = [opener]
if tag_hint:
parts.append(tag_hint)
@ -92,8 +83,8 @@ def generate_warm_text(care: dict, index: int = 1) -> str:
if context and len(context) > 5:
parts.append(f"(你说的是:{context[:40]}")
if reminder_count > 0:
parts.append(f"——依然放在心上")
parts.append("——依然放在心上")
return "".join(parts)
@ -101,7 +92,7 @@ def format_daily_report(cares: list) -> str:
"""格式化每日牵挂清单"""
if not cares:
return '今天没有待提醒的牵挂 ✓\n\n你可以说"记得提醒我做XXX",我会帮你记住并准时提醒。'
lines = [f"📋 今天有 **{len(cares)}** 件牵挂:\n"]
for i, c in enumerate(cares, 1):
follow_up = c.get("follow_up_date", "")
@ -118,47 +109,43 @@ def format_daily_report(cares: list) -> str:
def main():
list_only = "--list" in sys.argv
daily = "--daily" in sys.argv
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
from soulful_core import CaresQueue
cq = CaresQueue()
if daily:
# 每日 21:00 模式:显示所有 pending
pending = cq.pending()
if not pending:
print("无 pending 牵挂")
return
report = format_daily_report(pending)
print(report)
if not list_only:
send_feishu("今日牵挂清单", report, "blue")
return
# 默认:检查今天到期的
due = cq.today_check()
if not due:
print("没有今天到期的牵挂 ✓")
return
print(f"发现 {len(due)} 条到期牵挂:")
for i, c in enumerate(due, 1):
print(f" {i}. [{c['id']}] {c['content']}")
if list_only:
return
# 发送飞书
for care in due:
text = generate_warm_text(care)
print(f"\n推送: {text[:60]}...")
result = send_feishu("你有一件事一直放在心上", text, "purple")
if result and result.get("code") == 0:
# 更新 reminder_count
cq.snooze(care["id"], days=0) # 只增加 reminder_count不推日期
cq.snooze(care["id"], days=0)
print(" ✓ 已推送")
else:
print(f" ✗ 推送失败: {result}")