tinet-clink2-cli 0.0.2__tar.gz → 0.0.3__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (23) hide show
  1. {tinet_clink2_cli-0.0.2 → tinet_clink2_cli-0.0.3}/MANIFEST.in +1 -1
  2. {tinet_clink2_cli-0.0.2 → tinet_clink2_cli-0.0.3}/PKG-INFO +33 -16
  3. {tinet_clink2_cli-0.0.2 → tinet_clink2_cli-0.0.3}/cli_anything/clink2/__init__.py +1 -1
  4. {tinet_clink2_cli-0.0.2 → tinet_clink2_cli-0.0.3}/cli_anything/clink2/clink2_cli.py +8 -9
  5. tinet_clink2_cli-0.0.3/cli_anything/clink2/commands/__init__.py +86 -0
  6. tinet_clink2_cli-0.0.3/cli_anything/clink2/commands/cdr_specs.py +336 -0
  7. tinet_clink2_cli-0.0.3/cli_anything/clink2/commands/options.py +47 -0
  8. tinet_clink2_cli-0.0.3/cli_anything/clink2/core/params.py +31 -0
  9. {tinet_clink2_cli-0.0.2 → tinet_clink2_cli-0.0.3}/pyproject.toml +5 -3
  10. tinet_clink2_cli-0.0.3/setup.py +47 -0
  11. {tinet_clink2_cli-0.0.2 → tinet_clink2_cli-0.0.3}/tinet_clink2_cli.egg-info/PKG-INFO +33 -16
  12. {tinet_clink2_cli-0.0.2 → tinet_clink2_cli-0.0.3}/tinet_clink2_cli.egg-info/SOURCES.txt +5 -1
  13. tinet_clink2_cli-0.0.2/README.md +0 -107
  14. {tinet_clink2_cli-0.0.2 → tinet_clink2_cli-0.0.3}/cli_anything/clink2/core/__init__.py +0 -0
  15. {tinet_clink2_cli-0.0.2 → tinet_clink2_cli-0.0.3}/cli_anything/clink2/core/auth.py +0 -0
  16. {tinet_clink2_cli-0.0.2 → tinet_clink2_cli-0.0.3}/cli_anything/clink2/core/config.py +0 -0
  17. {tinet_clink2_cli-0.0.2 → tinet_clink2_cli-0.0.3}/cli_anything/clink2/core/http.py +0 -0
  18. {tinet_clink2_cli-0.0.2 → tinet_clink2_cli-0.0.3}/cli_anything/clink2/core/logging.py +0 -0
  19. {tinet_clink2_cli-0.0.2 → tinet_clink2_cli-0.0.3}/setup.cfg +0 -0
  20. {tinet_clink2_cli-0.0.2 → tinet_clink2_cli-0.0.3}/tinet_clink2_cli.egg-info/dependency_links.txt +0 -0
  21. {tinet_clink2_cli-0.0.2 → tinet_clink2_cli-0.0.3}/tinet_clink2_cli.egg-info/entry_points.txt +0 -0
  22. {tinet_clink2_cli-0.0.2 → tinet_clink2_cli-0.0.3}/tinet_clink2_cli.egg-info/requires.txt +0 -0
  23. {tinet_clink2_cli-0.0.2 → tinet_clink2_cli-0.0.3}/tinet_clink2_cli.egg-info/top_level.txt +0 -0
@@ -1,3 +1,3 @@
1
- include README.md
1
+ exclude README.md
2
2
  prune cli_anything/tests
3
3
  global-exclude *.py[cod] __pycache__ .DS_Store
@@ -1,7 +1,7 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: tinet-clink2-cli
3
- Version: 0.0.2
4
- Summary: Clink2 OpenAPI CLI
3
+ Version: 0.0.3
4
+ Summary: Tinet Clink2 OpenAPI CLI
5
5
  Requires-Python: >=3.10
6
6
  Description-Content-Type: text/markdown
7
7
  Requires-Dist: click>=8.0
@@ -10,10 +10,12 @@ Provides-Extra: dev
10
10
  Requires-Dist: pytest>=7.0; extra == "dev"
11
11
  Requires-Dist: responses>=0.25; extra == "dev"
12
12
  Requires-Dist: build>=1.0; extra == "dev"
13
+ Dynamic: description
14
+ Dynamic: description-content-type
13
15
 
