本文分享了一个从日常痛点出发的自动化实践:如何通过 Python + Trello API + ChatGPT + 钉钉机器人,实现从任务收集、智能总结到日报推送的全流程自动化。
核心步骤包括:调用 Trello API 获取每日任务 → 利用 ChatGPT 自动生成结构化的 CSV 日报 → 本地保存并推送至钉钉群 → 借助 Windows 任务计划程序实现每天定时推送。
通过这一流程,完全摆脱了重复的手工粘贴与编写日报的工作,让日报生成更高效、更专业,同时也为 AI 在实际工作场景中的落地提供了一个实用范例。
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}×tamp={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.其它