用Python+Trello + ChatGPT+钉钉实现全自动日报生成

1. 背景与痛点

  • 每天写日报 = 重复粘贴任务内容,浪费时间
  • 想要实现自动化:从任务管理系统直接生成日报 → 自动推送

2. 技术栈与整体架构

  • Trello API:获取任务数据
  • Python:实现数据处理 + 调度
  • ChartGPT API:智能分析日报,并生成CSV日报内容
  • 钉钉群机器人:消息推送
  • Windows 任务计划程序:定时执行

3.实现步骤

Step 1:对接Trello API

  • 获取API Key & Token
  • 拉取 Board / List / Card 信息
  • 过滤当天任务
  • 代码如下:get_data.py
import requests
import json

API_KEY = "你的API Key"
TOKEN = "你的Token"
BOARD_ID = "你的Board id"  # 24位数字符串,可以在Trolle面板上通过控制台的https://trello.com/1/member/me获取到

# 方法:获取当天日报的数据
def get_trello_data():
    # 1. 获取Board下的所有List
    url_lists = f"https://api.trello.com/1/boards/{BOARD_ID}/lists"
    query = {"key": API_KEY, "token": TOKEN}
    lists = requests.get(url_lists, params=query).json()

    # 2. 获取第一个List下的Cards
    list_name = lists[0]["name"]
    list_id = lists[0]["id"]  # 取第一个list演示
    url_cards = f"https://api.trello.com/1/lists/{list_id}/cards"
    cards = requests.get(url_cards, params=query).json()

    # 过滤数据,将每一条cover.color等于"black"的数据过滤出(可以自行定义,因为我的其它颜色的工作不适合往日报里填),只要name、desc字段
    filtered_cards = []
    for card in cards:
        if card["cover"]["color"] == "black":
            filtered_cards.append(card)
    
    return filtered_cards

Step 2:GPT 调用

  • 获取Token等,我用的是代理,因为OpenAI API 限额/国内有支付问题
  • 调用 GPT 生成日报 CSV 内容
  • 代码如下:analysis.py
from openai import OpenAI
from datetime import datetime

# 配置 OpenAI API 代理客户端

client = OpenAI(
    api_key="你的apiKey",
    base_url="https://api.chatanywhere.tech/v1" # chatanywhere是国内gpt代理
)

# 准备要传给GPT 的内容
def format_tasks_for_gpt(tasks):
    content = "### 今日任务完成情况:\n"
    for task in tasks:
        content += f"- 任务: {task['name']}\n  具体内容: {task['desc']}\n"
    return content

# 方法: GPT生成日报分析
def generate_daily_report(tasks):
    formatted_tasks = format_tasks_for_gpt(tasks)
    # 今天的日期,比如2025-09-02
    today = datetime.now().astimezone().isoformat()
    try:
        response = client.chat.completions.create(
            model="gpt-4o-mini", 
            messages=[
             {
                "role": "system",
                "content": (
                    "你是一个专业的日报生成助手,可以将任务完成情况总结成专业的日报。"
                    "生成的内容要求:"
                    "1. 不要包含任务链接;"
                    "2. 任务不能遗漏,要完整覆盖;"
                    "3. 内容要专业、丰富,适合提交给领导;"
                    "4.CSV第一行为表头,表头必须是:日报内容(标题),完成进度,任务来源,任务状态,创建人,岗位。"
                    "5.日报内容是标题+任务描述的组装内容,用':'隔开,组装的内容要精炼、但不要有遗漏,控制在40字以内"
                    "6.每一行对应一条日报。"
                    "7.输出时只输出CSV格式,不要代码块,不要额外文字。"
                )
            },
            {
                "role": "user",
                "content": (
                    f"以下是我的今日任务:\n{formatted_tasks}\n,请帮我生成日报 CSV 内容"
                )
            }
            ],
            max_tokens=500
        )
        
        return response.choices[0].message.content.strip()
    except Exception as e:
        if "insufficient_quota" in str(e):
            return "错误:OpenAI API 配额不足。请参考 README.md 文件设置有效的 API 密钥。"
        elif "invalid_api_key" in str(e):
            return "错误:无效的 OpenAI API 密钥。请参考 README.md 文件设置有效的 API 密钥。"
        else:
            return f"生成日报时出错:{str(e)}。请参考 README.md 文件获取帮助。"

