
1. 滴答清单API基础从零搭建Python连接环境滴答清单TickTick作为一款广受欢迎的任务管理工具其网页版API为开发者提供了丰富的自动化操作可能性。我们先从最基础的环境配置开始确保你能顺利建立起Python与滴答清单服务的通信桥梁。首先需要安装必要的Python库。除了常规的requests库外由于滴答清单使用HTTP/2协议我们还需要hyper库的支持pip install requests hyper认证环节是整个API调用的核心。滴答清单采用Cookie验证机制我们需要从浏览器中获取关键凭证。具体操作步骤如下登录网页版滴答清单dida365.com打开开发者工具F12在Application Cookies中找到名为t的cookie值这个t值就是我们的通行证建议将其保存在环境变量中。我通常会创建一个config.py文件来集中管理这些敏感信息# config.py COOKIE_T 你的实际cookie值基础请求类的构建需要考虑几个关键点HTTP/2适配、请求头管理和cookie设置。下面是我经过多次调试后总结出的稳定配置方案from hyper.contrib import HTTP20Adapter from requests import session import json class TickTickBase: def __init__(self): self.session session() self.base_url https://api.dida365.com self.session.mount(self.base_url, HTTP20Adapter()) # 关键请求头配置 self.session.headers.update({ user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64), x-device: web_app, content-type: application/json }) # 设置认证cookie self.session.cookies.set(t, COOKIE_T)在实际使用中我发现x-device头信息的完整性对API稳定性影响很大。经过测试完整的设备信息应该包含浏览器版本和设备标识但滴答清单的API对这部分校验并不严格我们使用简化的配置即可正常工作。2. 核心API接口详解与实战封装2.1 任务增删改查的完整实现任务管理是滴答清单最核心的功能我们将其封装成具有完整CRUD功能的Python类。首先来看任务创建接口这里有几个容易踩坑的参数需要特别注意def create_task(self, title, content, project_idNone, due_dateNone): 创建新任务 :param due_date: 格式必须为2023-08-20T15:00形式 task_data { title: title, content: content, projectId: project_id or self.inbox_id, timeZone: Asia/Shanghai, isAllDay: False if due_date else True } if due_date: task_data.update({ startDate: due_date, dueDate: due_date }) return self._post(/api/v2/task, jsontask_data)删除任务接口看似简单但实际开发中我发现需要特别注意任务ID与项目ID的关联性。正确的删除操作需要同时指定这两个IDdef delete_task(self, task_id, project_idNone): payload { delete: [{ taskId: task_id, projectId: project_id or self.inbox_id }] } return self._post(/api/v2/batch/task, jsonpayload)查询功能我封装了三种常用场景按关键词搜索、按项目筛选和获取最近任务。其中关键词搜索的实现最有技巧性def search_tasks(self, keyword, project_idNone, limit100): params {query: keyword, limit: limit} if project_id: params[projectId] project_id tasks self._get(/api/v2/search/task, paramsparams) return sorted(tasks, keylambda x: x.get(dueDate, ), reverseTrue)2.2 高级功能子任务与提醒设置在实际使用中复杂任务往往需要拆解为子任务。滴答清单API对子任务的支持比较特殊需要通过items数组来实现def add_subtasks(self, parent_id, subtasks): 添加子任务 :param subtasks: 子任务标题列表如[购买材料, 准备工具] subtask_items [{ id: self._generate_id(), title: title, status: 0 # 0表示未完成 } for title in subtasks] update_data { id: parent_id, items: subtask_items } return self.update_task(update_data)提醒功能的时间参数格式是个大坑。滴答清单支持绝对时间和相对时间两种格式经过反复测试最可靠的设置方式是这样的def add_reminders(self, task_id, reminders): 设置提醒 :param reminders: 提醒时间列表支持两种格式 绝对时间2023-08-20T15:00:00.0000800 相对时间-PT30M表示任务前30分钟 reminder_objects [{ id: self._generate_id(), trigger: fTRIGGER:{reminder} } for reminder in reminders] update_data { id: task_id, reminders: reminder_objects } return self.update_task(update_data)3. 项目与标签管理实战技巧3.1 项目列表的高效组织滴答清单允许创建多级项目结构这在API中体现为projectGroup的概念。获取所有项目的接口返回的是扁平化列表我们需要自己处理层级关系def get_projects_tree(self): flat_projects self._get(/api/v2/projects) tree {} for proj in flat_projects: if proj[groupId]: if proj[groupId] not in tree: tree[proj[groupId]] [] tree[proj[groupId]].append(proj) else: tree[proj[id]] proj return tree创建新项目时sortType参数控制着项目在列表中的显示顺序。经过反复试验我总结出这些经验值默认排序name按名称排序dueDate按截止日期排序priority按优先级排序def create_project(self, name, group_idNone, sort_type): project_data { name: name, listType: group if group_id else normal, sortType: sort_type } if group_id: project_data[groupId] group_id return self._post(/api/v2/project, jsonproject_data)3.2 标签系统的妙用标签在任务管理中常常被忽视但用好了能极大提升效率。滴答清单的标签API有几个实用技巧批量添加标签时我发现服务端对并发请求有限制最佳实践是使用batch接口def add_tags_to_task(self, task_id, tags): update_data { id: task_id, tags: tags # 标签名列表如[重要, 工作] } return self.update_task(update_data)获取所有标签的接口比较隐蔽需要通过用户状态接口获取def get_all_tags(self): user_status self._get(/api/v2/user/status) return user_status.get(tags, [])4. 自动化实战典型场景代码示例4.1 每日待办自动生成系统我每天早上都会运行这个脚本自动生成当天的固定任务模板。核心逻辑包括读取预设的任务模板根据当天是周几调整特定任务自动设置合理的提醒时间def generate_daily_tasks(): weekday datetime.now().weekday() template { 工作日: [ (晨间阅读, 08:00), (日报, 17:30) ], 周一: [ (周例会, 10:00, [工作]) ], 周五: [ (周总结, 15:00, [工作, 重要]) ] } tasks template[工作日] if weekday 0: # 周一 tasks.extend(template[周一]) elif weekday 4: # 周五 tasks.extend(template[周五]) for title, due_time, *extra in tasks: tags extra[0] if extra else [] due_date f{datetime.now().strftime(%Y-%m-%d)}T{due_time} client.create_task(title, due_datedue_date, tagstags)4.2 任务自动归档脚本这个脚本我设置为每周日凌晨运行主要完成查找所有已完成的任务按项目分类归档生成简单的完成统计报告def archive_completed_tasks(): completed client.search_tasks(statuscompleted) report {} for task in completed: project_name client.get_project_name(task[projectId]) if project_name not in report: report[project_name] 0 report[project_name] 1 # 添加归档标签 client.add_tags_to_task(task[id], [已归档]) # 生成Markdown格式报告 markdown [## 本周任务完成统计, ] for project, count in report.items(): markdown.append(f- {project}: {count}项) with open(weekly_report.md, w) as f: f.write(\n.join(markdown))4.3 智能提醒增强系统基础提醒功能有限我开发了这个增强系统来实现重要任务提前3天开始每日提醒截止前2小时再次提醒超期任务自动升级优先级def enhance_reminders(): tasks client.search_tasks() for task in tasks: if 重要 in task.get(tags, []): due_date task.get(dueDate) if not due_date: continue # 解析原始提醒设置 original_reminders task.get(reminders, []) # 添加提前3天提醒 new_reminders [-PT72H] [ r[trigger].replace(TRIGGER:, ) for r in original_reminders ] # 更新任务 client.add_reminders(task[id], new_reminders) # 检查是否超期 if due_date datetime.now().isoformat(): client.update_task({ id: task[id], priority: 2 # 提升优先级 })