# 滴答清单 Python SDK
这是一个非官方的滴答清单(TickTick/Dida365) Python SDK,用于访问滴答清单的API。
## 安装
```bash
# 使用指定源安装(推荐)
pip install didatodolist --index-url https://pypi.org/simple
# 或者直接安装(如果默认源访问不了,请使用上面的命令)
pip install didatodolist
```
## 快速开始
### 导入必要的类
```python
from dida import DidaClient # 导入所需的所有类
```
### 客户端初始化和认证
```python
# 方式1:使用邮箱密码初始化
client = DidaClient(email="your_email@example.com", password="your_password")
# 获取token(如果你需要保存下来下次使用)
token = client.token
print(f"你的token是: {token}")
# 方式2:使用已有token初始化(推荐,避免多次登录)
client = DidaClient(token="your_token")
```
### 基础使用
```python
# 获取所有任务
tasks = client.tasks.get_all_tasks()
# 获取所有笔记
notes = client.tasks.get_all_notes()
# 创建任务
task = client.tasks.create_task({
'title': '测试任务',
'content': '任务详细内容',
'priority': 3 # 优先级:0-最低,1-低,3-中,5-高
})
# 创建笔记
note = client.tasks.create_note({
'title': '测试笔记',
'content': '笔记内容'
})
# 更新任务
task = client.tasks.update_task(task['id'], {
'title': '更新后的任务标题',
'content': '更新后的内容'
})
# 更新笔记
note = client.tasks.update_note(note['id'], {
'title': '更新后的笔记标题',
'content': '更新后的内容'
})
# 删除任务或笔记
client.tasks.delete(item_id, project_id)
```
### 任务分析和统计功能
#### 1. 按时间范围查询任务
```python
# 获取今天的任务
today_tasks = client.tasks.get_today_tasks()
# 返回格式:{'已完成': [...], '未完成': [...]}
# 获取本周的任务
week_tasks = client.tasks.get_this_week_tasks()
# 获取本月的任务
month_tasks = client.tasks.get_this_month_tasks()
# 获取未来7天的任务
next_7_days_tasks = client.tasks.get_next_7_days_tasks()
# 获取过期任务
overdue_tasks = client.tasks.get_overdue_tasks()
```
#### 2. 按优先级查询任务
```python
# 获取所有高优先级任务
high_priority_tasks = client.tasks.get_tasks_by_priority(priority=5)
# 获取所有中优先级任务
medium_priority_tasks = client.tasks.get_tasks_by_priority(priority=3)
# 获取所有低优先级任务
low_priority_tasks = client.tasks.get_tasks_by_priority(priority=1)
# 获取所有最低优先级任务
lowest_priority_tasks = client.tasks.get_tasks_by_priority(priority=0)
```
#### 3. 获取任务统计信息
```python
# 获取任务统计信息
stats = client.tasks.get_task_statistics()
# 统计信息包括:
print(f"总任务数: {stats['total_tasks']}")
print(f"已完成任务数: {stats['completed_tasks']}")
print(f"未完成任务数: {stats['uncompleted_tasks']}")
print(f"过期任务数: {stats['overdue_tasks']}")
print(f"各优先级任务数: {stats['priority_stats']}")
print(f"今日完成率: {stats['today_completion_rate']}%")
print(f"本周完成率: {stats['week_completion_rate']}%")
print(f"本月完成率: {stats['month_completion_rate']}%")
```
#### 4. 获取任务趋势数据
```python
# 获取最近30天的任务趋势
trends = client.tasks.get_task_trends(days=30)
# 趋势数据包括:
print("日期列表:", trends['dates'])
print("每日完成数:", trends['completed_counts'])
print("每日新建数:", trends['created_counts'])
print("每日完成率:", trends['completion_rates'])
# 可以用这些数据绘制趋势图,例如使用matplotlib:
import matplotlib.pyplot as plt
plt.figure(figsize=(12, 6))
plt.plot(trends['dates'], trends['completion_rates'], marker='o')
plt.title('任务完成率趋势')
plt.xlabel('日期')
plt.ylabel('完成率(%)')
plt.xticks(rotation=45)
plt.grid(True)
plt.show()
```
### 任务重复规则说明
任务可以设置不同类型的重复规则,支持以下几种方式:
```python
# 1. 每天重复
task = client.tasks.create_task({
'title': '每日任务',
'content': '这是一个每天重复的任务',
'startDate': '2025-02-20T09:00:00.000+0000',
'repeatFlag': '每天'
})
# 2. 每周重复(使用开始日期的星期几)
task = client.tasks.create_task({
'title': '每周任务',
'startDate': '2025-02-20T09:00:00.000+0000', # 如果是周三创建,则每周三重复
'repeatFlag': '每周'
})
# 3. 每月重复(使用开始日期的日期)
task = client.tasks.create_task({
'title': '每月任务',
'startDate': '2025-02-20T09:00:00.000+0000', # 如果20号创建,则每月20号重复
'repeatFlag': '每月'
})
# 4. 每年重复(使用开始日期的月份和日期)
task = client.tasks.create_task({
'title': '每年任务',
'startDate': '2025-02-20T09:00:00.000+0000', # 如果2月20日创建,则每年2月20日重复
'repeatFlag': '每年'
})
# 5. 每周工作日(周一至周五)
task = client.tasks.create_task({
'title': '工作日任务',
'startDate': '2025-02-20T09:00:00.000+0000',
'repeatFlag': '每周工作日'
})
# 6. 法定工作日(跳过节假日和周末)
task = client.tasks.create_task({
'title': '法定工作日任务',
'startDate': '2025-02-20T09:00:00.000+0000',
'repeatFlag': '法定工作日'
})
# 7. 艾宾浩斯记忆法
task = client.tasks.create_task({
'title': '记忆任务',
'startDate': '2025-02-20T09:00:00.000+0000',
'repeatFlag': '艾宾浩斯记忆法'
})
# 8. 自定义重复规则(高级用法)
task = client.tasks.create_task({
'title': '自定义重复任务',
'startDate': '2025-02-20T09:00:00.000+0000',
'repeatFlag': 'RRULE:FREQ=WEEKLY;INTERVAL=1;BYDAY=MO,TU,WE,TH,FR',
'repeatFrom': '2'
})
```
重复规则参数说明:
1. 基础重复规则:
- `每天`: 每天重复一次
- `每周`: 每周重复一次,重复日期与任务开始日期的星期几相同
- `每月`: 每月重复一次,重复日期与任务开始日期的日期相同
- `每年`: 每年重复一次,重复日期与任务开始日期的月份和日期相同
- `每周工作日`: 周一至周五每天重复
- `法定工作日`: 跳过节假日和周末
- `艾宾浩斯记忆法`: 按照记忆曲线进行重复
2. 重要说明:
- 每周重复:会自动使用任务开始日期的星期几作为重复日期
- 每月重复:会自动使用任务开始日期的日期作为重复日期
- 每年重复:会自动使用任务开始日期的月份和日期作为重复日期
3. 其他重要参数:
- startDate: 开始时间,必须使用 ISO 8601 格式(YYYY-MM-DDTHH:mm:ss.SSSZ)
- timeZone: 时区,建议使用 'Asia/Shanghai'
注意事项:
1. 所有重复规则都会自动处理:
- 设置正确的重复规则格式
- 设置合适的重复起始时间
- 处理时区设置
2. 修改重复规则可能会影响已经生成的重复实例
3. 对于特殊情况,可以使用自定义重复规则(RRULE格式)
## 详细文档
### 任务和笔记的数据结构
```python
{
'id': '任务或笔记ID',
'title': '标题',
'content': '内容',
'priority': 优先级(0-5),
'status': 状态(0-未完成, 2-已完成),
'startDate': '开始时间 (YYYY-MM-DD HH:MM:SS)',
'dueDate': '截止时间 (YYYY-MM-DD HH:MM:SS)',
'projectName': '所属项目名称',
'projectId': '项目ID',
'projectKind': '项目类型(TASK/NOTE)',
'tagDetails': [ # 标签详情
{
'name': '标签名称',
'label': '标签显示名称'
}
],
'kind': '类型(TEXT/NOTE)',
'isAllDay': '是否全天',
'reminder': '提醒设置',
'repeatFlag': '重复设置',
'items': '子项目列表',
'progress': '进度(0-100)',
'modifiedTime': '修改时间 (YYYY-MM-DD HH:MM:SS)',
'createdTime': '创建时间 (YYYY-MM-DD HH:MM:SS)',
'completedTime': '完成时间 (YYYY-MM-DD HH:MM:SS)',
'completedUserId': '完成用户ID',
'isCompleted': '是否已完成(true/false)'
}
```
### 筛选条件说明
获取任务或笔记时可以使用以下筛选条件:
```python
filters = {
# 基础筛选
'status': 0, # 任务状态 (0-未完成, 2-已完成)
'priority': 3, # 优先级 (0-最低, 1-低, 3-中, 5-高)
'project_id': 'xxx', # 项目ID
'project_name': '工作', # 项目名称(支持模糊匹配)
'column_id': 'xxx', # 看板列ID
# 标签筛选
'tag_names': ['工作', '重要'], # 包含任意一个标签即可(OR关系)
'tag_names_all': ['工作', '重要'], # 必须包含所有标签(AND关系)
# 日期筛选
'start_date': '2024-02-19 00:00:00', # 开始时间
'due_date': '2024-02-20 00:00:00', # 截止时间
'has_due_date': True, # 是否有截止时间
'has_start_date': True, # 是否有开始时间
# 完成状态筛选
'is_completed': True, # 是否已完成
# 进度筛选
'min_progress': 50, # 最小进度
'max_progress': 100, # 最大进度
# 模糊搜索
'keyword': '会议', # 关键词(会搜索标题、内容、项目名称和标签)
# 创建时间筛选
'created_after': '2024-02-19 00:00:00', # 在此时间后创建
'created_before': '2024-02-20 00:00:00', # 在此时间前创建
# 修改时间筛选
'modified_after': '2024-02-19 00:00:00', # 在此时间后修改
'modified_before': '2024-02-20 00:00:00', # 在此时间前修改
# 子任务筛选
'has_items': True, # 是否有子任务
'min_items': 1, # 最少子任务数
'max_items': 5 # 最多子任务数
}
# 使用筛选条件获取任务
tasks = client.tasks.get_all_tasks(filters)
```
### 筛选示例
1. 标签筛选示例:
```python
# 搜索包含"工作"或"重要"任意一个标签的任务
tasks = client.tasks.get_all_tasks({
'tag_names': ['工作', '重要']
})
# 搜索同时包含"工作"和"重要"两个标签的任务
tasks = client.tasks.get_all_tasks({
'tag_names_all': ['工作', '重要']
})
# 也支持单个标签筛选
tasks = client.tasks.get_all_tasks({
'tag_names': '工作' # 或 'tag_names_all': '工作'
})
# 标签筛选可以和其他条件组合
tasks = client.tasks.get_all_tasks({
'tag_names': ['工作', '重要'],
'is_completed': False,
'priority': 5
})
```
2. 按优先级和状态筛选:
```python
# 获取所有高优先级且未完成的任务
tasks = client.tasks.get_all_tasks({
'priority': 5,
'is_completed': False
})
# 获取所有已完成的中优先级任务
tasks = client.tasks.get_all_tasks({
'priority': 3,
'is_completed': True
})
```
3. 按日期范围筛选:
```python
# 获取特定日期范围内的任务
tasks = client.tasks.get_all_tasks({
'created_after': '2024-02-19 00:00:00',
'created_before': '2024-02-20 00:00:00'
})
# 获取最近修改的任务
tasks = client.tasks.get_all_tasks({
'modified_after': '2024-02-19 00:00:00'
})
```
4. 按进度筛选:
```python
# 获取进度超过50%的任务
tasks = client.tasks.get_all_tasks({
'min_progress': 50
})
# 获取进度在30%-70%之间的任务
tasks = client.tasks.get_all_tasks({
'min_progress': 30,
'max_progress': 70
})
```
5. 复合条件筛选:
```python
# 获取工作项目中的高优先级、有截止日期且未完成的任务
tasks = client.tasks.get_all_tasks({
'project_name': '工作',
'priority': 5,
'has_due_date': True,
'is_completed': False
})
# 获取包含特定标签且有子任务的任务
tasks = client.tasks.get_all_tasks({
'tag_names': ['重要', '工作'],
'has_items': True
})
```
6. 看板相关筛选:
```python
# 获取特定看板列的任务
tasks = client.tasks.get_all_tasks({
'column_id': 'xxx'
})
# 获取特定项目中未完成的看板任务
tasks = client.tasks.get_all_tasks({
'project_id': 'xxx',
'column_id': 'xxx',
'is_completed': False
})
```
## 版本历史
### 0.1.10 (2024-02-19)
- 修复任务完成状态判断逻辑
- 同时检查 completedTime 和 completedUserId
- 优化日期格式解析
- 改进任务筛选流程
### 0.1.9 (2024-02-19)
- 修复任务筛选功能中的缩进错误
- 优化代码结构
- 添加自动发布功能
- 支持通过 git commit 触发自动发布
- 自动递增版本号
- 自动构建和发布到 PyPI
### 0.1.8 (2024-02-19)
- 重构任务完成状态相关功能
- 新增专门的已完成任务获取接口
- 优化任务完成状态判断逻辑
- 改进任务统计和分析功能
- 数据结构优化
- 添加完成时间和完成用户ID字段
- 移除不必要的栏目状态判断
- 提升代码性能和可维护性
### 0.1.7 (2024-02-19)
- 添加任务分析和统计功能
- 按时间范围查询任务(今天/本周/本月/未来7天)
- 按优先级查询任务
- 获取任务统计信息
- 获取任务趋势数据
- 支持任务完成率统计和趋势分析
- 支持过期任务查询
- 优化代码结构和性能
- 完善文档和使用示例
### 0.1.6 (2024-02-19)
- 改进任务完成状态判断逻辑
- 新增栏目信息管理,通过栏目状态判断任务是否完成
- 支持看板视图中的任务状态判断
- 修复任务完成状态判断不准确的问题
- 优化代码结构
- 重构任务分组方法,使用更清晰的英文键名
- 改进栏目信息的存储和管理
- 提升代码可维护性
### 0.1.5 (2024-02-19)
- 添加任务分析和统计功能
- 按时间范围查询任务(今天/本周/本月/未来7天)
- 按优先级查询任务
- 获取任务统计信息
- 获取任务趋势数据
- 支持任务完成率统计和趋势分析
- 支持过期任务查询
- 优化代码结构和性能
- 完善文档和使用示例
### 0.1.4 (2024-02-19)
- 分离任务和笔记的API操作
- 简化数据结构,只保留必要字段
- 合并项目和标签信息到返回数据中
- 优化筛选功能
- 改进API文档和使用示例
### 0.1.3 (2024-02-18)
- 添加更多任务字段支持
- 完善文档说明
- 添加Python 3.11支持
### 0.1.2 (2024-02-15)
- 初始版本发布
- 基本的任务、项目、标签管理功能
## 注意事项
1. 任务和笔记的区别:
- 任务(TEXT):支持完成状态、优先级、提醒等功能
- 笔记(NOTE):主要用于记录信息,不支持完成状态和提醒
2. 数据结构已经过优化:
- 移除了不必要的字段(如排序、ID等)
- 添加了更有意义的字段(如项目名称、标签详情等)
- 保持数据结构的简洁性和可读性
3. API调用建议:
- 使用token方式认证,避免频繁登录
- 合理使用筛选条件,减少数据传输
- 注意API调用频率限制
4. 任务分析和统计功能使用建议:
- 定期查看任务统计信息,了解整体任务完成情况
- 使用趋势数据分析工作效率变化
- 及时处理过期任务
- 合理安排高优先级任务
## 许可证
MIT License
## 联系方式
- 作者:xieyu
- 邮箱:523018705@qq.com
Raw data
{
"_id": null,
"home_page": "https://github.com/xieyu567/dida",
"name": "didatodolist",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.7",
"maintainer_email": null,
"keywords": "dida365 ticktick todo task management api sdk",
"author": "xieyu",
"author_email": "523018705@qq.com",
"download_url": "https://files.pythonhosted.org/packages/5a/04/2bc0203cc34ae944fbb32be836c2fa9dfb5adf069530a7495a860a5c7533/didatodolist-0.2.8.tar.gz",
"platform": null,
"description": "# \u6ef4\u7b54\u6e05\u5355 Python SDK\n\n\u8fd9\u662f\u4e00\u4e2a\u975e\u5b98\u65b9\u7684\u6ef4\u7b54\u6e05\u5355(TickTick/Dida365) Python SDK\uff0c\u7528\u4e8e\u8bbf\u95ee\u6ef4\u7b54\u6e05\u5355\u7684API\u3002\n\n## \u5b89\u88c5\n\n```bash\n# \u4f7f\u7528\u6307\u5b9a\u6e90\u5b89\u88c5\uff08\u63a8\u8350\uff09\npip install didatodolist --index-url https://pypi.org/simple\n\n# \u6216\u8005\u76f4\u63a5\u5b89\u88c5\uff08\u5982\u679c\u9ed8\u8ba4\u6e90\u8bbf\u95ee\u4e0d\u4e86\uff0c\u8bf7\u4f7f\u7528\u4e0a\u9762\u7684\u547d\u4ee4\uff09\npip install didatodolist\n```\n\n## \u5feb\u901f\u5f00\u59cb\n\n### \u5bfc\u5165\u5fc5\u8981\u7684\u7c7b\n```python\nfrom dida import DidaClient # \u5bfc\u5165\u6240\u9700\u7684\u6240\u6709\u7c7b\n```\n\n### \u5ba2\u6237\u7aef\u521d\u59cb\u5316\u548c\u8ba4\u8bc1\n```python\n# \u65b9\u5f0f1\uff1a\u4f7f\u7528\u90ae\u7bb1\u5bc6\u7801\u521d\u59cb\u5316\nclient = DidaClient(email=\"your_email@example.com\", password=\"your_password\")\n# \u83b7\u53d6token\uff08\u5982\u679c\u4f60\u9700\u8981\u4fdd\u5b58\u4e0b\u6765\u4e0b\u6b21\u4f7f\u7528\uff09\ntoken = client.token\nprint(f\"\u4f60\u7684token\u662f: {token}\")\n\n# \u65b9\u5f0f2\uff1a\u4f7f\u7528\u5df2\u6709token\u521d\u59cb\u5316\uff08\u63a8\u8350\uff0c\u907f\u514d\u591a\u6b21\u767b\u5f55\uff09\nclient = DidaClient(token=\"your_token\")\n```\n\n### \u57fa\u7840\u4f7f\u7528\n\n```python\n# \u83b7\u53d6\u6240\u6709\u4efb\u52a1\ntasks = client.tasks.get_all_tasks()\n\n# \u83b7\u53d6\u6240\u6709\u7b14\u8bb0\nnotes = client.tasks.get_all_notes()\n\n# \u521b\u5efa\u4efb\u52a1\ntask = client.tasks.create_task({\n 'title': '\u6d4b\u8bd5\u4efb\u52a1',\n 'content': '\u4efb\u52a1\u8be6\u7ec6\u5185\u5bb9',\n 'priority': 3 # \u4f18\u5148\u7ea7\uff1a0-\u6700\u4f4e\uff0c1-\u4f4e\uff0c3-\u4e2d\uff0c5-\u9ad8\n})\n\n# \u521b\u5efa\u7b14\u8bb0\nnote = client.tasks.create_note({\n 'title': '\u6d4b\u8bd5\u7b14\u8bb0',\n 'content': '\u7b14\u8bb0\u5185\u5bb9'\n})\n\n# \u66f4\u65b0\u4efb\u52a1\ntask = client.tasks.update_task(task['id'], {\n 'title': '\u66f4\u65b0\u540e\u7684\u4efb\u52a1\u6807\u9898',\n 'content': '\u66f4\u65b0\u540e\u7684\u5185\u5bb9'\n})\n\n# \u66f4\u65b0\u7b14\u8bb0\nnote = client.tasks.update_note(note['id'], {\n 'title': '\u66f4\u65b0\u540e\u7684\u7b14\u8bb0\u6807\u9898',\n 'content': '\u66f4\u65b0\u540e\u7684\u5185\u5bb9'\n})\n\n# \u5220\u9664\u4efb\u52a1\u6216\u7b14\u8bb0\nclient.tasks.delete(item_id, project_id)\n```\n\n### \u4efb\u52a1\u5206\u6790\u548c\u7edf\u8ba1\u529f\u80fd\n\n#### 1. \u6309\u65f6\u95f4\u8303\u56f4\u67e5\u8be2\u4efb\u52a1\n\n```python\n# \u83b7\u53d6\u4eca\u5929\u7684\u4efb\u52a1\ntoday_tasks = client.tasks.get_today_tasks()\n# \u8fd4\u56de\u683c\u5f0f\uff1a{'\u5df2\u5b8c\u6210': [...], '\u672a\u5b8c\u6210': [...]}\n\n# \u83b7\u53d6\u672c\u5468\u7684\u4efb\u52a1\nweek_tasks = client.tasks.get_this_week_tasks()\n\n# \u83b7\u53d6\u672c\u6708\u7684\u4efb\u52a1\nmonth_tasks = client.tasks.get_this_month_tasks()\n\n# \u83b7\u53d6\u672a\u67657\u5929\u7684\u4efb\u52a1\nnext_7_days_tasks = client.tasks.get_next_7_days_tasks()\n\n# \u83b7\u53d6\u8fc7\u671f\u4efb\u52a1\noverdue_tasks = client.tasks.get_overdue_tasks()\n```\n\n#### 2. \u6309\u4f18\u5148\u7ea7\u67e5\u8be2\u4efb\u52a1\n\n```python\n# \u83b7\u53d6\u6240\u6709\u9ad8\u4f18\u5148\u7ea7\u4efb\u52a1\nhigh_priority_tasks = client.tasks.get_tasks_by_priority(priority=5)\n\n# \u83b7\u53d6\u6240\u6709\u4e2d\u4f18\u5148\u7ea7\u4efb\u52a1\nmedium_priority_tasks = client.tasks.get_tasks_by_priority(priority=3)\n\n# \u83b7\u53d6\u6240\u6709\u4f4e\u4f18\u5148\u7ea7\u4efb\u52a1\nlow_priority_tasks = client.tasks.get_tasks_by_priority(priority=1)\n\n# \u83b7\u53d6\u6240\u6709\u6700\u4f4e\u4f18\u5148\u7ea7\u4efb\u52a1\nlowest_priority_tasks = client.tasks.get_tasks_by_priority(priority=0)\n```\n\n#### 3. \u83b7\u53d6\u4efb\u52a1\u7edf\u8ba1\u4fe1\u606f\n\n```python\n# \u83b7\u53d6\u4efb\u52a1\u7edf\u8ba1\u4fe1\u606f\nstats = client.tasks.get_task_statistics()\n\n# \u7edf\u8ba1\u4fe1\u606f\u5305\u62ec\uff1a\nprint(f\"\u603b\u4efb\u52a1\u6570: {stats['total_tasks']}\")\nprint(f\"\u5df2\u5b8c\u6210\u4efb\u52a1\u6570: {stats['completed_tasks']}\")\nprint(f\"\u672a\u5b8c\u6210\u4efb\u52a1\u6570: {stats['uncompleted_tasks']}\")\nprint(f\"\u8fc7\u671f\u4efb\u52a1\u6570: {stats['overdue_tasks']}\")\nprint(f\"\u5404\u4f18\u5148\u7ea7\u4efb\u52a1\u6570: {stats['priority_stats']}\")\nprint(f\"\u4eca\u65e5\u5b8c\u6210\u7387: {stats['today_completion_rate']}%\")\nprint(f\"\u672c\u5468\u5b8c\u6210\u7387: {stats['week_completion_rate']}%\")\nprint(f\"\u672c\u6708\u5b8c\u6210\u7387: {stats['month_completion_rate']}%\")\n```\n\n#### 4. \u83b7\u53d6\u4efb\u52a1\u8d8b\u52bf\u6570\u636e\n\n```python\n# \u83b7\u53d6\u6700\u8fd130\u5929\u7684\u4efb\u52a1\u8d8b\u52bf\ntrends = client.tasks.get_task_trends(days=30)\n\n# \u8d8b\u52bf\u6570\u636e\u5305\u62ec\uff1a\nprint(\"\u65e5\u671f\u5217\u8868:\", trends['dates'])\nprint(\"\u6bcf\u65e5\u5b8c\u6210\u6570:\", trends['completed_counts'])\nprint(\"\u6bcf\u65e5\u65b0\u5efa\u6570:\", trends['created_counts'])\nprint(\"\u6bcf\u65e5\u5b8c\u6210\u7387:\", trends['completion_rates'])\n\n# \u53ef\u4ee5\u7528\u8fd9\u4e9b\u6570\u636e\u7ed8\u5236\u8d8b\u52bf\u56fe\uff0c\u4f8b\u5982\u4f7f\u7528matplotlib\uff1a\nimport matplotlib.pyplot as plt\n\nplt.figure(figsize=(12, 6))\nplt.plot(trends['dates'], trends['completion_rates'], marker='o')\nplt.title('\u4efb\u52a1\u5b8c\u6210\u7387\u8d8b\u52bf')\nplt.xlabel('\u65e5\u671f')\nplt.ylabel('\u5b8c\u6210\u7387(%)')\nplt.xticks(rotation=45)\nplt.grid(True)\nplt.show()\n```\n\n### \u4efb\u52a1\u91cd\u590d\u89c4\u5219\u8bf4\u660e\n\u4efb\u52a1\u53ef\u4ee5\u8bbe\u7f6e\u4e0d\u540c\u7c7b\u578b\u7684\u91cd\u590d\u89c4\u5219\uff0c\u652f\u6301\u4ee5\u4e0b\u51e0\u79cd\u65b9\u5f0f\uff1a\n\n```python\n# 1. \u6bcf\u5929\u91cd\u590d\ntask = client.tasks.create_task({\n 'title': '\u6bcf\u65e5\u4efb\u52a1',\n 'content': '\u8fd9\u662f\u4e00\u4e2a\u6bcf\u5929\u91cd\u590d\u7684\u4efb\u52a1',\n 'startDate': '2025-02-20T09:00:00.000+0000',\n 'repeatFlag': '\u6bcf\u5929'\n})\n\n# 2. \u6bcf\u5468\u91cd\u590d\uff08\u4f7f\u7528\u5f00\u59cb\u65e5\u671f\u7684\u661f\u671f\u51e0\uff09\ntask = client.tasks.create_task({\n 'title': '\u6bcf\u5468\u4efb\u52a1',\n 'startDate': '2025-02-20T09:00:00.000+0000', # \u5982\u679c\u662f\u5468\u4e09\u521b\u5efa\uff0c\u5219\u6bcf\u5468\u4e09\u91cd\u590d\n 'repeatFlag': '\u6bcf\u5468'\n})\n\n# 3. \u6bcf\u6708\u91cd\u590d\uff08\u4f7f\u7528\u5f00\u59cb\u65e5\u671f\u7684\u65e5\u671f\uff09\ntask = client.tasks.create_task({\n 'title': '\u6bcf\u6708\u4efb\u52a1',\n 'startDate': '2025-02-20T09:00:00.000+0000', # \u5982\u679c20\u53f7\u521b\u5efa\uff0c\u5219\u6bcf\u670820\u53f7\u91cd\u590d\n 'repeatFlag': '\u6bcf\u6708'\n})\n\n# 4. \u6bcf\u5e74\u91cd\u590d\uff08\u4f7f\u7528\u5f00\u59cb\u65e5\u671f\u7684\u6708\u4efd\u548c\u65e5\u671f\uff09\ntask = client.tasks.create_task({\n 'title': '\u6bcf\u5e74\u4efb\u52a1',\n 'startDate': '2025-02-20T09:00:00.000+0000', # \u5982\u679c2\u670820\u65e5\u521b\u5efa\uff0c\u5219\u6bcf\u5e742\u670820\u65e5\u91cd\u590d\n 'repeatFlag': '\u6bcf\u5e74'\n})\n\n# 5. \u6bcf\u5468\u5de5\u4f5c\u65e5\uff08\u5468\u4e00\u81f3\u5468\u4e94\uff09\ntask = client.tasks.create_task({\n 'title': '\u5de5\u4f5c\u65e5\u4efb\u52a1',\n 'startDate': '2025-02-20T09:00:00.000+0000',\n 'repeatFlag': '\u6bcf\u5468\u5de5\u4f5c\u65e5'\n})\n\n# 6. \u6cd5\u5b9a\u5de5\u4f5c\u65e5\uff08\u8df3\u8fc7\u8282\u5047\u65e5\u548c\u5468\u672b\uff09\ntask = client.tasks.create_task({\n 'title': '\u6cd5\u5b9a\u5de5\u4f5c\u65e5\u4efb\u52a1',\n 'startDate': '2025-02-20T09:00:00.000+0000',\n 'repeatFlag': '\u6cd5\u5b9a\u5de5\u4f5c\u65e5'\n})\n\n# 7. \u827e\u5bbe\u6d69\u65af\u8bb0\u5fc6\u6cd5\ntask = client.tasks.create_task({\n 'title': '\u8bb0\u5fc6\u4efb\u52a1',\n 'startDate': '2025-02-20T09:00:00.000+0000',\n 'repeatFlag': '\u827e\u5bbe\u6d69\u65af\u8bb0\u5fc6\u6cd5'\n})\n\n# 8. \u81ea\u5b9a\u4e49\u91cd\u590d\u89c4\u5219\uff08\u9ad8\u7ea7\u7528\u6cd5\uff09\ntask = client.tasks.create_task({\n 'title': '\u81ea\u5b9a\u4e49\u91cd\u590d\u4efb\u52a1',\n 'startDate': '2025-02-20T09:00:00.000+0000',\n 'repeatFlag': 'RRULE:FREQ=WEEKLY;INTERVAL=1;BYDAY=MO,TU,WE,TH,FR',\n 'repeatFrom': '2'\n})\n```\n\n\u91cd\u590d\u89c4\u5219\u53c2\u6570\u8bf4\u660e\uff1a\n\n1. \u57fa\u7840\u91cd\u590d\u89c4\u5219\uff1a\n - `\u6bcf\u5929`: \u6bcf\u5929\u91cd\u590d\u4e00\u6b21\n - `\u6bcf\u5468`: \u6bcf\u5468\u91cd\u590d\u4e00\u6b21\uff0c\u91cd\u590d\u65e5\u671f\u4e0e\u4efb\u52a1\u5f00\u59cb\u65e5\u671f\u7684\u661f\u671f\u51e0\u76f8\u540c\n - `\u6bcf\u6708`: \u6bcf\u6708\u91cd\u590d\u4e00\u6b21\uff0c\u91cd\u590d\u65e5\u671f\u4e0e\u4efb\u52a1\u5f00\u59cb\u65e5\u671f\u7684\u65e5\u671f\u76f8\u540c\n - `\u6bcf\u5e74`: \u6bcf\u5e74\u91cd\u590d\u4e00\u6b21\uff0c\u91cd\u590d\u65e5\u671f\u4e0e\u4efb\u52a1\u5f00\u59cb\u65e5\u671f\u7684\u6708\u4efd\u548c\u65e5\u671f\u76f8\u540c\n - `\u6bcf\u5468\u5de5\u4f5c\u65e5`: \u5468\u4e00\u81f3\u5468\u4e94\u6bcf\u5929\u91cd\u590d\n - `\u6cd5\u5b9a\u5de5\u4f5c\u65e5`: \u8df3\u8fc7\u8282\u5047\u65e5\u548c\u5468\u672b\n - `\u827e\u5bbe\u6d69\u65af\u8bb0\u5fc6\u6cd5`: \u6309\u7167\u8bb0\u5fc6\u66f2\u7ebf\u8fdb\u884c\u91cd\u590d\n\n2. \u91cd\u8981\u8bf4\u660e\uff1a\n - \u6bcf\u5468\u91cd\u590d\uff1a\u4f1a\u81ea\u52a8\u4f7f\u7528\u4efb\u52a1\u5f00\u59cb\u65e5\u671f\u7684\u661f\u671f\u51e0\u4f5c\u4e3a\u91cd\u590d\u65e5\u671f\n - \u6bcf\u6708\u91cd\u590d\uff1a\u4f1a\u81ea\u52a8\u4f7f\u7528\u4efb\u52a1\u5f00\u59cb\u65e5\u671f\u7684\u65e5\u671f\u4f5c\u4e3a\u91cd\u590d\u65e5\u671f\n - \u6bcf\u5e74\u91cd\u590d\uff1a\u4f1a\u81ea\u52a8\u4f7f\u7528\u4efb\u52a1\u5f00\u59cb\u65e5\u671f\u7684\u6708\u4efd\u548c\u65e5\u671f\u4f5c\u4e3a\u91cd\u590d\u65e5\u671f\n\n3. \u5176\u4ed6\u91cd\u8981\u53c2\u6570\uff1a\n - startDate: \u5f00\u59cb\u65f6\u95f4\uff0c\u5fc5\u987b\u4f7f\u7528 ISO 8601 \u683c\u5f0f\uff08YYYY-MM-DDTHH:mm:ss.SSSZ\uff09\n - timeZone: \u65f6\u533a\uff0c\u5efa\u8bae\u4f7f\u7528 'Asia/Shanghai'\n\n\u6ce8\u610f\u4e8b\u9879\uff1a\n1. \u6240\u6709\u91cd\u590d\u89c4\u5219\u90fd\u4f1a\u81ea\u52a8\u5904\u7406\uff1a\n - \u8bbe\u7f6e\u6b63\u786e\u7684\u91cd\u590d\u89c4\u5219\u683c\u5f0f\n - \u8bbe\u7f6e\u5408\u9002\u7684\u91cd\u590d\u8d77\u59cb\u65f6\u95f4\n - \u5904\u7406\u65f6\u533a\u8bbe\u7f6e\n2. \u4fee\u6539\u91cd\u590d\u89c4\u5219\u53ef\u80fd\u4f1a\u5f71\u54cd\u5df2\u7ecf\u751f\u6210\u7684\u91cd\u590d\u5b9e\u4f8b\n3. \u5bf9\u4e8e\u7279\u6b8a\u60c5\u51b5\uff0c\u53ef\u4ee5\u4f7f\u7528\u81ea\u5b9a\u4e49\u91cd\u590d\u89c4\u5219\uff08RRULE\u683c\u5f0f\uff09\n\n## \u8be6\u7ec6\u6587\u6863\n\n### \u4efb\u52a1\u548c\u7b14\u8bb0\u7684\u6570\u636e\u7ed3\u6784\n```python\n{\n 'id': '\u4efb\u52a1\u6216\u7b14\u8bb0ID',\n 'title': '\u6807\u9898',\n 'content': '\u5185\u5bb9',\n 'priority': \u4f18\u5148\u7ea7(0-5),\n 'status': \u72b6\u6001(0-\u672a\u5b8c\u6210, 2-\u5df2\u5b8c\u6210),\n 'startDate': '\u5f00\u59cb\u65f6\u95f4 (YYYY-MM-DD HH:MM:SS)',\n 'dueDate': '\u622a\u6b62\u65f6\u95f4 (YYYY-MM-DD HH:MM:SS)',\n 'projectName': '\u6240\u5c5e\u9879\u76ee\u540d\u79f0',\n 'projectId': '\u9879\u76eeID',\n 'projectKind': '\u9879\u76ee\u7c7b\u578b(TASK/NOTE)',\n 'tagDetails': [ # \u6807\u7b7e\u8be6\u60c5\n {\n 'name': '\u6807\u7b7e\u540d\u79f0',\n 'label': '\u6807\u7b7e\u663e\u793a\u540d\u79f0'\n }\n ],\n 'kind': '\u7c7b\u578b(TEXT/NOTE)',\n 'isAllDay': '\u662f\u5426\u5168\u5929',\n 'reminder': '\u63d0\u9192\u8bbe\u7f6e',\n 'repeatFlag': '\u91cd\u590d\u8bbe\u7f6e',\n 'items': '\u5b50\u9879\u76ee\u5217\u8868',\n 'progress': '\u8fdb\u5ea6(0-100)',\n 'modifiedTime': '\u4fee\u6539\u65f6\u95f4 (YYYY-MM-DD HH:MM:SS)',\n 'createdTime': '\u521b\u5efa\u65f6\u95f4 (YYYY-MM-DD HH:MM:SS)',\n 'completedTime': '\u5b8c\u6210\u65f6\u95f4 (YYYY-MM-DD HH:MM:SS)',\n 'completedUserId': '\u5b8c\u6210\u7528\u6237ID',\n 'isCompleted': '\u662f\u5426\u5df2\u5b8c\u6210(true/false)'\n}\n```\n\n### \u7b5b\u9009\u6761\u4ef6\u8bf4\u660e\n\u83b7\u53d6\u4efb\u52a1\u6216\u7b14\u8bb0\u65f6\u53ef\u4ee5\u4f7f\u7528\u4ee5\u4e0b\u7b5b\u9009\u6761\u4ef6\uff1a\n```python\nfilters = {\n # \u57fa\u7840\u7b5b\u9009\n 'status': 0, # \u4efb\u52a1\u72b6\u6001 (0-\u672a\u5b8c\u6210, 2-\u5df2\u5b8c\u6210)\n 'priority': 3, # \u4f18\u5148\u7ea7 (0-\u6700\u4f4e, 1-\u4f4e, 3-\u4e2d, 5-\u9ad8)\n 'project_id': 'xxx', # \u9879\u76eeID\n 'project_name': '\u5de5\u4f5c', # \u9879\u76ee\u540d\u79f0\uff08\u652f\u6301\u6a21\u7cca\u5339\u914d\uff09\n 'column_id': 'xxx', # \u770b\u677f\u5217ID\n \n # \u6807\u7b7e\u7b5b\u9009\n 'tag_names': ['\u5de5\u4f5c', '\u91cd\u8981'], # \u5305\u542b\u4efb\u610f\u4e00\u4e2a\u6807\u7b7e\u5373\u53ef\uff08OR\u5173\u7cfb\uff09\n 'tag_names_all': ['\u5de5\u4f5c', '\u91cd\u8981'], # \u5fc5\u987b\u5305\u542b\u6240\u6709\u6807\u7b7e\uff08AND\u5173\u7cfb\uff09\n \n # \u65e5\u671f\u7b5b\u9009\n 'start_date': '2024-02-19 00:00:00', # \u5f00\u59cb\u65f6\u95f4\n 'due_date': '2024-02-20 00:00:00', # \u622a\u6b62\u65f6\u95f4\n 'has_due_date': True, # \u662f\u5426\u6709\u622a\u6b62\u65f6\u95f4\n 'has_start_date': True, # \u662f\u5426\u6709\u5f00\u59cb\u65f6\u95f4\n \n # \u5b8c\u6210\u72b6\u6001\u7b5b\u9009\n 'is_completed': True, # \u662f\u5426\u5df2\u5b8c\u6210\n \n # \u8fdb\u5ea6\u7b5b\u9009\n 'min_progress': 50, # \u6700\u5c0f\u8fdb\u5ea6\n 'max_progress': 100, # \u6700\u5927\u8fdb\u5ea6\n \n # \u6a21\u7cca\u641c\u7d22\n 'keyword': '\u4f1a\u8bae', # \u5173\u952e\u8bcd\uff08\u4f1a\u641c\u7d22\u6807\u9898\u3001\u5185\u5bb9\u3001\u9879\u76ee\u540d\u79f0\u548c\u6807\u7b7e\uff09\n \n # \u521b\u5efa\u65f6\u95f4\u7b5b\u9009\n 'created_after': '2024-02-19 00:00:00', # \u5728\u6b64\u65f6\u95f4\u540e\u521b\u5efa\n 'created_before': '2024-02-20 00:00:00', # \u5728\u6b64\u65f6\u95f4\u524d\u521b\u5efa\n \n # \u4fee\u6539\u65f6\u95f4\u7b5b\u9009\n 'modified_after': '2024-02-19 00:00:00', # \u5728\u6b64\u65f6\u95f4\u540e\u4fee\u6539\n 'modified_before': '2024-02-20 00:00:00', # \u5728\u6b64\u65f6\u95f4\u524d\u4fee\u6539\n \n # \u5b50\u4efb\u52a1\u7b5b\u9009\n 'has_items': True, # \u662f\u5426\u6709\u5b50\u4efb\u52a1\n 'min_items': 1, # \u6700\u5c11\u5b50\u4efb\u52a1\u6570\n 'max_items': 5 # \u6700\u591a\u5b50\u4efb\u52a1\u6570\n}\n\n# \u4f7f\u7528\u7b5b\u9009\u6761\u4ef6\u83b7\u53d6\u4efb\u52a1\ntasks = client.tasks.get_all_tasks(filters)\n```\n\n### \u7b5b\u9009\u793a\u4f8b\n\n1. \u6807\u7b7e\u7b5b\u9009\u793a\u4f8b\uff1a\n```python\n# \u641c\u7d22\u5305\u542b\"\u5de5\u4f5c\"\u6216\"\u91cd\u8981\"\u4efb\u610f\u4e00\u4e2a\u6807\u7b7e\u7684\u4efb\u52a1\ntasks = client.tasks.get_all_tasks({\n 'tag_names': ['\u5de5\u4f5c', '\u91cd\u8981']\n})\n\n# \u641c\u7d22\u540c\u65f6\u5305\u542b\"\u5de5\u4f5c\"\u548c\"\u91cd\u8981\"\u4e24\u4e2a\u6807\u7b7e\u7684\u4efb\u52a1\ntasks = client.tasks.get_all_tasks({\n 'tag_names_all': ['\u5de5\u4f5c', '\u91cd\u8981']\n})\n\n# \u4e5f\u652f\u6301\u5355\u4e2a\u6807\u7b7e\u7b5b\u9009\ntasks = client.tasks.get_all_tasks({\n 'tag_names': '\u5de5\u4f5c' # \u6216 'tag_names_all': '\u5de5\u4f5c'\n})\n\n# \u6807\u7b7e\u7b5b\u9009\u53ef\u4ee5\u548c\u5176\u4ed6\u6761\u4ef6\u7ec4\u5408\ntasks = client.tasks.get_all_tasks({\n 'tag_names': ['\u5de5\u4f5c', '\u91cd\u8981'],\n 'is_completed': False,\n 'priority': 5\n})\n```\n\n2. \u6309\u4f18\u5148\u7ea7\u548c\u72b6\u6001\u7b5b\u9009\uff1a\n```python\n# \u83b7\u53d6\u6240\u6709\u9ad8\u4f18\u5148\u7ea7\u4e14\u672a\u5b8c\u6210\u7684\u4efb\u52a1\ntasks = client.tasks.get_all_tasks({\n 'priority': 5,\n 'is_completed': False\n})\n\n# \u83b7\u53d6\u6240\u6709\u5df2\u5b8c\u6210\u7684\u4e2d\u4f18\u5148\u7ea7\u4efb\u52a1\ntasks = client.tasks.get_all_tasks({\n 'priority': 3,\n 'is_completed': True\n})\n```\n\n3. \u6309\u65e5\u671f\u8303\u56f4\u7b5b\u9009\uff1a\n```python\n# \u83b7\u53d6\u7279\u5b9a\u65e5\u671f\u8303\u56f4\u5185\u7684\u4efb\u52a1\ntasks = client.tasks.get_all_tasks({\n 'created_after': '2024-02-19 00:00:00',\n 'created_before': '2024-02-20 00:00:00'\n})\n\n# \u83b7\u53d6\u6700\u8fd1\u4fee\u6539\u7684\u4efb\u52a1\ntasks = client.tasks.get_all_tasks({\n 'modified_after': '2024-02-19 00:00:00'\n})\n```\n\n4. \u6309\u8fdb\u5ea6\u7b5b\u9009\uff1a\n```python\n# \u83b7\u53d6\u8fdb\u5ea6\u8d85\u8fc750%\u7684\u4efb\u52a1\ntasks = client.tasks.get_all_tasks({\n 'min_progress': 50\n})\n\n# \u83b7\u53d6\u8fdb\u5ea6\u572830%-70%\u4e4b\u95f4\u7684\u4efb\u52a1\ntasks = client.tasks.get_all_tasks({\n 'min_progress': 30,\n 'max_progress': 70\n})\n```\n\n5. \u590d\u5408\u6761\u4ef6\u7b5b\u9009\uff1a\n```python\n# \u83b7\u53d6\u5de5\u4f5c\u9879\u76ee\u4e2d\u7684\u9ad8\u4f18\u5148\u7ea7\u3001\u6709\u622a\u6b62\u65e5\u671f\u4e14\u672a\u5b8c\u6210\u7684\u4efb\u52a1\ntasks = client.tasks.get_all_tasks({\n 'project_name': '\u5de5\u4f5c',\n 'priority': 5,\n 'has_due_date': True,\n 'is_completed': False\n})\n\n# \u83b7\u53d6\u5305\u542b\u7279\u5b9a\u6807\u7b7e\u4e14\u6709\u5b50\u4efb\u52a1\u7684\u4efb\u52a1\ntasks = client.tasks.get_all_tasks({\n 'tag_names': ['\u91cd\u8981', '\u5de5\u4f5c'],\n 'has_items': True\n})\n```\n\n6. \u770b\u677f\u76f8\u5173\u7b5b\u9009\uff1a\n```python\n# \u83b7\u53d6\u7279\u5b9a\u770b\u677f\u5217\u7684\u4efb\u52a1\ntasks = client.tasks.get_all_tasks({\n 'column_id': 'xxx'\n})\n\n# \u83b7\u53d6\u7279\u5b9a\u9879\u76ee\u4e2d\u672a\u5b8c\u6210\u7684\u770b\u677f\u4efb\u52a1\ntasks = client.tasks.get_all_tasks({\n 'project_id': 'xxx',\n 'column_id': 'xxx',\n 'is_completed': False\n})\n```\n\n## \u7248\u672c\u5386\u53f2\n\n### 0.1.10 (2024-02-19)\n- \u4fee\u590d\u4efb\u52a1\u5b8c\u6210\u72b6\u6001\u5224\u65ad\u903b\u8f91\n - \u540c\u65f6\u68c0\u67e5 completedTime \u548c completedUserId\n - \u4f18\u5316\u65e5\u671f\u683c\u5f0f\u89e3\u6790\n - \u6539\u8fdb\u4efb\u52a1\u7b5b\u9009\u6d41\u7a0b\n\n### 0.1.9 (2024-02-19)\n- \u4fee\u590d\u4efb\u52a1\u7b5b\u9009\u529f\u80fd\u4e2d\u7684\u7f29\u8fdb\u9519\u8bef\n- \u4f18\u5316\u4ee3\u7801\u7ed3\u6784\n- \u6dfb\u52a0\u81ea\u52a8\u53d1\u5e03\u529f\u80fd\n - \u652f\u6301\u901a\u8fc7 git commit \u89e6\u53d1\u81ea\u52a8\u53d1\u5e03\n - \u81ea\u52a8\u9012\u589e\u7248\u672c\u53f7\n - \u81ea\u52a8\u6784\u5efa\u548c\u53d1\u5e03\u5230 PyPI\n\n### 0.1.8 (2024-02-19)\n- \u91cd\u6784\u4efb\u52a1\u5b8c\u6210\u72b6\u6001\u76f8\u5173\u529f\u80fd\n - \u65b0\u589e\u4e13\u95e8\u7684\u5df2\u5b8c\u6210\u4efb\u52a1\u83b7\u53d6\u63a5\u53e3\n - \u4f18\u5316\u4efb\u52a1\u5b8c\u6210\u72b6\u6001\u5224\u65ad\u903b\u8f91\n - \u6539\u8fdb\u4efb\u52a1\u7edf\u8ba1\u548c\u5206\u6790\u529f\u80fd\n- \u6570\u636e\u7ed3\u6784\u4f18\u5316\n - \u6dfb\u52a0\u5b8c\u6210\u65f6\u95f4\u548c\u5b8c\u6210\u7528\u6237ID\u5b57\u6bb5\n - \u79fb\u9664\u4e0d\u5fc5\u8981\u7684\u680f\u76ee\u72b6\u6001\u5224\u65ad\n - \u63d0\u5347\u4ee3\u7801\u6027\u80fd\u548c\u53ef\u7ef4\u62a4\u6027\n\n### 0.1.7 (2024-02-19)\n- \u6dfb\u52a0\u4efb\u52a1\u5206\u6790\u548c\u7edf\u8ba1\u529f\u80fd\n - \u6309\u65f6\u95f4\u8303\u56f4\u67e5\u8be2\u4efb\u52a1\uff08\u4eca\u5929/\u672c\u5468/\u672c\u6708/\u672a\u67657\u5929\uff09\n - \u6309\u4f18\u5148\u7ea7\u67e5\u8be2\u4efb\u52a1\n - \u83b7\u53d6\u4efb\u52a1\u7edf\u8ba1\u4fe1\u606f\n - \u83b7\u53d6\u4efb\u52a1\u8d8b\u52bf\u6570\u636e\n - \u652f\u6301\u4efb\u52a1\u5b8c\u6210\u7387\u7edf\u8ba1\u548c\u8d8b\u52bf\u5206\u6790\n - \u652f\u6301\u8fc7\u671f\u4efb\u52a1\u67e5\u8be2\n- \u4f18\u5316\u4ee3\u7801\u7ed3\u6784\u548c\u6027\u80fd\n- \u5b8c\u5584\u6587\u6863\u548c\u4f7f\u7528\u793a\u4f8b\n\n### 0.1.6 (2024-02-19)\n- \u6539\u8fdb\u4efb\u52a1\u5b8c\u6210\u72b6\u6001\u5224\u65ad\u903b\u8f91\n - \u65b0\u589e\u680f\u76ee\u4fe1\u606f\u7ba1\u7406\uff0c\u901a\u8fc7\u680f\u76ee\u72b6\u6001\u5224\u65ad\u4efb\u52a1\u662f\u5426\u5b8c\u6210\n - \u652f\u6301\u770b\u677f\u89c6\u56fe\u4e2d\u7684\u4efb\u52a1\u72b6\u6001\u5224\u65ad\n - \u4fee\u590d\u4efb\u52a1\u5b8c\u6210\u72b6\u6001\u5224\u65ad\u4e0d\u51c6\u786e\u7684\u95ee\u9898\n- \u4f18\u5316\u4ee3\u7801\u7ed3\u6784\n - \u91cd\u6784\u4efb\u52a1\u5206\u7ec4\u65b9\u6cd5\uff0c\u4f7f\u7528\u66f4\u6e05\u6670\u7684\u82f1\u6587\u952e\u540d\n - \u6539\u8fdb\u680f\u76ee\u4fe1\u606f\u7684\u5b58\u50a8\u548c\u7ba1\u7406\n - \u63d0\u5347\u4ee3\u7801\u53ef\u7ef4\u62a4\u6027\n\n### 0.1.5 (2024-02-19)\n- \u6dfb\u52a0\u4efb\u52a1\u5206\u6790\u548c\u7edf\u8ba1\u529f\u80fd\n - \u6309\u65f6\u95f4\u8303\u56f4\u67e5\u8be2\u4efb\u52a1\uff08\u4eca\u5929/\u672c\u5468/\u672c\u6708/\u672a\u67657\u5929\uff09\n - \u6309\u4f18\u5148\u7ea7\u67e5\u8be2\u4efb\u52a1\n - \u83b7\u53d6\u4efb\u52a1\u7edf\u8ba1\u4fe1\u606f\n - \u83b7\u53d6\u4efb\u52a1\u8d8b\u52bf\u6570\u636e\n - \u652f\u6301\u4efb\u52a1\u5b8c\u6210\u7387\u7edf\u8ba1\u548c\u8d8b\u52bf\u5206\u6790\n - \u652f\u6301\u8fc7\u671f\u4efb\u52a1\u67e5\u8be2\n- \u4f18\u5316\u4ee3\u7801\u7ed3\u6784\u548c\u6027\u80fd\n- \u5b8c\u5584\u6587\u6863\u548c\u4f7f\u7528\u793a\u4f8b\n\n### 0.1.4 (2024-02-19)\n- \u5206\u79bb\u4efb\u52a1\u548c\u7b14\u8bb0\u7684API\u64cd\u4f5c\n- \u7b80\u5316\u6570\u636e\u7ed3\u6784\uff0c\u53ea\u4fdd\u7559\u5fc5\u8981\u5b57\u6bb5\n- \u5408\u5e76\u9879\u76ee\u548c\u6807\u7b7e\u4fe1\u606f\u5230\u8fd4\u56de\u6570\u636e\u4e2d\n- \u4f18\u5316\u7b5b\u9009\u529f\u80fd\n- \u6539\u8fdbAPI\u6587\u6863\u548c\u4f7f\u7528\u793a\u4f8b\n\n### 0.1.3 (2024-02-18)\n- \u6dfb\u52a0\u66f4\u591a\u4efb\u52a1\u5b57\u6bb5\u652f\u6301\n- \u5b8c\u5584\u6587\u6863\u8bf4\u660e\n- \u6dfb\u52a0Python 3.11\u652f\u6301\n\n### 0.1.2 (2024-02-15)\n- \u521d\u59cb\u7248\u672c\u53d1\u5e03\n- \u57fa\u672c\u7684\u4efb\u52a1\u3001\u9879\u76ee\u3001\u6807\u7b7e\u7ba1\u7406\u529f\u80fd\n\n## \u6ce8\u610f\u4e8b\u9879\n\n1. \u4efb\u52a1\u548c\u7b14\u8bb0\u7684\u533a\u522b\uff1a\n - \u4efb\u52a1(TEXT)\uff1a\u652f\u6301\u5b8c\u6210\u72b6\u6001\u3001\u4f18\u5148\u7ea7\u3001\u63d0\u9192\u7b49\u529f\u80fd\n - \u7b14\u8bb0(NOTE)\uff1a\u4e3b\u8981\u7528\u4e8e\u8bb0\u5f55\u4fe1\u606f\uff0c\u4e0d\u652f\u6301\u5b8c\u6210\u72b6\u6001\u548c\u63d0\u9192\n\n2. \u6570\u636e\u7ed3\u6784\u5df2\u7ecf\u8fc7\u4f18\u5316\uff1a\n - \u79fb\u9664\u4e86\u4e0d\u5fc5\u8981\u7684\u5b57\u6bb5\uff08\u5982\u6392\u5e8f\u3001ID\u7b49\uff09\n - \u6dfb\u52a0\u4e86\u66f4\u6709\u610f\u4e49\u7684\u5b57\u6bb5\uff08\u5982\u9879\u76ee\u540d\u79f0\u3001\u6807\u7b7e\u8be6\u60c5\u7b49\uff09\n - \u4fdd\u6301\u6570\u636e\u7ed3\u6784\u7684\u7b80\u6d01\u6027\u548c\u53ef\u8bfb\u6027\n\n3. API\u8c03\u7528\u5efa\u8bae\uff1a\n - \u4f7f\u7528token\u65b9\u5f0f\u8ba4\u8bc1\uff0c\u907f\u514d\u9891\u7e41\u767b\u5f55\n - \u5408\u7406\u4f7f\u7528\u7b5b\u9009\u6761\u4ef6\uff0c\u51cf\u5c11\u6570\u636e\u4f20\u8f93\n- \u6ce8\u610fAPI\u8c03\u7528\u9891\u7387\u9650\u5236\n\n4. \u4efb\u52a1\u5206\u6790\u548c\u7edf\u8ba1\u529f\u80fd\u4f7f\u7528\u5efa\u8bae\uff1a\n - \u5b9a\u671f\u67e5\u770b\u4efb\u52a1\u7edf\u8ba1\u4fe1\u606f\uff0c\u4e86\u89e3\u6574\u4f53\u4efb\u52a1\u5b8c\u6210\u60c5\u51b5\n - \u4f7f\u7528\u8d8b\u52bf\u6570\u636e\u5206\u6790\u5de5\u4f5c\u6548\u7387\u53d8\u5316\n - \u53ca\u65f6\u5904\u7406\u8fc7\u671f\u4efb\u52a1\n - \u5408\u7406\u5b89\u6392\u9ad8\u4f18\u5148\u7ea7\u4efb\u52a1\n\n## \u8bb8\u53ef\u8bc1\nMIT License\n\n## \u8054\u7cfb\u65b9\u5f0f\n- \u4f5c\u8005\uff1axieyu\n- \u90ae\u7bb1\uff1a523018705@qq.com \n",
"bugtrack_url": null,
"license": null,
"summary": "\u6ef4\u7b54\u6e05\u5355(TickTick/Dida365) Python SDK",
"version": "0.2.8",
"project_urls": {
"Homepage": "https://github.com/xieyu567/dida"
},
"split_keywords": [
"dida365",
"ticktick",
"todo",
"task",
"management",
"api",
"sdk"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "d568eb09385017ed3d3eb9ed4abae8e4a195628300718d885f59cd2deca2e1ec",
"md5": "02376a85cb55f5b6ed14107f101e7411",
"sha256": "4fcffcc4ce56fb20b78b48bf0a2a88e59138b8b8fba7014cfb5a927c36cce608"
},
"downloads": -1,
"filename": "didatodolist-0.2.8-py3-none-any.whl",
"has_sig": false,
"md5_digest": "02376a85cb55f5b6ed14107f101e7411",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.7",
"size": 41624,
"upload_time": "2025-03-03T15:06:46",
"upload_time_iso_8601": "2025-03-03T15:06:46.712996Z",
"url": "https://files.pythonhosted.org/packages/d5/68/eb09385017ed3d3eb9ed4abae8e4a195628300718d885f59cd2deca2e1ec/didatodolist-0.2.8-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "5a042bc0203cc34ae944fbb32be836c2fa9dfb5adf069530a7495a860a5c7533",
"md5": "3d9a52f42c2df2b171a60fbbee5ed11d",
"sha256": "b2e466d2a157124d41d84ae294a07cdf37c8ccc04cc0d47fc108833876125633"
},
"downloads": -1,
"filename": "didatodolist-0.2.8.tar.gz",
"has_sig": false,
"md5_digest": "3d9a52f42c2df2b171a60fbbee5ed11d",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.7",
"size": 39905,
"upload_time": "2025-03-03T15:06:48",
"upload_time_iso_8601": "2025-03-03T15:06:48.788885Z",
"url": "https://files.pythonhosted.org/packages/5a/04/2bc0203cc34ae944fbb32be836c2fa9dfb5adf069530a7495a860a5c7533/didatodolist-0.2.8.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-03-03 15:06:48",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "xieyu567",
"github_project": "dida",
"github_not_found": true,
"lcname": "didatodolist"
}