didatodolist


Namedidatodolist JSON
Version 0.2.8 PyPI version JSON
download
home_pagehttps://github.com/xieyu567/dida
Summary滴答清单(TickTick/Dida365) Python SDK
upload_time2025-03-03 15:06:48
maintainerNone
docs_urlNone
authorxieyu
requires_python>=3.7
licenseNone
keywords dida365 ticktick todo task management api sdk
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # 滴答清单 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"
}
        
Elapsed time: 1.53029s