名称: zoho
描述: 与 Zoho CRM、Projects 和 Meeting API 交互。用于管理交易、联系人、潜在客户、任务、项目、里程碑、会议录音或任何 Zoho 工作区数据。触发词包括 Zoho、CRM、交易、管道、项目、任务、里程碑、会议、录音、站会。
作者: Zone 99 团队
主页: https://99.zone
仓库: https://github.com/shreefentsar/clawdbot-zoho
使用 zoho CLI 封装器——它会自动处理 OAuth 令牌刷新和缓存。
zoho help # 显示所有命令
zoho token # 打印当前访问令牌(自动刷新)
https://localhosthttps://localhost/callback(或任何您控制的 URL——您只需用它获取一次授权码)在浏览器中打开此 URL(替换占位符):
https://accounts.zoho.com/oauth/v2/auth
?response_type=code
&client_id=YOUR_CLIENT_ID
&scope=ZohoCRM.modules.ALL,ZohoCRM.settings.ALL,ZohoProjects.projects.ALL,ZohoProjects.tasks.ALL,ZohoMeeting.recording.READ,ZohoMeeting.meeting.READ,ZohoMeeting.meetinguds.READ,ZohoFiles.files.READ
&redirect_uri=https://localhost/callback
&access_type=offline
&prompt=consent
重要: 使用与您数据中心匹配的账户 URL:
| 地区 | 账户 URL |
|--------|-------------|
| 美国 |https://accounts.zoho.com|
| 欧盟 |https://accounts.zoho.eu|
| 印度 |https://accounts.zoho.in|
| 澳大利亚 |https://accounts.zoho.com.au|
| 日本 |https://accounts.zoho.jp|
| 英国 |https://accounts.zoho.uk|
| 加拿大 |https://accounts.zohocloud.ca|
| 沙特阿拉伯 |https://accounts.zoho.sa|
授权后,您将被重定向到类似如下的地址:
https://localhost/callback?code=1000.abc123...&location=us&accounts-server=https://accounts.zoho.com
复制 code 参数值。此代码在 2 分钟后过期——请立即进行步骤 3。
运行此 curl 命令(替换占位符):
curl -X POST "https://accounts.zoho.com/oauth/v2/token" \
-d "client_id=YOUR_CLIENT_ID" \
-d "client_secret=YOUR_CLIENT_SECRET" \
-d "grant_type=authorization_code" \
-d "redirect_uri=https://localhost/callback" \
-d "code=PASTE_CODE_FROM_STEP_2"
响应:
{
"access_token": "1000.xxxx.yyyy",
"refresh_token": "1000.xxxx.zzzz",
"api_domain": "https://www.zohoapis.com",
"token_type": "Bearer",
"expires_in": 3600
}
保存 refresh_token —— 这是您的长期凭证。访问令牌在 1 小时后过期,但 CLI 会使用刷新令牌自动刷新它。
CRM/项目 组织 ID:
# 在 .env 中设置 client_id, client_secret, refresh_token 后:
zoho raw GET /crm/v7/org | jq '.org[0].id'
会议 组织 ID:
登录 Zoho Meeting → 管理员设置 → 在 URL 或设置页面中查找组织 ID。它与 CRM 的组织 ID 不同。
在技能目录中创建 .env 文件:
ZOHO_CLIENT_ID=1000.XXXXXXXXXXXXXXXXXXXXXXXXX
ZOHO_CLIENT_SECRET=your_client_secret_here
ZOHO_REFRESH_TOKEN=1000.your_refresh_token_here
ZOHO_ORG_ID=123456789 # CRM/项目 组织 ID
ZOHO_MEETING_ORG_ID=987654321 # 会议 组织 ID(与 CRM 不同)
ZOHO_CRM_DOMAIN=https://www.zohoapis.com
ZOHO_PROJECTS_DOMAIN=https://projectsapi.zoho.com/restapi
ZOHO_MEETING_DOMAIN=https://meeting.zoho.com
ZOHO_ACCOUNTS_URL=https://accounts.zoho.com
如果您在非美国数据中心(例如
.eu、.in、.com.au),请调整域名 URL。
| 权限范围 | 用途 |
|---|---|
ZohoCRM.modules.ALL |
读写 CRM 记录(交易、联系人、潜在客户等) |
ZohoCRM.settings.ALL |
读取 CRM 字段定义和组织设置 |
ZohoProjects.projects.ALL |
读写项目 |
ZohoProjects.tasks.ALL |
读写任务、里程碑、缺陷、时间日志 |
ZohoMeeting.recording.READ |
列出和访问会议录音 |
ZohoMeeting.meeting.READ |
列出会议和会话详情 |
ZohoMeeting.meetinguds.READ |
下载录音文件 |
ZohoFiles.files.READ |
下载文件(录音、转录稿) |
如果只需要 CRM 或只需要会议功能,可以请求更少的权限范围。授权 URL 中的 scope 参数以逗号分隔。
# 列出任何模块的记录
zoho crm list Deals
zoho crm list Deals "page=1&per_page=5&sort_by=Created_Time&sort_order=desc"
zoho crm list Contacts
zoho crm list Leads
# 获取特定记录
zoho crm get Deals 1234567890
# 使用条件搜索
zoho crm search Deals "(Stage:equals:Closed Won)"
zoho crm search Contacts "(Email:contains:@acme.com)"
zoho crm search Leads "(Lead_Source:equals:Web)"
# 创建记录
zoho crm create Contacts '{"data":[{"Last_Name":"Smith","First_Name":"John","Email":"j@co.com"}]}'
zoho crm create Deals '{"data":[{"Deal_Name":"New Project","Stage":"Qualification","Amount":50000}]}'
# 更新记录
zoho crm update Deals 1234567890 '{"data":[{"Stage":"Closed Won"}]}'
# 删除记录
zoho crm delete Deals 1234567890
潜在客户、联系人、客户、交易、任务、事件、通话、备注、产品、报价、销售订单、采购订单、发票
等于、不等于、开头为、包含、不包含、在...中、不在...中、介于、大于、小于
# 列出所有项目
zoho proj list
# 获取项目详情
zoho proj get 12345678
# 任务
zoho proj tasks 12345678
zoho proj create-task 12345678 "name=Fix+login+bug&priority=High&start_date=01-27-2026"
zoho proj update-task 12345678 98765432 "percent_complete=50"
# 其他
zoho proj milestones 12345678
zoho proj tasklists 12345678
zoho proj bugs 12345678
zoho proj timelogs 12345678
名称、开始日期 (MM-DD-YYYY)、结束日期、优先级 (无/低/中/高)、负责人、描述、任务列表 ID、完成百分比
# 列出所有录音
zoho meeting recordings
zoho meeting recordings | jq '[.recordings[] | {topic, sDate, sTime, durationInMins, erecordingId}]'
# 下载录音(使用录音列表中的 downloadUrl)
zoho meeting download "https://files-accl.zohopublic.com/public?event-id=..." output.mp4
# 列出会议/会话
zoho meeting list
zoho meeting list "fromDate=2026-01-01T00:00:00Z&toDate=2026-01-31T23:59:59Z"
# 获取会议详情
zoho meeting get 1066944216
来自 zoho meeting recordings 的关键字段:
- erecordingId — 加密的录音 ID(用于去重/跟踪)
- topic — 会议标题
- sDate, sTime — 开始日期/时间(人类可读)
- startTimeinMs — 开始时间(纪元毫秒,用于日期筛选)
- durationInMins — 录音时长
- downloadUrl / publicDownloadUrl — MP4 下载 URL
- transcriptionDownloadUrl — Zoho 生成的转录稿(如果可用)
- summaryDownloadUrl — Zoho 生成的摘要(如果可用)
- fileSize / fileSizeInMB — 录音文件大小
- status — 例如 UPLOADED
- meetingKey — 会议标识符
- creatorName — 发起录音者
用于自动化站会/会议摘要:
# 1. 列出录音,按当天日期(纪元毫秒)筛选
zoho meeting recordings | jq --argjson start "$START_MS" --argjson end "$END_MS" \
'[.recordings[] | select(.startTimeinMs >= $start and .startTimeinMs <= $end)]'
# 2. 下载录音
zoho meeting download "$DOWNLOAD_URL" /tmp/recording.mp4
# 3. 提取音频
ffmpeg -i /tmp/recording.mp4 -vn -acodec pcm_s16le -ar 16000 -ac 1 /tmp/audio.wav -y
# 4. 通过 Gemini Flash API 转录(非常适合阿拉伯语 + 英语混合)
# 完整实现请参见 scripts/standup-summarizer.sh
# 5. 使用 Claude/GPT 总结转录稿
# 6. 清理临时文件
完整的站会摘要脚本包含在 scripts/standup-summarizer.sh 中。
对于子命令未涵盖的操作:
# CRM 端点
zoho raw GET /crm/v7/settings/fields?module=Deals
zoho raw GET /crm/v7/org
# 会议端点
zoho raw GET "https://meeting.zoho.com/meeting/api/v2/{zsoid}/recordings.json"
# 自定义模块
zoho raw GET /crm/v7/Custom_Module
zoho crm list Deals "sort_by=Created_Time&sort_order=desc&per_page=10" | jq '.data[] | {Deal_Name, Stage, Amount, Closing_Date}'
zoho proj list | jq '.projects[] | {name, status, id: .id_string}'
zoho proj tasks <project_id> | jq '.tasks[] | {name, status: .status.name, percent_complete, priority}'
zoho proj create-task <project_id> "name=Task+description&priority=High&start_date=MM-DD-YYYY&end_date=MM-DD-YYYY"
# 快速列出最近录音
zoho meeting recordings | jq '[.recordings[:5] | .[] | {topic, sDate, sTime, durationInMins, fileSize}]'
# 下载最新录音
URL=$(zoho meeting recordings | jq -r '.recordings[0].downloadUrl')
zoho meeting download "$URL" /tmp/latest.mp4