Step 3:写入CSV & 推送到钉钉

  • 写入CSV文件,方面通过csv方式导入数据
  • 钉钉群机器人 Webhook → 消息推送
  • 代码如下:writeto_file.py、daily_report.py
import os

def save_and_open_report(content, filename="cards_report.CSV"):
    # filename是files目录下的文件
    filename = os.path.join("files", filename)
    # 确保files目录存在
    os.makedirs("files", exist_ok=True)

    # 1. 将内容写入文件
    with open(filename, "w", encoding="utf-8") as f:
        f.write(content)

    print(f"✅ 日报已保存到 {filename}")

    # 2. 自动打开文档(跨平台处理)
    try:
        if os.name == "nt":  # Windows
            os.startfile(filename)
        elif os.name == "posix":  # macOS 或 Linux
            os.system(f"open {filename}")  # macOS
            # os.system(f"xdg-open {filename}")  # Linux
    except Exception as e:
        print("❌ 打开文件失败,请手动打开:", e)

import requests
import schedule
import time
import hmac
import hashlib
import base64
import urllib.parse
from get_data import get_trello_data
from analysis import generate_daily_report
from writeto_file import save_and_open_report

# 钉钉机器人配置
ACCESS_TOKEN = "你生成的ACCESS_TOKEN"
SECRET = "安全设置中的签名密钥" 

# ========== 推送到钉钉 ==========
def send_to_dingtalk(content):
    # 1. 获取时间戳和签名
    timestamp = str(round(time.time() * 1000))
    secret_enc = SECRET.encode('utf-8')
    string_to_sign = '{}\n{}'.format(timestamp, SECRET)
    string_to_sign_enc = string_to_sign.encode('utf-8')
    hmac_code = hmac.new(secret_enc, string_to_sign_enc, digestmod=hashlib.sha256).digest()
    sign = urllib.parse.quote_plus(base64.b64encode(hmac_code))
    
    # 2. 构建带签名的URL
    webhook_url = f"https://oapi.dingtalk.com/robot/send?access_token={ACCESS_TOKEN}&timestamp={timestamp}&sign={sign}"
    
    # 3. 发送请求
    headers = {"Content-Type": "application/json"}
    data = {
        "msgtype": "text",
        "text": {"content": f"📋 今日日报:\n{content}"}
    }
    resp = requests.post(webhook_url, headers=headers, json=data)
    print("✅ 钉钉推送结果:", resp.text)

# ========== 定时任务 ==========
def job():
    print("⏰ 开始生成日报...")
    # 获取数据
    tasks = get_trello_data()
    # 生成日报
    report = generate_daily_report(tasks)
    # 保存日报
    save_and_open_report(report)
    # 推送日报
    send_to_dingtalk(report)
    print("✅ 日报任务完成!")

# 每天 18:00 推送一次
schedule.every().day.at("18:00").do(job)

print("🟢 日报推送服务已启动,等待定时任务...")
while True:
    schedule.run_pending()
    time.sleep(60)

Step 4:定时任务自动化

  • Windows 任务计划程序 → 每天 6:00 执行
  • 可直接ai提问「如何添加 Python 脚本到 Windows 任务计划程序」找到具体步骤
  • 可直接ai提问「如何使用钉钉机器人,推送信息到钉钉」找到具体步骤
  • 验证任务是否按时推送,下面是我的推送截图

推送截图

4.总结

  • 节省大量重复性劳动
  • 可以直接通过任务管理系统管理任务,包括细节,让ai帮我做总结,减少无用的心力耗费

5.其它

posted @ 2025-09-04 11:44  卷叶小树  阅读(133)  评论(0)    收藏  举报