14
16
  Clink2 命令行客户端,封装 OpenAPI 接口,与 [智慧服务平台开发者中心](https://develop.clink.cn) 中参数与响应一致,适合脚本化集成与 Agent 调用。
15
17
 
16
- **当前版本:** `0.0.2`
18
+ **当前版本:** `0.0.3`
17
19
  **PyPI:** https://pypi.org/project/tinet-clink2-cli/
18
20
 
19
21
  ## 功能概览
@@ -21,15 +23,18 @@ Clink2 命令行客户端,封装 OpenAPI 接口,与 [智慧服务平台开
21
23
  | 子命令 | 说明 |
22
24
  |--------|------|
23
25
  | **`config`** | 本地凭证管理 |
24
- | **`ivr`** | 语音导航查询:列表、节点列表 |
25
- | **`voicemail`** | 留言箱设置:查看留言箱列表 |
26
+ | **`cdr-auto-task`** | 任务呼叫记录查询 |
27
+ | **`cdr-bot`** | 机器人话单查询 |
28
+ | **`cdr-ib`** | 呼入通话记录查询 |
29
+ | **`cdr-internal`** | 内部呼叫记录查询 |
30
+ | **`cdr-ob`** | 外呼通话记录查询 |
31
+ | **`ivr`** | 语音导航查询 |
32
+ | **`voicemail`** | 留言箱设置查询 |
26
33
 
27
34
  所有出站 HTTP 请求自动附加:
28
35
  - `X-Trace-Id: {UUID}`
29
36
  - `X-Clink2-CLI-Version: {CLI 版本}`
30
37
 
31
- 本地默认写入 JSON Lines 日志:`~/.clink2/logs/clink2.log`(单文件最大 10MB,滚动保留 5 个)。
32
-
33
38
  ## 环境要求
34
39
 
35
40
  - Python **≥ 3.10**
@@ -42,14 +47,14 @@ Clink2 命令行客户端,封装 OpenAPI 接口,与 [智慧服务平台开
42
47
 
43
48
  ```bash
44
49
  pip install tinet-clink2-cli
45
- tinet-clink2-cli --version # 0.0.2
50
+ tinet-clink2-cli --version # 0.0.3
46
51
  tinet-clink2-cli --help
47
52
  ```
48
53
 
49
54
  指定版本或升级:
50
55
 
51
56
  ```bash
52
- pip install 'tinet-clink2-cli==0.0.2'
57
+ pip install 'tinet-clink2-cli==0.0.3'
53
58
  pip install --upgrade tinet-clink2-cli
54
59
  ```
55
60
 
@@ -67,8 +72,8 @@ pipx install tinet-clink2-cli
67
72
 
68
73
  ```bash
69
74
  tinet-clink2-cli config set \
70
- --accessKeyId your_access_key_id \
71
- --accessKeySecret your_access_key_secret \
75
+ --access-key-id your_access_key_id \
76
+ --access-key-secret your_access_key_secret \
72
77
  --endpoint https://api-bj.clink.cn \
73
78
  --expires 60 \
74
79
  --log true
@@ -80,22 +85,30 @@ tinet-clink2-cli config show
80
85
 
81
86
  ## 快速示例
82
87
 
83
- 顺序与上方「功能概览」一致。完整取值见各子命令 `--help` 或 [开发者中心](https://develop.clink.cn)。
84
-
85
88
  ```bash
86
89
  # config
87
90
  tinet-clink2-cli config show
88
91
 
89
92
  # ivr
90
- tinet-clink2-cli ivr nodes --ivrName your_ivr_name
93
+ tinet-clink2-cli ivr nodes --ivr-name your_ivr_name
91
94
  tinet-clink2-cli --json ivr list
92
95
 
96
+ # CDR(未传时间参数时使用服务端默认时间窗)
97
+ tinet-clink2-cli --json cdr-ib list
98
+ tinet-clink2-cli --json cdr-ib detail --main-unique-id medias_1-xxx
99
+ tinet-clink2-cli --json cdr-ob list --cnos 0001,0002
100
+ tinet-clink2-cli --json cdr-auto-task list
101
+ tinet-clink2-cli --json cdr-bot ib-list
102
+ tinet-clink2-cli --json cdr-internal list
103
+
93
104
  # dry-run:仅校验入参与配置,不调用服务端(是否写日志取决于 config.log)
94
105
  tinet-clink2-cli --dry-run ivr list
95
106
  tinet-clink2-cli --dry-run voicemail list --offset 0 --limit 10
107
+ tinet-clink2-cli --dry-run cdr-ib list
96
108
 
97
109
  # verbose:向 stderr 打印 url / method / 版本 Header / TraceId / result(不含 body)
98
110
  tinet-clink2-cli --verbose --json voicemail list
111
+ tinet-clink2-cli --verbose --dry-run cdr-ob list
99
112
  ```
100
113
 
101
114
  全局选项:
@@ -105,14 +118,18 @@ tinet-clink2-cli --verbose --json voicemail list
105
118
 
106
119
  ## 安全提示
107
120
 
108
- - 勿将 AccessKeySecret 写入仓库、截图或日志外发渠道。
109
- - `config set --log false` 为用户显式关闭本地审计;关闭后排障将缺少本地 JSON 日志。
121
+ - 勿将 AccessKeySecret 写入仓库、截图或日志外发渠道
110
122
 
111
123
  ## 帮助与 API 文档
112
124
 
113
125
  ```bash
114
126
  tinet-clink2-cli --help
115
127
  tinet-clink2-cli config --help
128
+ tinet-clink2-cli cdr-auto-task --help
129
+ tinet-clink2-cli cdr-bot --help
130
+ tinet-clink2-cli cdr-ib --help
131
+ tinet-clink2-cli cdr-internal --help
132
+ tinet-clink2-cli cdr-ob --help
116
133
  tinet-clink2-cli ivr --help
117
134
  tinet-clink2-cli voicemail --help
118
135
  ```
@@ -1,3 +1,3 @@
1
1
  """Clink2 OpenAPI CLI package."""
2
2
 
3
- __version__ = "0.0.2"
3
+ __version__ = "0.0.3"
@@ -44,13 +44,13 @@ def config() -> None:
44
44
 
45
45
  @config.command("set")
46
46
  @click.option(
47
- "--accessKeyId",
47
+ "--access-key-id",
48
48
  "access_key_id",
49
49
  required=True,
50
50
  help="访问密钥 ID",
51
51
  )
52
52
  @click.option(
53
- "--accessKeySecret",
53
+ "--access-key-secret",
54
54
  "access_key_secret",
55
55
  required=True,
56
56
  help="访问密钥 Secret",
@@ -295,7 +295,7 @@ def ivr_list(ctx: click.Context) -> None:
295
295
 
296
296
  @ivr.command("nodes")
297
297
  @click.option(
298
- "--ivrName",
298
+ "--ivr-name",
299
299
  "ivr_name",
300
300
  required=True,
301
301
  help="语音导航名称",
@@ -329,12 +329,6 @@ def voicemail() -> None:
329
329
  @click.pass_context
330
330
  def voicemail_list(ctx: click.Context, offset: int, limit: int) -> None:
331
331
  """查看留言箱列表"""
332
- if offset < 0 or offset > 99990:
333
- raise click.ClickException("offset 超出范围 0-99990")
334
- if limit < 10 or limit > 100:
335
- raise click.ClickException("limit 超出范围 10-100")
336
- if limit + offset > 100000:
337
- raise click.ClickException("limit + offset 不允许超过 100000")
338
332
  _run_api(
339
333
  ctx,
340
334
  "voicemail list",
@@ -344,5 +338,10 @@ def voicemail_list(ctx: click.Context, offset: int, limit: int) -> None:
344
338
  )
345
339
 
346
340
 
341
+ from cli_anything.clink2.commands import register_cdr_commands
342
+
343
+ register_cdr_commands(cli)
344
+
345
+
347
346
  if __name__ == "__main__":
348
347
  cli()
@@ -0,0 +1,86 @@
1
+ """CDR Click 命令组注册。"""
2
+
3
+ from __future__ import annotations
4
+
5
+ import click
6
+
7
+ from cli_anything.clink2.commands.cdr_specs import SPECS
8
+ from cli_anything.clink2.commands.options import with_api_options
9
+ from cli_anything.clink2.core.params import build_query_params
10
+
11
+
12
+ def _register(group: click.Group, name: str, path: str, *, help_text: str) -> None:
13
+ """在 group 上注册一个调用 ``_run_api`` 的子命令。
14
+
15
+ Args:
16
+ group: Click 命令组。
17
+ name: 子命令名。
18
+ path: OpenAPI path。
19
+ help_text: 命令说明。
20
+ """
21
+ params = SPECS[path]
22
+
23
+ @group.command(name, help=help_text)
24
+ @with_api_options(params)
25
+ @click.pass_context
26
+ def _cmd(ctx: click.Context, **kwargs: object) -> None:
27
+ """执行 CDR OpenAPI 查询。"""
28
+ from cli_anything.clink2.clink2_cli import _run_api
29
+
30
+ query = build_query_params(kwargs)
31
+ command = f"{group.name} {name}"
32
+ _run_api(ctx, command, "GET", path, params=query)
33
+
34
+
35
+ @click.group("cdr-ib")
36
+ def cdr_ib() -> None:
37
+ """呼入通话记录查询"""
38
+
39
+
40
+ @click.group("cdr-ob")
41
+ def cdr_ob() -> None:
42
+ """外呼通话记录查询"""
43
+
44
+
45
+ @click.group("cdr-auto-task")
46
+ def cdr_auto_task() -> None:
47
+ """任务呼叫记录查询"""
48
+
49
+
50
+ @click.group("cdr-bot")
51
+ def cdr_bot() -> None:
52
+ """机器人话单查询"""
53
+
54
+
55
+ @click.group("cdr-internal")
56
+ def cdr_internal() -> None:
57
+ """内部呼叫记录查询"""
58
+
59
+
60
+ def register_cdr_commands(cli: click.Group) -> None:
61
+ """将全部 CDR 命令组挂到根 CLI。
62
+
63
+ Args:
64
+ cli: 根 Click group。
65
+ """
66
+ _register(cdr_ib, "list", "/cc/list_cdr_ib", help_text="查询客户来电记录列表")
67
+ _register(cdr_ib, "agent-list", "/cc/list_cdr_ib_agent", help_text="查询座席接听记录列表")
68
+ _register(cdr_ib, "detail", "/cc/detail_cdr_ib", help_text="查询客户来电记录详情")
69
+
70
+ _register(cdr_ob, "list", "/cc/list_cdr_ob", help_text="查询外呼记录列表")
71
+ _register(cdr_ob, "detail", "/cc/cdr_ob_details", help_text="查询外呼记录详情")
72
+
73
+ _register(cdr_auto_task, "list", "/cc/list_cdr_auto_task", help_text="查询任务呼叫记录列表")
74
+
75
+ _register(cdr_bot, "ib-list", "/cc/list_cdr_ib_intelligent_agent", help_text="查询呼入机器人记录列表")
76
+ _register(cdr_bot, "list", "/cc/list_cdr_intelligent_agent", help_text="查询机器人对话记录列表")
77
+ _register(cdr_bot, "detail", "/cc/detail_cdr_intelligent_agent", help_text="查询机器人对话记录详情")
78
+
79
+ _register(cdr_internal, "list", "/cc/list_cdr_ob_internal", help_text="查询内部呼叫记录列表")
80
+ _register(cdr_internal, "detail", "/cc/detail_cdr_ob_internal", help_text="查询内部呼叫记录详情")
81
+
82
+ cli.add_command(cdr_ib)
83
+ cli.add_command(cdr_ob)
84
+ cli.add_command(cdr_auto_task)
85
+ cli.add_command(cdr_bot)
86
+ cli.add_command(cdr_internal)
@@ -0,0 +1,336 @@
1
+ """CDR OpenAPI 请求参数规格(从 develop/api/cc/*.adoc 提取)。"""
2
+
3
+ from __future__ import annotations
4
+
5
+ SPECS: dict[str, list[dict]] = {
6
+ '/cc/list_cdr_ib': [
7
+ {'name': 'startTime', 'type': 'Long', 'required': False, 'help': '开始时间,时间戳格式精确到秒。默认值取当前月份第一天', 'default': None},
8
+ {'name': 'startTimeEnd', 'type': 'Long', 'required': False, 'help': '开始时间查询截止,时间戳格式精确到秒,开始时间和结束时间跨度不能超过一个月。默认值取当前时间', 'default': None},
9
+ {'name': 'answerTime', 'type': 'Long', 'required': False, 'help': '系统应答时间,时间戳格式精确到秒。', 'default': None},
10
+ {'name': 'answerTimeEnd', 'type': 'Long', 'required': False, 'help': '系统应答时间查询截止,时间戳格式精确到秒。', 'default': None},
11
+ {'name': 'bridgeTime', 'type': 'Long', 'required': False, 'help': '接听时间,时间戳格式精确到秒。', 'default': None},
12
+ {'name': 'bridgeTimeEnd', 'type': 'Long', 'required': False, 'help': '接听时间查询截止,时间戳格式精确到秒。', 'default': None},
13
+ {'name': 'endTime', 'type': 'Long', 'required': False, 'help': '结束时间,时间戳格式精确到秒。', 'default': None},
14
+ {'name': 'endTimeEnd', 'type': 'Long', 'required': False, 'help': '结束时间查询截止,时间戳格式精确到秒。', 'default': None},
15
+ {'name': 'hiddenType', 'type': 'Integer', 'required': False, 'help': '是否隐藏号码。 0: 不隐藏,1: 中间四位,2: 最后八位,3: 全部号码,4: 最后四位。默认值为 0', 'default': 0},
16
+ {'name': 'bridgeDuration', 'type': 'Integer', 'required': False, 'help': '通话时长范围查询最小值,和bridgeDurationEnd配合使用', 'default': None},
17
+ {'name': 'bridgeDurationEnd', 'type': 'Integer', 'required': False, 'help': '通话时长范围查询最大值', 'default': None},
18
+ {'name': 'totalDuration', 'type': 'Integer', 'required': False, 'help': '总时长范围查询最小值,和totalDurationEnd配合使用', 'default': None},
19
+ {'name': 'totalDurationEnd', 'type': 'Integer', 'required': False, 'help': '总时长范围查询最大值', 'default': None},
20
+ {'name': 'cnos', 'type': 'String[]', 'required': False, 'help': '座席号', 'default': None},
21
+ {'name': 'qnos', 'type': 'String[]', 'required': False, 'help': '队列号', 'default': None},
22
+ {'name': 'firstCallCno', 'type': 'String[]', 'required': False, 'help': '首呼座席', 'default': None},
23
+ {'name': 'firstCallQno', 'type': 'String[]', 'required': False, 'help': '首呼队列', 'default': None},
24
+ {'name': 'firstCallNumber', 'type': 'String', 'required': False, 'help': '首呼座席电话', 'default': None},
25
+ {'name': 'clientNumber', 'type': 'String', 'required': False, 'help': '座席电话', 'default': None},
26
+ {'name': 'customerNumber', 'type': 'String', 'required': False, 'help': '客户号码', 'default': None},
27
+ {'name': 'customerNumberMatchType', 'type': 'Integer', 'required': False, 'help': '客户号码匹配类型。需与customerNumber配合使用。1: 前缀匹配,2: 后缀匹配,3: 包含匹配', 'default': None},
28
+ {'name': 'hotlines', 'type': 'String[]', 'required': False, 'help': '热线号码', 'default': None},
29
+ {'name': 'hotlineName', 'type': 'String', 'required': False, 'help': '热线别名', 'default': None},
30
+ {'name': 'ivrIds', 'type': 'Integer[]', 'required': False, 'help': 'IVR', 'default': None},
31
+ {'name': 'xnumber', 'type': 'String[]', 'required': False, 'help': '虚拟号码', 'default': None},
32
+ {'name': 'statuses', 'type': 'Integer[]', 'required': False, 'help': '接听状态。取值范围如下: 1: 人工接听 2: 人工未接听 3: 系统应答 4: 系统未应答 默认全部', 'default': None},
33
+ {'name': 'statusResult', 'type': 'Integer[]', 'required': False, 'help': '呼叫结果。配合接听状态为人工未接听和系统应答时做级联查询,取值范围如下: 1: 已进入留言 2: 客户速挂 3: 座席拒接 4: 振铃未接 8: IVR中放弃 9: 已进IVR 10: 未进IVR 11: 队列中放弃 12: 队列中溢出 默认全部', 'default': None},
34
+ {'name': 'onHookSource', 'type': 'Integer[]', 'required': False, 'help': '挂断方,默认查询全部。说明参考<<通用字段>>', 'default': None},
35
+ {'name': 'callRemember', 'type': 'Integer[]', 'required': False, 'help': '主叫记忆。取值范围如下: 1: 外呼主叫记忆 2: 来电主叫记忆', 'default': None},
36
+ {'name': 'statusRobot', 'type': 'Integer[]', 'required': False, 'help': '机器人接听状态。取值范围如下: 1: 机器人未应答 2: 机器人应答', 'default': None},
37
+ {'name': 'investigationKeys', 'type': 'Integer', 'required': False, 'help': '满意度评价', 'default': None},
38
+ {'name': 'province', 'type': 'String', 'required': False, 'help': '客户归属地省份', 'default': None},
39
+ {'name': 'city', 'type': 'String', 'required': False, 'help': '客户归属地城市', 'default': None},
40
+ {'name': 'agentAnswerInTime', 'type': 'Integer', 'required': False, 'help': '首次及时应答。取值范围如下: 0: 否 1: 是 默认全部', 'default': None},
41
+ {'name': 'evaluation', 'type': 'Integer', 'required': False, 'help': '是否邀评。取值范围如下: 0: 否 1: 是 默认全部', 'default': None},
42
+ {'name': 'evaluationSolveResult', 'type': 'Integer[]', 'required': False, 'help': '会话评估问题是否解决。0: 未解决,1: 已解决,默认全部', 'default': None},
43
+ {'name': 'userField', 'type': 'String', 'required': False, 'help': '自定义字段', 'default': None},
44
+ {'name': 'userValue', 'type': 'String', 'required': False, 'help': '自定义字段值,与userField配合使用', 'default': None},
45
+ {'name': 'customerMos', 'type': 'Integer[]', 'required': False, 'help': '客户侧通话质量。取值范围 1-4,对应较差到优秀', 'default': None},
46
+ {'name': 'agentMos', 'type': 'Integer[]', 'required': False, 'help': '座席侧通话质量。取值范围 1-4,对应较差到优秀', 'default': None},
47
+ {'name': 'mainUniqueId', 'type': 'String', 'required': False, 'help': '通话记录唯一标识', 'default': None},
48
+ {'name': 'existTicket', 'type': 'Integer', 'required': False, 'help': '工单有无。取值范围如下: 0: 无 1: 有 默认全部', 'default': None},
49
+ {'name': 'existBusiness', 'type': 'Integer', 'required': False, 'help': '业务记录有无。取值范围如下: 0: 无 1: 有 默认全部', 'default': None},
50
+ {'name': 'isRtcCall', 'type': 'Integer', 'required': False, 'help': '是否为RTC通话。取值范围如下: 1: 是 0: 否 默认全部', 'default': None},
51
+ {'name': 'bindTypes', 'type': 'Integer[]', 'required': False, 'help': '接听设备。取值范围如下: 1: 手机 2: IP话机 3: 软电话 默认全部', 'default': None},
52
+ {'name': 'scrollSearch', 'type': 'boolean', 'required': False, 'help': '是否滚动查询。默认false,true代表使用滚动查询。', 'default': None},
53
+ {'name': 'scrollId', 'type': 'String', 'required': False, 'help': '滚动查询ID。配合scrollSearch使用,第一次查询时不需要传递此参数,后续查询可从返回列表中取值,并传参数。当scrollId为空时,代表滚动查询结束。', 'default': None},
54
+ {'name': 'offset', 'type': 'Integer', 'required': False, 'help': '偏移量,范围 0-99990。默认值为 0。注:limit + offset 不允许超过100000', 'default': 0},
55
+ {'name': 'limit', 'type': 'Integer', 'required': False, 'help': '查询条数,范围 10-100。默认值为 10。注:limit + offset 不允许超过100000', 'default': 10},
56
+ ],
57
+ '/cc/list_cdr_ib_agent': [
58
+ {'name': 'startTime', 'type': 'Long', 'required': False, 'help': '开始时间,时间戳格式精确到秒。默认值取当前月份第一天', 'default': None},
59
+ {'name': 'startTimeEnd', 'type': 'Long', 'required': False, 'help': '开始时间查询截止,时间戳格式精确到秒,开始时间和结束时间跨度不能超过一个月。默认值取当前时间', 'default': None},
60
+ {'name': 'bridgeTime', 'type': 'Long', 'required': False, 'help': '接听时间,时间戳格式精确到秒。', 'default': None},
61
+ {'name': 'bridgeTimeEnd', 'type': 'Long', 'required': False, 'help': '接听时间查询截止,时间戳格式精确到秒。', 'default': None},
62
+ {'name': 'endTime', 'type': 'Long', 'required': False, 'help': '结束时间,时间戳格式精确到秒。', 'default': None},
63
+ {'name': 'endTimeEnd', 'type': 'Long', 'required': False, 'help': '结束时间查询截止,时间戳格式精确到秒。', 'default': None},
64
+ {'name': 'hiddenType', 'type': 'Integer', 'required': False, 'help': '是否隐藏号码。 0: 不隐藏,1: 中间四位,2: 最后八位,3: 全部号码,4: 最后四位。默认值为 0', 'default': 0},
65
+ {'name': 'detailCallType', 'type': 'Integer[]', 'required': False, 'help': '呼叫类型,默认查询全部。说明参考<<通用字段>>', 'default': None},
66
+ {'name': 'qno', 'type': 'String[]', 'required': False, 'help': '队列号', 'default': None},
67
+ {'name': 'cno', 'type': 'String[]', 'required': False, 'help': '座席号', 'default': None},
68
+ {'name': 'clientNumber', 'type': 'String', 'required': False, 'help': '座席号码', 'default': None},
69
+ {'name': 'bridgeStatus', 'type': 'Integer[]', 'required': False, 'help': '接听状态。取值范围如下: 0: 人工未接听 1: 人工接听 默认全部', 'default': None},
70
+ {'name': 'bridgeStatusDetail', 'type': 'Integer[]', 'required': False, 'help': '呼叫结果。人工未接听原因,配合接听状态为人工未接听时做级联查询,取值范围如下: 2: 座席拒接 3: 振铃未接 默认全部', 'default': None},
71
+ {'name': 'bridgeDuration', 'type': 'Integer', 'required': False, 'help': '通话时长范围查询最小值,和bridgeDurationEnd配合使用', 'default': None},
72
+ {'name': 'bridgeDurationEnd', 'type': 'Integer', 'required': False, 'help': '通话时长范围查询最大值', 'default': None},
73
+ {'name': 'onHookSource', 'type': 'Integer[]', 'required': False, 'help': '挂断方,默认查询全部。说明参考<<通用字段>>', 'default': None},
74
+ {'name': 'agentAnswerInTime', 'type': 'Integer', 'required': False, 'help': '及时应答。取值范围如下: 0: 否 1: 是 默认全部', 'default': None},
75
+ {'name': 'mainUniqueId', 'type': 'String', 'required': False, 'help': '通话记录唯一标识', 'default': None},
76
+ {'name': 'customerNumber', 'type': 'String', 'required': False, 'help': '客户号码', 'default': None},
77
+ {'name': 'customerNumberMatchType', 'type': 'Integer', 'required': False, 'help': '客户号码匹配类型。需与customerNumber配合使用。0: 精确匹配,1: 前缀匹配,2: 后缀匹配,3: 包含匹配', 'default': None},
78
+ {'name': 'hotlines', 'type': 'String[]', 'required': False, 'help': '热线号码', 'default': None},
79
+ {'name': 'hotlineName', 'type': 'String', 'required': False, 'help': '热线别名', 'default': None},
80
+ {'name': 'ivrIds', 'type': 'Integer[]', 'required': False, 'help': 'IVR', 'default': None},
81
+ {'name': 'displayNumbers', 'type': 'String[]', 'required': False, 'help': '呼转外显号码', 'default': None},
82
+ {'name': 'sipCauseCode', 'type': 'Integer', 'required': False, 'help': 'SIP状态码', 'default': None},
83
+ {'name': 'callRemember', 'type': 'Integer[]', 'required': False, 'help': '主叫记忆。取值范围如下: 1: 外呼主叫记忆 2: 来电主叫记忆 默认全部', 'default': None},
84
+ {'name': 'bindTypes', 'type': 'Integer[]', 'required': False, 'help': '接听设备。取值范围如下: 1: 手机 2: IP话机 3: 软电话 默认全部', 'default': None},
85
+ {'name': 'scrollSearch', 'type': 'boolean', 'required': False, 'help': '是否滚动查询。默认false,true代表使用滚动查询。', 'default': None},
86
+ {'name': 'scrollId', 'type': 'String', 'required': False, 'help': '滚动查询ID。配合scrollSearch使用,第一次查询时不需要传递此参数,后续查询可从返回列表中取值,并传参数。当scrollId为空时,代表滚动查询结束。', 'default': None},
87
+ {'name': 'offset', 'type': 'Integer', 'required': False, 'help': '偏移量,范围 0-99990。默认值为 0。注:limit + offset 不允许超过100000', 'default': 0},
88
+ {'name': 'limit', 'type': 'Integer', 'required': False, 'help': '查询条数,范围 10-100。默认值为 10。注:limit + offset 不允许超过100000', 'default': 10},
89
+ ],
90
+ '/cc/detail_cdr_ib': [
91
+ {'name': 'mainUniqueId', 'type': 'String', 'required': True, 'help': '通话记录唯一标识', 'default': None},
92
+ {'name': 'hiddenType', 'type': 'Integer', 'required': False, 'help': '是否隐藏号码。 0: 不隐藏,1: 中间四位,2: 最后八位,3: 全部号码,4: 最后四位。默认值为 0', 'default': 0},
93
+ ],
94
+ '/cc/list_cdr_ob': [
95
+ {'name': 'startTime', 'type': 'Long', 'required': False, 'help': '开始时间,时间戳格式精确到秒。默认值取当前月份第一天', 'default': None},
96
+ {'name': 'startTimeEnd', 'type': 'Long', 'required': False, 'help': '开始时间查询截止,时间戳格式精确到秒,开始时间和结束时间跨度不能超过一个月。默认值取当前时间', 'default': None},
97
+ {'name': 'bridgeTime', 'type': 'Long', 'required': False, 'help': '接听时间,时间戳格式精确到秒。', 'default': None},
98
+ {'name': 'bridgeTimeEnd', 'type': 'Long', 'required': False, 'help': '接听时间查询截止,时间戳格式精确到秒。', 'default': None},
99
+ {'name': 'endTime', 'type': 'Long', 'required': False, 'help': '结束时间,时间戳格式精确到秒。', 'default': None},
100
+ {'name': 'endTimeEnd', 'type': 'Long', 'required': False, 'help': '结束时间查询截止,时间戳格式精确到秒。', 'default': None},
101
+ {'name': 'hiddenType', 'type': 'Integer', 'required': False, 'help': '是否隐藏号码。 0: 不隐藏,1: 中间四位,2: 最后八位,3: 全部号码,4: 最后四位。默认值为 0', 'default': 0},
102
+ {'name': 'bridgeDuration', 'type': 'Integer', 'required': False, 'help': '通话时长范围查询最小值,和bridgeDurationEnd配合使用', 'default': None},
103
+ {'name': 'bridgeDurationEnd', 'type': 'Integer', 'required': False, 'help': '通话时长范围查询最大值', 'default': None},
104
+ {'name': 'totalDuration', 'type': 'Integer', 'required': False, 'help': '总时长范围查询最小值,和totalDurationEnd配合使用', 'default': None},
105
+ {'name': 'totalDurationEnd', 'type': 'Integer', 'required': False, 'help': '总时长范围查询最大值', 'default': None},
106
+ {'name': 'cnos', 'type': 'String[]', 'required': False, 'help': '座席工号', 'default': None},
107
+ {'name': 'qnos', 'type': 'String[]', 'required': False, 'help': '外呼组', 'default': None},
108
+ {'name': 'clientNumber', 'type': 'String', 'required': False, 'help': '座席电话', 'default': None},
109
+ {'name': 'customerNumber', 'type': 'String', 'required': False, 'help': '客户号码', 'default': None},
110
+ {'name': 'customerNumberMatchType', 'type': 'Integer', 'required': False, 'help': '客户号码匹配类型。需与customerNumber配合使用。1: 前缀匹配,2: 后缀匹配,3: 包含匹配', 'default': None},
111
+ {'name': 'callType', 'type': 'int[]', 'required': False, 'help': '通话类型 4: 预览外呼,6: 主叫外呼, 默认全部', 'default': None},
112
+ {'name': 'leftClid', 'type': 'String[]', 'required': False, 'help': '外显号码', 'default': None},
113
+ {'name': 'xnumber', 'type': 'String[]', 'required': False, 'help': '虚拟号码', 'default': None},
114
+ {'name': 'status', 'type': 'Integer[]', 'required': False, 'help': '接听状态。取值范围如下: 1: 客户未接听 2: 座席未接听 3: 客户接听 4: 座席接听 默认全部', 'default': None},
115
+ {'name': 'sipCauseType', 'type': 'int[]', 'required': False, 'help': '呼叫结果。取值范围如下: 0: 呼叫成功 1: 呼叫失败 2: 线路故障 3: 线路风控 默认全部', 'default': None},
116
+ {'name': 'sipCause', 'type': 'Integer[]', 'required': False, 'help': '呼叫失败原因。配合呼叫结果做级联查询,取值范围如下: -700: 客户无人接听 710: 客户占线 712: 客户拒接 713: 号码空号 714: 号码关机 715: 号码暂无法接听 716: 号码停机 默认全部', 'default': None},
117
+ {'name': 'sipCauseRaw', 'type': 'Integer[]', 'required': False, 'help': '被叫状态。取值范围如下: 710: 客户占线 711: 呼叫超时 712: 客户拒接 713: 号码空号 714: 关机 715: 号码暂无法接听 716: 号码停机 717: 呼叫受限 718: 无人接听 719: 正在通话中 720: 暂停服务 721: 来电提醒 722: 不再使用 723: 来电助手 724: 号码格式不正确 默认全部', 'default': None},
118
+ {'name': 'onHookSource', 'type': 'Integer[]', 'required': False, 'help': '挂断方,默认查询全部。说明参考<<通用字段>>', 'default': None},
119
+ {'name': 'investigationKeys', 'type': 'Integer', 'required': False, 'help': '满意度评价', 'default': None},
120
+ {'name': 'province', 'type': 'String', 'required': False, 'help': '客户归属地省份', 'default': None},
121
+ {'name': 'city', 'type': 'String', 'required': False, 'help': '客户归属地城市', 'default': None},
122
+ {'name': 'mainUniqueId', 'type': 'String', 'required': False, 'help': '通话记录唯一标识', 'default': None},
123
+ {'name': 'requestUniqueId', 'type': 'String', 'required': False, 'help': '请求唯一ID', 'default': None},
124
+ {'name': 'userField', 'type': 'String', 'required': False, 'help': '自定义字段', 'default': None},
125
+ {'name': 'userValue', 'type': 'String', 'required': False, 'help': '自定义字段值,与userField配合使用', 'default': None},
126
+ {'name': 'customerMos', 'type': 'Integer[]', 'required': False, 'help': '客户侧通话质量。取值范围 1-4,对应较差到优秀', 'default': None},
127
+ {'name': 'agentMos', 'type': 'Integer[]', 'required': False, 'help': '座席侧通话质量。取值范围 1-4,对应较差到优秀', 'default': None},
128
+ {'name': 'evaluation', 'type': 'Integer', 'required': False, 'help': '是否邀评。取值范围如下: 0: 否 1: 是 默认全部', 'default': None},
129
+ {'name': 'taskName', 'type': 'String', 'required': False, 'help': '外呼任务名称', 'default': None},
130
+ {'name': 'existTicket', 'type': 'Integer', 'required': False, 'help': '工单有无。取值范围如下: 0: 无 1: 有 默认全部', 'default': None},
131
+ {'name': 'existBusiness', 'type': 'Integer', 'required': False, 'help': '业务记录有无。取值范围如下: 0: 无 1: 有 默认全部', 'default': None},
132
+ {'name': 'isRtcCall', 'type': 'Integer', 'required': False, 'help': '是否为RTC通话。取值范围如下: 0: 否 1: 是 默认全部', 'default': None},
133
+ {'name': 'scrollSearch', 'type': 'boolean', 'required': False, 'help': '是否滚动查询。默认false,true代表使用滚动查询。', 'default': None},
134
+ {'name': 'scrollId', 'type': 'String', 'required': False, 'help': '滚动查询ID。配合scrollSearch使用,第一次查询时不需要传递此参数,后续查询可从返回列表中取值,并传参数。当scrollId为空时,代表滚动查询结束。', 'default': None},
135
+ {'name': 'offset', 'type': 'Integer', 'required': False, 'help': '偏移量,范围 0-99990。默认值为 0。注:limit + offset 不允许超过100000', 'default': 0},
136
+ {'name': 'limit', 'type': 'Integer', 'required': False, 'help': '查询条数,范围 10-100。默认值为 10。注:limit + offset 不允许超过100000', 'default': 10},
137
+ ],
138
+ '/cc/cdr_ob_details': [
139
+ {'name': 'mainUniqueId', 'type': 'String', 'required': True, 'help': '通话记录唯一标识', 'default': None},
140
+ {'name': 'hiddenType', 'type': 'Integer', 'required': False, 'help': '是否隐藏号码。 0: 不隐藏,1: 中间四位,2: 最后八位,3: 全部号码,4: 最后四位。默认值为 0', 'default': 0},
141
+ ],
142
+ '/cc/list_cdr_auto_task': [
143
+ {'name': 'startTime', 'type': 'Long', 'required': False, 'help': '开始时间,时间戳格式精确到秒。默认值取当前月份第一天', 'default': None},
144
+ {'name': 'startTimeEnd', 'type': 'Long', 'required': False, 'help': '开始时间查询截止,时间戳格式精确到秒,开始时间和结束时间跨度不能超过一个月。默认值取当前时间', 'default': None},
145
+ {'name': 'upTime', 'type': 'Long', 'required': False, 'help': '客户接听时间,时间戳格式精确到秒。', 'default': None},
146
+ {'name': 'upTimeEnd', 'type': 'Long', 'required': False, 'help': '客户接听时间查询截止,时间戳格式精确到秒。', 'default': None},
147
+ {'name': 'endTime', 'type': 'Long', 'required': False, 'help': '结束时间,时间戳格式精确到秒。', 'default': None},
148
+ {'name': 'endTimeEnd', 'type': 'Long', 'required': False, 'help': '结束时间查询截止,时间戳格式精确到秒。', 'default': None},
149
+ {'name': 'hiddenType', 'type': 'Integer', 'required': False, 'help': '是否隐藏号码。 0: 不隐藏,1: 中间四位,2: 最后八位,3: 全部号码,4: 最后四位。默认值为 0', 'default': 0},
150
+ {'name': 'customerBridgeDuration', 'type': 'Integer', 'required': False, 'help': '客户接听时长范围查询最小值,和customerBridgeDurationEnd配合使用', 'default': None},
151
+ {'name': 'customerBridgeDurationEnd', 'type': 'Integer', 'required': False, 'help': '客户接听时长范围查询最大值', 'default': None},
152
+ {'name': 'totalDuration', 'type': 'Integer', 'required': False, 'help': '总时长范围查询最小值,和totalDurationEnd配合使用', 'default': None},
153
+ {'name': 'totalDurationEnd', 'type': 'Integer', 'required': False, 'help': '总时长范围查询最大值', 'default': None},
154
+ {'name': 'cnos', 'type': 'String[]', 'required': False, 'help': '座席号', 'default': None},
155
+ {'name': 'qnos', 'type': 'String[]', 'required': False, 'help': '队列号', 'default': None},
156
+ {'name': 'clientNumber', 'type': 'String', 'required': False, 'help': '座席电话', 'default': None},
157
+ {'name': 'customerNumber', 'type': 'String', 'required': False, 'help': '首叫号码', 'default': None},
158
+ {'name': 'customerNumberMatchType', 'type': 'Integer', 'required': False, 'help': '客户号码匹配类型。需与customerNumber配合使用。1: 前缀匹配,2: 后缀匹配,3: 包含匹配', 'default': None},
159
+ {'name': 'hotlines', 'type': 'String[]', 'required': False, 'help': '外显号码', 'default': None},
160
+ {'name': 'xnumber', 'type': 'String[]', 'required': False, 'help': '虚拟号码', 'default': None},
161
+ {'name': 'status', 'type': 'Integer[]', 'required': False, 'help': '接听状态。取值范围如下: 40: 客户未接听 41: 客户接听 42: 转人工未接听 43: 转人工接听 默认全部', 'default': None},
162
+ {'name': 'sipCauseType', 'type': 'int[]', 'required': False, 'help': '呼叫结果。取值范围如下: 0: 呼叫成功 1: 呼叫失败 2: 线路故障 3: 线路风控 默认全部', 'default': None},
163
+ {'name': 'sipCause', 'type': 'Integer[]', 'required': False, 'help': '呼叫失败原因。配合呼叫结果做级联查询,取值范围如下: -700: 客户无人接听 710: 客户占线 712: 客户拒接 713: 号码空号 714: 号码关机 715: 号码暂无法接听 716: 号码停机 默认全部', 'default': None},
164
+ {'name': 'sipCauseRaw', 'type': 'Integer[]', 'required': False, 'help': '被叫状态。取值范围如下: 710: 客户占线 711: 呼叫超时 712: 客户拒接 713: 号码空号 714: 关机 715: 号码暂无法接听 716: 号码停机 717: 呼叫受限 718: 无人接听 719: 正在通话中 720: 暂停服务 721: 来电提醒 722: 不再使用 723: 来电助手 724: 号码格式不正确 默认全部', 'default': None},
165
+ {'name': 'onHookSource', 'type': 'Integer[]', 'required': False, 'help': '挂断方,默认查询全部。说明参考<<通用字段>>', 'default': None},
166
+ {'name': 'investigationKeys', 'type': 'Integer', 'required': False, 'help': '满意度评价', 'default': None},
167
+ {'name': 'province', 'type': 'String', 'required': False, 'help': '客户归属地省份', 'default': None},
168
+ {'name': 'city', 'type': 'String', 'required': False, 'help': '客户归属地城市', 'default': None},
169
+ {'name': 'mainUniqueId', 'type': 'String', 'required': False, 'help': '通话记录唯一标识', 'default': None},
170
+ {'name': 'requestUniqueId', 'type': 'String', 'required': False, 'help': '请求唯一ID', 'default': None},
171
+ {'name': 'evaluation', 'type': 'Integer', 'required': False, 'help': '是否邀评。取值范围如下: 0: 否 1: 是 默认全部', 'default': None},
172
+ {'name': 'taskIds', 'type': 'String[]', 'required': False, 'help': '外呼任务ID', 'default': None},
173
+ {'name': 'ivrIds', 'type': 'int[]', 'required': False, 'help': 'IVR', 'default': None},
174
+ {'name': 'degrade', 'type': 'Integer', 'required': False, 'help': '是否呼叫降级。取值范围如下: 1: 是 0: 否 默认全部', 'default': None},
175
+ {'name': 'telRetry', 'type': 'Integer', 'required': False, 'help': '是否重呼。取值范围如下: 1: 是 0: 否 默认全部', 'default': None},
176
+ {'name': 'abTaskGroupName', 'type': 'String', 'required': False, 'help': 'AB测试组名', 'default': None},
177
+ {'name': 'finishRetryFlag', 'type': 'Integer', 'required': False, 'help': '最终呼叫。取值范围如下: 1: 是 0: 否 默认全部', 'default': None},
178
+ {'name': 'businessTagNames', 'type': 'String[]', 'required': False, 'help': '业务标签名称', 'default': None},
179
+ {'name': 'userField', 'type': 'String', 'required': False, 'help': '自定义字段', 'default': None},
180
+ {'name': 'userValue', 'type': 'String', 'required': False, 'help': '自定义字段值,与userField配合使用', 'default': None},
181
+ {'name': 'customerMos', 'type': 'Integer[]', 'required': False, 'help': '客户侧通话质量。取值范围 1-4,对应较差到优秀', 'default': None},
182
+ {'name': 'agentMos', 'type': 'Integer[]', 'required': False, 'help': '座席侧通话质量。取值范围 1-4,对应较差到优秀', 'default': None},
183
+ {'name': 'intelligentBridgeTime', 'type': 'Long', 'required': False, 'help': '机器人接待时间,时间戳格式精确到秒。', 'default': None},
184
+ {'name': 'intelligentBridgeTimeEnd', 'type': 'Long', 'required': False, 'help': '机器人接待时间查询截止,时间戳格式精确到秒。', 'default': None},
185
+ {'name': 'intelligentEndTime', 'type': 'Long', 'required': False, 'help': '机器人结束时间,时间戳格式精确到秒。', 'default': None},
186
+ {'name': 'intelligentEndTimeEnd', 'type': 'Long', 'required': False, 'help': '机器人结束时间查询截止,时间戳格式精确到秒。', 'default': None},
187
+ {'name': 'intelligentBridgeDuration', 'type': 'Integer', 'required': False, 'help': '机器人通话时长范围查询最小值,和intelligentBridgeDurationEnd配合使用', 'default': None},
188
+ {'name': 'intelligentBridgeDurationEnd', 'type': 'Integer', 'required': False, 'help': '机器人通话时长范围查询最大值', 'default': None},
189
+ {'name': 'intelligentBotIds', 'type': 'String[]', 'required': False, 'help': '机器人ID', 'default': None},
190
+ {'name': 'intelligentStatus', 'type': 'Integer[]', 'required': False, 'help': '机器人接听状态。取值范围如下: 1: 机器人应答 2: 机器人未应答 默认全部', 'default': None},
191
+ {'name': 'intelligentStatusResult', 'type': 'int[]', 'required': False, 'help': '机器人接听结果。取值范围如下: 1: 正常应答 2: 对话轮次上限 3: 机器人异常 4: 机器人超并发 5: 桥接失败 默认全部', 'default': None},
192
+ {'name': 'intelligentRound', 'type': 'Integer', 'required': False, 'help': '对话轮次范围查询最小值,和intelligentRoundEnd配合使用', 'default': None},
193
+ {'name': 'intelligentRoundEnd', 'type': 'Integer', 'required': False, 'help': '对话轮次范围查询最大值', 'default': None},
194
+ {'name': 'intelligentInterruptCount', 'type': 'Integer', 'required': False, 'help': '打断次数范围查询最小值,和intelligentInterruptCountEnd配合使用', 'default': None},
195
+ {'name': 'intelligentInterruptCountEnd', 'type': 'Integer', 'required': False, 'help': '打断次数范围查询最大值', 'default': None},
196
+ {'name': 'intelligentTransfer', 'type': 'Integer', 'required': False, 'help': '是否转人工。取值范围如下: 1: 是 0: 否 默认全部', 'default': None},
197
+ {'name': 'intelligentGreeting', 'type': 'Integer', 'required': False, 'help': '开场白挂断点范围查询最小值,和intelligentInterruptCountEnd配合使用', 'default': None},
198
+ {'name': 'intelligentGreetingEnd', 'type': 'Integer', 'required': False, 'help': '开场白挂断点范围查询最大值', 'default': None},
199
+ {'name': 'intelligentEndFlow', 'type': 'String', 'required': False, 'help': '流程挂断点', 'default': None},
200
+ {'name': 'intelligentIntentionTag', 'type': 'String', 'required': False, 'help': '意向标签', 'default': None},
201
+ {'name': 'intelligentInfo', 'type': 'String', 'required': False, 'help': '信息捕获', 'default': None},
202
+ {'name': 'scrollSearch', 'type': 'boolean', 'required': False, 'help': '是否滚动查询。默认false,true代表使用滚动查询。', 'default': None},
203
+ {'name': 'scrollId', 'type': 'String', 'required': False, 'help': '滚动查询ID。配合scrollSearch使用,第一次查询时不需要传递此参数,后续查询可从返回列表中取值,并传参数。当scrollId为空时,代表滚动查询结束。', 'default': None},
204
+ {'name': 'offset', 'type': 'Integer', 'required': False, 'help': '偏移量,范围 0-99990。默认值为 0。注:limit + offset 不允许超过100000', 'default': 0},
205
+ {'name': 'limit', 'type': 'Integer', 'required': False, 'help': '查询条数,范围 10-100。默认值为 10。注:limit + offset 不允许超过100000', 'default': 10},
206
+ ],
207
+ '/cc/list_cdr_ib_intelligent_agent': [
208
+ {'name': 'startTime', 'type': 'Long', 'required': False, 'help': '开始时间,时间戳格式精确到秒。默认值取当前月份第一天', 'default': None},
209
+ {'name': 'startTimeEnd', 'type': 'Long', 'required': False, 'help': '开始时间查询截止,时间戳格式精确到秒,开始时间和结束时间跨度不能超过一个月。默认值取当前时间', 'default': None},
210
+ {'name': 'endTime', 'type': 'Long', 'required': False, 'help': '机器人结束时间,时间戳格式精确到秒', 'default': None},
211
+ {'name': 'endTimeEnd', 'type': 'Long', 'required': False, 'help': '机器人结束时间查询截止,时间戳格式精确到秒', 'default': None},
212
+ {'name': 'bridgeTime', 'type': 'Long', 'required': False, 'help': '机器人接待时间,时间戳格式精确到秒', 'default': None},
213
+ {'name': 'bridgeTimeEnd', 'type': 'Long', 'required': False, 'help': '机器人接待时间查询截止,时间戳格式精确到秒', 'default': None},
214
+ {'name': 'bridgeDuration', 'type': 'Integer', 'required': False, 'help': '机器人通话时长范围查询最小值,和bridgeDurationEnd配合使用', 'default': None},
215
+ {'name': 'bridgeDurationEnd', 'type': 'Integer', 'required': False, 'help': '机器人通话时长范围查询最大值', 'default': None},
216
+ {'name': 'interruptCount', 'type': 'Integer', 'required': False, 'help': '打断次数范围查询最小值,和interruptCountEnd配合使用', 'default': None},
217
+ {'name': 'interruptCountEnd', 'type': 'Integer', 'required': False, 'help': '打断次数范围查询最大值', 'default': None},
218
+ {'name': 'callIntention', 'type': 'String', 'required': False, 'help': '进线意图', 'default': None},
219
+ {'name': 'frequentIntention', 'type': 'String', 'required': False, 'help': '高频意图', 'default': None},
220
+ {'name': 'intentionTag', 'type': 'String', 'required': False, 'help': '意向标签', 'default': None},
221
+ {'name': 'solve', 'type': 'Integer', 'required': False, 'help': '是否解决', 'default': None},
222
+ {'name': 'firstIbStatus', 'type': 'Integer', 'required': False, 'help': '首次来电', 'default': None},
223
+ {'name': 'firstIbSolveStatus', 'type': 'Integer', 'required': False, 'help': '首次来电解决', 'default': None},
224
+ {'name': 'transferReason', 'type': 'String', 'required': False, 'help': '转人工原因', 'default': None},
225
+ {'name': 'mainUniqueId', 'type': 'String', 'required': False, 'help': '通话记录唯一标识', 'default': None},
226
+ {'name': 'reviewStatus', 'type': 'Integer', 'required': False, 'help': '审阅状态。0: 未读,1: 已读', 'default': None},
227
+ {'name': 'customerNumber', 'type': 'String', 'required': False, 'help': '客户号码', 'default': None},
228
+ {'name': 'customerNumberMatchType', 'type': 'Integer', 'required': False, 'help': '客户号码匹配类型。需与customerNumber配合使用。1: 前缀匹配,2: 后缀匹配,3: 包含匹配', 'default': None},
229
+ {'name': 'status', 'type': 'int[]', 'required': False, 'help': '机器人接听状态', 'default': None},
230
+ {'name': 'statusResult', 'type': 'int[]', 'required': False, 'help': '机器人接听结果', 'default': None},
231
+ {'name': 'botIds', 'type': 'String[]', 'required': False, 'help': '机器人ID', 'default': None},
232
+ {'name': 'round', 'type': 'Integer', 'required': False, 'help': '对话轮次范围查询最小值,和roundEnd配合使用', 'default': None},
233
+ {'name': 'roundEnd', 'type': 'Integer', 'required': False, 'help': '对话轮次范围查询最大值', 'default': None},
234
+ {'name': 'transfer', 'type': 'Integer', 'required': False, 'help': '是否转人工。1: 是,0: 否,默认全部', 'default': None},
235
+ {'name': 'transferBridge', 'type': 'int[]', 'required': False, 'help': '转人工接听状态', 'default': None},
236
+ {'name': 'userField', 'type': 'String', 'required': False, 'help': '自定义字段', 'default': None},
237
+ {'name': 'userValue', 'type': 'String', 'required': False, 'help': '自定义字段值,与userField配合使用', 'default': None},
238
+ {'name': 'taskId', 'type': 'int[]', 'required': False, 'help': '任务ID', 'default': None},
239
+ {'name': 'greeting', 'type': 'Integer', 'required': False, 'help': '开场白挂断点范围查询最小值,和greetingEnd配合使用', 'default': None},
240
+ {'name': 'greetingEnd', 'type': 'Integer', 'required': False, 'help': '开场白挂断点范围查询最大值', 'default': None},
241
+ {'name': 'endFlow', 'type': 'String', 'required': False, 'help': '流程挂断点', 'default': None},
242
+ {'name': 'info', 'type': 'String', 'required': False, 'help': '信息捕获', 'default': None},
243
+ {'name': 'abTaskGroupName', 'type': 'String', 'required': False, 'help': 'AB测试组名', 'default': None},
244
+ {'name': 'onHookSource', 'type': 'Integer[]', 'required': False, 'help': '挂断方,默认查询全部。说明参考<<通用字段>>', 'default': None},
245
+ {'name': 'fieldToSort', 'type': 'String', 'required': False, 'help': '排序字段,默认cdrStartTime', 'default': None},
246
+ {'name': 'sortDesc', 'type': 'Boolean', 'required': False, 'help': '排序方向。true: 倒序,false: 正序。默认true', 'default': None},
247
+ {'name': 'businessTagNames', 'type': 'String[]', 'required': False, 'help': '业务标签', 'default': None},
248
+ {'name': 'hiddenType', 'type': 'Integer', 'required': False, 'help': '是否隐藏号码。0: 不隐藏,1: 中间四位,2: 最后八位,3: 全部号码,4: 最后四位。默认值为 0', 'default': 0},
249
+ {'name': 'scrollSearch', 'type': 'boolean', 'required': False, 'help': '是否滚动查询。默认false,true代表使用滚动查询', 'default': None},
250
+ {'name': 'scrollId', 'type': 'String', 'required': False, 'help': '滚动查询ID。配合scrollSearch使用,第一次查询时不需要传递此参数,后续查询可从返回列表中取值,并传参数。当scrollId为空时,代表滚动查询结束', 'default': None},
251
+ {'name': 'offset', 'type': 'Integer', 'required': False, 'help': '偏移量,范围 0-99990。默认值为 0。注:limit + offset 不允许超过100000', 'default': 0},
252
+ {'name': 'limit', 'type': 'Integer', 'required': False, 'help': '查询条数,范围 10-100。默认值为 10。注:limit + offset 不允许超过100000', 'default': 10},
253
+ ],
254
+ '/cc/list_cdr_intelligent_agent': [
255
+ {'name': 'startTime', 'type': 'Long', 'required': False, 'help': '开始时间,时间戳格式精确到秒。默认值取当前月份第一天', 'default': None},
256
+ {'name': 'startTimeEnd', 'type': 'Long', 'required': False, 'help': '开始时间查询截止,时间戳格式精确到秒,开始时间和结束时间跨度不能超过一个月。默认值取当前时间', 'default': None},
257
+ {'name': 'endTime', 'type': 'Long', 'required': False, 'help': '机器人结束时间,时间戳格式精确到秒', 'default': None},
258
+ {'name': 'endTimeEnd', 'type': 'Long', 'required': False, 'help': '机器人结束时间查询截止,时间戳格式精确到秒', 'default': None},
259
+ {'name': 'bridgeTime', 'type': 'Long', 'required': False, 'help': '机器人接待时间,时间戳格式精确到秒', 'default': None},
260
+ {'name': 'bridgeTimeEnd', 'type': 'Long', 'required': False, 'help': '机器人接待时间查询截止,时间戳格式精确到秒', 'default': None},
261
+ {'name': 'bridgeDuration', 'type': 'Integer', 'required': False, 'help': '机器人通话时长范围查询最小值,和bridgeDurationEnd配合使用', 'default': None},
262
+ {'name': 'bridgeDurationEnd', 'type': 'Integer', 'required': False, 'help': '机器人通话时长范围查询最大值', 'default': None},
263
+ {'name': 'interruptCount', 'type': 'Integer', 'required': False, 'help': '打断次数范围查询最小值,和interruptCountEnd配合使用', 'default': None},
264
+ {'name': 'interruptCountEnd', 'type': 'Integer', 'required': False, 'help': '打断次数范围查询最大值', 'default': None},
265
+ {'name': 'callIntention', 'type': 'String', 'required': False, 'help': '进线意图', 'default': None},
266
+ {'name': 'frequentIntention', 'type': 'String', 'required': False, 'help': '高频意图', 'default': None},
267
+ {'name': 'intentionTag', 'type': 'String', 'required': False, 'help': '意向标签', 'default': None},
268
+ {'name': 'solve', 'type': 'Integer', 'required': False, 'help': '是否解决', 'default': None},
269
+ {'name': 'firstIbStatus', 'type': 'Integer', 'required': False, 'help': '首次来电', 'default': None},
270
+ {'name': 'firstIbSolveStatus', 'type': 'Integer', 'required': False, 'help': '首次来电解决', 'default': None},
271
+ {'name': 'transferReason', 'type': 'String', 'required': False, 'help': '转人工原因', 'default': None},
272
+ {'name': 'mainUniqueId', 'type': 'String', 'required': False, 'help': '通话记录唯一标识', 'default': None},
273
+ {'name': 'reviewStatus', 'type': 'Integer', 'required': False, 'help': '审阅状态。0: 未读,1: 已读', 'default': None},
274
+ {'name': 'customerNumber', 'type': 'String', 'required': False, 'help': '客户号码', 'default': None},
275
+ {'name': 'customerNumberMatchType', 'type': 'Integer', 'required': False, 'help': '客户号码匹配类型。需与customerNumber配合使用。1: 前缀匹配,2: 后缀匹配,3: 包含匹配', 'default': None},
276
+ {'name': 'status', 'type': 'int[]', 'required': False, 'help': '机器人接听状态', 'default': None},
277
+ {'name': 'statusResult', 'type': 'int[]', 'required': False, 'help': '机器人接听结果', 'default': None},
278
+ {'name': 'botIds', 'type': 'String[]', 'required': False, 'help': '机器人ID', 'default': None},
279
+ {'name': 'round', 'type': 'Integer', 'required': False, 'help': '对话轮次范围查询最小值,和roundEnd配合使用', 'default': None},
280
+ {'name': 'roundEnd', 'type': 'Integer', 'required': False, 'help': '对话轮次范围查询最大值', 'default': None},
281
+ {'name': 'transfer', 'type': 'Integer', 'required': False, 'help': '是否转人工。1: 是,0: 否,默认全部', 'default': None},
282
+ {'name': 'transferBridge', 'type': 'int[]', 'required': False, 'help': '转人工接听状态', 'default': None},
283
+ {'name': 'userField', 'type': 'String', 'required': False, 'help': '自定义字段', 'default': None},
284
+ {'name': 'userValue', 'type': 'String', 'required': False, 'help': '自定义字段值,与userField配合使用', 'default': None},
285
+ {'name': 'taskId', 'type': 'int[]', 'required': False, 'help': '任务ID', 'default': None},
286
+ {'name': 'greeting', 'type': 'Integer', 'required': False, 'help': '开场白挂断点范围查询最小值,和greetingEnd配合使用', 'default': None},
287
+ {'name': 'greetingEnd', 'type': 'Integer', 'required': False, 'help': '开场白挂断点范围查询最大值', 'default': None},
288
+ {'name': 'endFlow', 'type': 'String', 'required': False, 'help': '流程挂断点', 'default': None},
289
+ {'name': 'info', 'type': 'String', 'required': False, 'help': '信息捕获', 'default': None},
290
+ {'name': 'abTaskGroupName', 'type': 'String', 'required': False, 'help': 'AB测试组名', 'default': None},
291
+ {'name': 'onHookSource', 'type': 'Integer[]', 'required': False, 'help': '挂断方,默认查询全部。说明参考<<通用字段>>', 'default': None},
292
+ {'name': 'fieldToSort', 'type': 'String', 'required': False, 'help': '排序字段,默认cdrStartTime', 'default': None},
293
+ {'name': 'sortDesc', 'type': 'Boolean', 'required': False, 'help': '排序方向。true: 倒序,false: 正序。默认true', 'default': None},
294
+ {'name': 'businessTagNames', 'type': 'String[]', 'required': False, 'help': '业务标签', 'default': None},
295
+ {'name': 'hiddenType', 'type': 'Integer', 'required': False, 'help': '是否隐藏号码。0: 不隐藏,1: 中间四位,2: 最后八位,3: 全部号码,4: 最后四位。默认值为 0', 'default': 0},
296
+ {'name': 'scrollSearch', 'type': 'boolean', 'required': False, 'help': '是否滚动查询。默认false,true代表使用滚动查询', 'default': None},
297
+ {'name': 'scrollId', 'type': 'String', 'required': False, 'help': '滚动查询ID。配合scrollSearch使用,第一次查询时不需要传递此参数,后续查询可从返回列表中取值,并传参数。当scrollId为空时,代表滚动查询结束', 'default': None},
298
+ {'name': 'offset', 'type': 'Integer', 'required': False, 'help': '偏移量,范围 0-99990。默认值为 0。注:limit + offset 不允许超过100000', 'default': 0},
299
+ {'name': 'limit', 'type': 'Integer', 'required': False, 'help': '查询条数,范围 10-100。默认值为 10。注:limit + offset 不允许超过100000', 'default': 10},
300
+ ],
301
+ '/cc/detail_cdr_intelligent_agent': [
302
+ {'name': 'mainUniqueId', 'type': 'String', 'required': True, 'help': '通话记录唯一标识', 'default': None},
303
+ {'name': 'hiddenType', 'type': 'Integer', 'required': False, 'help': '是否隐藏号码。0: 不隐藏,1: 中间四位,2: 最后八位,3: 全部号码,4: 最后四位。默认值为 0', 'default': 0},
304
+ {'name': 'requestId', 'type': 'String', 'required': False, 'help': '机器人记录唯一标识。传入后按 mainUniqueId + requestId 过滤,返回数组中至多 1 条记录', 'default': None},
305
+ ],
306
+ '/cc/list_cdr_ob_internal': [
307
+ {'name': 'startTime', 'type': 'Long', 'required': False, 'help': '开始时间,时间戳格式精确到秒。默认值取当前月份第一天', 'default': None},
308
+ {'name': 'startTimeEnd', 'type': 'Long', 'required': False, 'help': '开始时间查询截止,时间戳格式精确到秒,开始时间和结束时间跨度不能超过一个月。默认值取当前时间', 'default': None},
309
+ {'name': 'bridgeTime', 'type': 'Long', 'required': False, 'help': '接通时间,时间戳格式精确到秒', 'default': None},
310
+ {'name': 'bridgeTimeEnd', 'type': 'Long', 'required': False, 'help': '接通时间查询截止,时间戳格式精确到秒', 'default': None},
311
+ {'name': 'endTime', 'type': 'Long', 'required': False, 'help': '结束时间,时间戳格式精确到秒', 'default': None},
312
+ {'name': 'endTimeEnd', 'type': 'Long', 'required': False, 'help': '结束时间查询截止,时间戳格式精确到秒', 'default': None},
313
+ {'name': 'bridgeDuration', 'type': 'Integer', 'required': False, 'help': '通话时长范围查询最小值,和bridgeDurationEnd配合使用', 'default': None},
314
+ {'name': 'bridgeDurationEnd', 'type': 'Integer', 'required': False, 'help': '通话时长范围查询最大值', 'default': None},
315
+ {'name': 'totalDuration', 'type': 'Integer', 'required': False, 'help': '总时长范围查询最小值,和totalDurationEnd配合使用', 'default': None},
316
+ {'name': 'totalDurationEnd', 'type': 'Integer', 'required': False, 'help': '总时长范围查询最大值', 'default': None},
317
+ {'name': 'cnos', 'type': 'String[]', 'required': False, 'help': '座席工号', 'default': None},
318
+ {'name': 'clientNumber', 'type': 'String', 'required': False, 'help': '座席电话', 'default': None},
319
+ {'name': 'internalType', 'type': 'Integer', 'required': False, 'help': '内部呼叫类型', 'default': None},
320
+ {'name': 'internalObj', 'type': 'String[]', 'required': False, 'help': '内部呼叫对象', 'default': None},
321
+ {'name': 'bridgeStatus', 'type': 'Integer[]', 'required': False, 'help': '接听状态', 'default': None},
322
+ {'name': 'mainUniqueId', 'type': 'String', 'required': False, 'help': '通话记录唯一标识', 'default': None},
323
+ {'name': 'requestUniqueId', 'type': 'String', 'required': False, 'help': '请求唯一ID', 'default': None},
324
+ {'name': 'fieldToSort', 'type': 'String', 'required': False, 'help': '排序字段,默认startTime', 'default': None},
325
+ {'name': 'sortDesc', 'type': 'Boolean', 'required': False, 'help': '排序方向。true: 倒序,false: 正序。默认true', 'default': None},
326
+ {'name': 'hiddenType', 'type': 'Integer', 'required': False, 'help': '是否隐藏号码。0: 不隐藏,1: 中间四位,2: 最后八位,3: 全部号码,4: 最后四位。默认值为 0', 'default': 0},
327
+ {'name': 'scrollSearch', 'type': 'boolean', 'required': False, 'help': '是否滚动查询。默认false,true代表使用滚动查询', 'default': None},
328
+ {'name': 'scrollId', 'type': 'String', 'required': False, 'help': '滚动查询ID。配合scrollSearch使用,第一次查询时不需要传递此参数,后续查询可从返回列表中取值,并传参数。当scrollId为空时,代表滚动查询结束', 'default': None},
329
+ {'name': 'offset', 'type': 'Integer', 'required': False, 'help': '偏移量,范围 0-99990。默认值为 0。注:limit + offset 不允许超过100000', 'default': 0},
330
+ {'name': 'limit', 'type': 'Integer', 'required': False, 'help': '查询条数,范围 10-100。默认值为 10。注:limit + offset 不允许超过100000', 'default': 10},
331
+ ],
332
+ '/cc/detail_cdr_ob_internal': [
333
+ {'name': 'mainUniqueId', 'type': 'String', 'required': True, 'help': '通话记录唯一标识。非法mainUniqueId返回参数错误,查不到返回资源不存在', 'default': None},
334
+ {'name': 'hiddenType', 'type': 'Integer', 'required': False, 'help': '是否隐藏号码。0: 不隐藏,1: 中间四位,2: 最后八位,3: 全部号码,4: 最后四位。默认值为 0', 'default': 0},
335
+ ],
336
+ }
@@ -0,0 +1,47 @@
1
+ """Click option 工厂:按 OpenAPI 规格生成 kebab-case 选项。"""
2
+
3
+ from __future__ import annotations
4
+
5
+ from collections.abc import Callable, Sequence
6
+ from typing import Any
7
+
8
+ import click
9
+
10
+ from cli_anything.clink2.core.params import camel_to_kebab
11
+
12
+
13
+ def _click_type(api_type: str) -> type | click.ParamType:
14
+ """Map OpenAPI type name to Click type."""
15
+ if api_type in ("Integer", "Long", "Int"):
16
+ return int
17
+ return str
18
+
19
+
20
+ def with_api_options(params: Sequence[dict[str, Any]]) -> Callable[[Callable[..., Any]], Callable[..., Any]]:
21
+ """按规格为命令追加 Click options(CLI kebab-case → 目标名 camelCase)。
22
+
23
+ Args:
24
+ params: ``cdr_specs`` 中的参数字典列表。
25
+
26
+ Returns:
27
+ 装饰器,从下到上应用 option(Click 约定)。
28
+ """
29
+
30
+ def decorator(func: Callable[..., Any]) -> Callable[..., Any]:
31
+ for p in reversed(list(params)):
32
+ name = p["name"]
33
+ kebab = camel_to_kebab(name)
34
+ kwargs: dict[str, Any] = {
35
+ "required": bool(p.get("required")),
36
+ "help": p.get("help") or name,
37
+ "type": _click_type(str(p.get("type") or "String")),
38
+ }
39
+ if not kwargs["required"]:
40
+ default = p.get("default")
41
+ kwargs["default"] = default
42
+ if default is not None:
43
+ kwargs["show_default"] = True
44
+ func = click.option(f"--{kebab}", name, **kwargs)(func)
45
+ return func
46
+
47
+ return decorator
@@ -0,0 +1,31 @@
1
+ """CLI 可选参数组装为 OpenAPI query(camelCase)。"""
2
+
3
+ from __future__ import annotations
4
+
5
+ import re
6
+ from typing import Any, Mapping
7
+
8
+
9
+ def camel_to_kebab(name: str) -> str:
10
+ """将 camelCase / PascalCase 转为 kebab-case。
11
+
12
+ Args:
13
+ name: OpenAPI 参数名,如 ``startTime``、``mainUniqueId``。
14
+
15
+ Returns:
16
+ kebab-case 字符串,如 ``start-time``、``main-unique-id``。
17
+ """
18
+ s1 = re.sub(r"(.)([A-Z][a-z]+)", r"\1-\2", name)
19
+ return re.sub(r"([a-z0-9])([A-Z])", r"\1-\2", s1).lower()
20
+
21
+
22
+ def build_query_params(values: Mapping[str, Any]) -> dict[str, Any]:
23
+ """过滤 ``None``,其余原样写入 query(含数组逗号串)。
24
+
25
+ Args:
26
+ values: camelCase 键到值的映射;未传 option 对应 ``None``。
27
+
28
+ Returns:
29
+ 可交给 ``_run_api`` 的 params 字典。
30
+ """
31
+ return {k: v for k, v in values.items() if v is not None}
@@ -4,9 +4,11 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "tinet-clink2-cli"
7
- version = "0.0.2"
8
- description = "Clink2 OpenAPI CLI"
9
- readme = "README.md"
7
+ version = "0.0.3"
8
+ description = "Tinet Clink2 OpenAPI CLI"
9
+ # long_description 由 setup.py 从 README.md(或 sdist 内 PKG-INFO)注入;
10
+ # 不在此声明 readme,以免 setuptools 强制要求归档内带有 README.md。
11
+ dynamic = ["readme"]
10
12
  requires-python = ">=3.10"
11
13
  dependencies = [
12
14
  "click>=8.0",
@@ -0,0 +1,47 @@
1
+ """Build helper: embed README into metadata, omit README.md from sdist files."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from email.parser import Parser
6
+ from pathlib import Path
7
+
8
+ from setuptools import setup
9
+ from setuptools.command.sdist import sdist as _sdist
10
+
11
+ ROOT = Path(__file__).resolve().parent
12
+
13
+
14
+ def load_long_description() -> str:
15
+ """Load Markdown long description from README.md or sdist PKG-INFO."""
16
+ readme = ROOT / "README.md"
17
+ if readme.is_file():
18
+ return readme.read_text(encoding="utf-8")
19
+
20
+ # `python -m build` rebuilds the wheel from an sdist that deliberately
21
+ # excludes README.md; recover the description already written into PKG-INFO.
22
+ pkg_info = ROOT / "PKG-INFO"
23
+ if pkg_info.is_file():
24
+ msg = Parser().parsestr(pkg_info.read_text(encoding="utf-8"))
25
+ payload = msg.get_payload()
26
+ if isinstance(payload, str) and payload.strip():
27
+ return payload
28
+ description = msg.get("Description")
29
+ if description:
30
+ return description
31
+ return ""
32
+
33
+
34
+ class sdist_without_readme(_sdist):
35
+ """Drop README.md from the sdist file list (metadata already embeds its text)."""
36
+
37
+ def make_release_tree(self, base_dir, files): # type: ignore[no-untyped-def]
38
+ """Build release tree without shipping README.md as a package file."""
39
+ filtered = [f for f in files if Path(f).name != "README.md"]
40
+ super().make_release_tree(base_dir, filtered)
41
+
42
+
43
+ setup(
44
+ cmdclass={"sdist": sdist_without_readme},
45
+ long_description=load_long_description(),
46
+ long_description_content_type="text/markdown",
47
+ )
@@ -1,7 +1,7 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: tinet-clink2-cli
3
- Version: 0.0.2
4
- Summary: Clink2 OpenAPI CLI
3
+ Version: 0.0.3
4
+ Summary: Tinet Clink2 OpenAPI CLI
5
5
  Requires-Python: >=3.10
6
6
  Description-Content-Type: text/markdown
7
7
  Requires-Dist: click>=8.0
@@ -10,10 +10,12 @@ Provides-Extra: dev
10
10
  Requires-Dist: pytest>=7.0; extra == "dev"
11
11
  Requires-Dist: responses>=0.25; extra == "dev"
12
12
  Requires-Dist: build>=1.0; extra == "dev"
13
+ Dynamic: description
14
+ Dynamic: description-content-type
13
15
 
14
16
  Clink2 命令行客户端,封装 OpenAPI 接口,与 [智慧服务平台开发者中心](https://develop.clink.cn) 中参数与响应一致,适合脚本化集成与 Agent 调用。
15
17
 
16
- **当前版本:** `0.0.2`
18
+ **当前版本:** `0.0.3`
17
19
  **PyPI:** https://pypi.org/project/tinet-clink2-cli/
18
20
 
19
21
  ## 功能概览
@@ -21,15 +23,18 @@ Clink2 命令行客户端,封装 OpenAPI 接口,与 [智慧服务平台开
21
23
  | 子命令 | 说明 |
22
24
  |--------|------|
23
25
  | **`config`** | 本地凭证管理 |
24
- | **`ivr`** | 语音导航查询:列表、节点列表 |
25
- | **`voicemail`** | 留言箱设置:查看留言箱列表 |
26
+ | **`cdr-auto-task`** | 任务呼叫记录查询 |
27
+ | **`cdr-bot`** | 机器人话单查询 |
28
+ | **`cdr-ib`** | 呼入通话记录查询 |
29
+ | **`cdr-internal`** | 内部呼叫记录查询 |
30
+ | **`cdr-ob`** | 外呼通话记录查询 |
31
+ | **`ivr`** | 语音导航查询 |
32
+ | **`voicemail`** | 留言箱设置查询 |
26
33
 
27
34
  所有出站 HTTP 请求自动附加:
28
35
  - `X-Trace-Id: {UUID}`
29
36
  - `X-Clink2-CLI-Version: {CLI 版本}`
30
37
 
31
- 本地默认写入 JSON Lines 日志:`~/.clink2/logs/clink2.log`(单文件最大 10MB,滚动保留 5 个)。
32
-
33
38
  ## 环境要求
34
39
 
35
40
  - Python **≥ 3.10**
@@ -42,14 +47,14 @@ Clink2 命令行客户端,封装 OpenAPI 接口,与 [智慧服务平台开
42
47
 
43
48
  ```bash
44
49
  pip install tinet-clink2-cli
45
- tinet-clink2-cli --version # 0.0.2
50
+ tinet-clink2-cli --version # 0.0.3
46
51
  tinet-clink2-cli --help
47
52
  ```
48
53
 
49
54
  指定版本或升级:
50
55
 
51
56
  ```bash
52
- pip install 'tinet-clink2-cli==0.0.2'
57
+ pip install 'tinet-clink2-cli==0.0.3'
53
58
  pip install --upgrade tinet-clink2-cli
54
59
  ```
55
60
 
@@ -67,8 +72,8 @@ pipx install tinet-clink2-cli
67
72
 
68
73
  ```bash
69
74
  tinet-clink2-cli config set \
70
- --accessKeyId your_access_key_id \
71
- --accessKeySecret your_access_key_secret \
75
+ --access-key-id your_access_key_id \
76
+ --access-key-secret your_access_key_secret \
72
77
  --endpoint https://api-bj.clink.cn \
73
78
  --expires 60 \
74
79
  --log true
@@ -80,22 +85,30 @@ tinet-clink2-cli config show
80
85
 
81
86
  ## 快速示例
82
87
 
83
- 顺序与上方「功能概览」一致。完整取值见各子命令 `--help` 或 [开发者中心](https://develop.clink.cn)。
84
-
85
88
  ```bash
86
89
  # config
87
90
  tinet-clink2-cli config show
88
91
 
89
92
  # ivr
90
- tinet-clink2-cli ivr nodes --ivrName your_ivr_name
93
+ tinet-clink2-cli ivr nodes --ivr-name your_ivr_name
91
94
  tinet-clink2-cli --json ivr list
92
95
 
96
+ # CDR(未传时间参数时使用服务端默认时间窗)
97
+ tinet-clink2-cli --json cdr-ib list
98
+ tinet-clink2-cli --json cdr-ib detail --main-unique-id medias_1-xxx
99
+ tinet-clink2-cli --json cdr-ob list --cnos 0001,0002
100
+ tinet-clink2-cli --json cdr-auto-task list
101
+ tinet-clink2-cli --json cdr-bot ib-list
102
+ tinet-clink2-cli --json cdr-internal list
103
+
93
104
  # dry-run:仅校验入参与配置,不调用服务端(是否写日志取决于 config.log)
94
105
  tinet-clink2-cli --dry-run ivr list
95
106
  tinet-clink2-cli --dry-run voicemail list --offset 0 --limit 10
107
+ tinet-clink2-cli --dry-run cdr-ib list
96
108
 
97
109
  # verbose:向 stderr 打印 url / method / 版本 Header / TraceId / result(不含 body)
98
110
  tinet-clink2-cli --verbose --json voicemail list
111
+ tinet-clink2-cli --verbose --dry-run cdr-ob list
99
112
  ```
100
113
 
101
114
  全局选项:
@@ -105,14 +118,18 @@ tinet-clink2-cli --verbose --json voicemail list
105
118
 
106
119
  ## 安全提示
107
120
 
108
- - 勿将 AccessKeySecret 写入仓库、截图或日志外发渠道。
109
- - `config set --log false` 为用户显式关闭本地审计;关闭后排障将缺少本地 JSON 日志。
121
+ - 勿将 AccessKeySecret 写入仓库、截图或日志外发渠道
110
122
 
111
123
  ## 帮助与 API 文档
112
124
 
113
125
  ```bash
114
126
  tinet-clink2-cli --help
115
127
  tinet-clink2-cli config --help
128
+ tinet-clink2-cli cdr-auto-task --help
129
+ tinet-clink2-cli cdr-bot --help
130
+ tinet-clink2-cli cdr-ib --help
131
+ tinet-clink2-cli cdr-internal --help
132
+ tinet-clink2-cli cdr-ob --help
116
133
  tinet-clink2-cli ivr --help
117
134
  tinet-clink2-cli voicemail --help
118
135
  ```
@@ -1,13 +1,17 @@
1
1
  MANIFEST.in
2
- README.md
3
2
  pyproject.toml
3
+ setup.py
4
4
  cli_anything/clink2/__init__.py
5
5
  cli_anything/clink2/clink2_cli.py
6
+ cli_anything/clink2/commands/__init__.py
7
+ cli_anything/clink2/commands/cdr_specs.py
8
+ cli_anything/clink2/commands/options.py
6
9
  cli_anything/clink2/core/__init__.py
7
10
  cli_anything/clink2/core/auth.py
8
11
  cli_anything/clink2/core/config.py
9
12
  cli_anything/clink2/core/http.py
10
13
  cli_anything/clink2/core/logging.py
14
+ cli_anything/clink2/core/params.py
11
15
  tinet_clink2_cli.egg-info/PKG-INFO
12
16
  tinet_clink2_cli.egg-info/SOURCES.txt
13
17
  tinet_clink2_cli.egg-info/dependency_links.txt
@@ -1,107 +0,0 @@
1
- Clink2 命令行客户端,封装 OpenAPI 接口,与 [智慧服务平台开发者中心](https://develop.clink.cn) 中参数与响应一致,适合脚本化集成与 Agent 调用。
2
-
3
- **当前版本:** `0.0.2`
4
- **PyPI:** https://pypi.org/project/tinet-clink2-cli/
5
-
6
- ## 功能概览
7
-
8
- | 子命令 | 说明 |
9
- |--------|------|
10
- | **`config`** | 本地凭证管理 |
11
- | **`ivr`** | 语音导航查询:列表、节点列表 |
12
- | **`voicemail`** | 留言箱设置:查看留言箱列表 |
13
-
14
- 所有出站 HTTP 请求自动附加:
15
- - `X-Trace-Id: {UUID}`
16
- - `X-Clink2-CLI-Version: {CLI 版本}`
17
-
18
- 本地默认写入 JSON Lines 日志:`~/.clink2/logs/clink2.log`(单文件最大 10MB,滚动保留 5 个)。
19
-
20
- ## 环境要求
21
-
22
- - Python **≥ 3.10**
23
- - 运行时需访问公有云接入地址,例如 `https://api-bj.clink.cn` / `https://api-sh.clink.cn`
24
- - 需在管理后台获取 AccessKeyId / AccessKeySecret(系统管理 → 安全设置 → 接口密钥)
25
-
26
- ## 安装
27
-
28
- 从 [PyPI](https://pypi.org/project/tinet-clink2-cli/) 安装(推荐):
29
-
30
- ```bash
31
- pip install tinet-clink2-cli
32
- tinet-clink2-cli --version # 0.0.2
33
- tinet-clink2-cli --help
34
- ```
35
-
36
- 指定版本或升级:
37
-
38
- ```bash
39
- pip install 'tinet-clink2-cli==0.0.2'
40
- pip install --upgrade tinet-clink2-cli
41
- ```
42
-
43
- macOS 等受限环境可使用 [pipx](https://pipx.pypa.io/):
44
-
45
- ```bash
46
- pipx install tinet-clink2-cli
47
- ```
48
-
49
- ## 配置凭证
50
-
51
- **配置文件:** `~/.clink2/config.json`
52
-
53
- 配置示例:
54
-
55
- ```bash
56
- tinet-clink2-cli config set \
57
- --accessKeyId your_access_key_id \
58
- --accessKeySecret your_access_key_secret \
59
- --endpoint https://api-bj.clink.cn \
60
- --expires 60 \
61
- --log true
62
-
63
- tinet-clink2-cli config show
64
- ```
65
-
66
- 默认接入地址为北京:`https://api-bj.clink.cn`。`config show` 会对 AccessKeySecret 脱敏。
67
-
68
- ## 快速示例
69
-
70
- 顺序与上方「功能概览」一致。完整取值见各子命令 `--help` 或 [开发者中心](https://develop.clink.cn)。
71
-
72
- ```bash
73
- # config
74
- tinet-clink2-cli config show
75
-
76
- # ivr
77
- tinet-clink2-cli ivr nodes --ivrName your_ivr_name
78
- tinet-clink2-cli --json ivr list
79
-
80
- # dry-run:仅校验入参与配置,不调用服务端(是否写日志取决于 config.log)
81
- tinet-clink2-cli --dry-run ivr list
82
- tinet-clink2-cli --dry-run voicemail list --offset 0 --limit 10
83
-
84
- # verbose:向 stderr 打印 url / method / 版本 Header / TraceId / result(不含 body)
85
- tinet-clink2-cli --verbose --json voicemail list
86
- ```
87
-
88
- 全局选项:
89
- - `--json`:机器可读 stdout
90
- - `--dry-run`:本地校验与预览,不发请求
91
- - `--verbose`:stderr 排障
92
-
93
- ## 安全提示
94
-
95
- - 勿将 AccessKeySecret 写入仓库、截图或日志外发渠道。
96
- - `config set --log false` 为用户显式关闭本地审计;关闭后排障将缺少本地 JSON 日志。
97
-
98
- ## 帮助与 API 文档
99
-
100
- ```bash
101
- tinet-clink2-cli --help
102
- tinet-clink2-cli config --help
103
- tinet-clink2-cli ivr --help
104
- tinet-clink2-cli voicemail --help
105
- ```
106
-
107
- OpenAPI 契约与字段说明见 [智慧服务平台开发者中心](https://develop.clink.cn)。