最近公司要做一个外呼机器人相关的功能,这里做个记录。
1、阿里云控制台开通智能外呼机器人,必须要企业账号才行。
2、外呼号码申请,这里可以是客户自己的,也可以买三方的,我们这边是购买的三方的。在阿里云控制台填写申请单,后续有人对接。

3、对话场景创建-流程图绘制
这里值得说的是:
1、我试过用大模型场景,它总是会自己有一些想法,说一些无法控制的内容。所以我用的是小模型场景。
2、流程图的绘制需要研究一下,类似工作流,比较简单。
4、接口的调用
阿里云的文档写的都比较清楚了,我是引用的sdk maven方式。提供了内部方法,直接调用就行,大概流程 :
CreateJobGroup->assignJobs->QueryJobsWithResult->DescribeJob->DownloadRecording
其中assignJobs就是提交基本信息,被呼叫的电话,流程图里面设计的变量这些东西。
5、调用测试代码
static final String accessKeyId="";
static final String accessKeySecret="";
@Test
void testCreateJobGroup() throws ExecutionException, InterruptedException {
// 从环境变量中获取 AccessKey
StaticCredentialProvider provider = StaticCredentialProvider.create(Credential.builder()
.accessKeyId(accessKeyId)
.accessKeySecret(accessKeySecret)
// .securityToken(System.getenv("ALIBABA_CLOUD_SECURITY_TOKEN")) // 如使用STS,可取消注释
.build());
// 使用 try-with-resources 自动关闭 AsyncClient
try (AsyncClient client = AsyncClient.builder()
.region("cn-shanghai") // 设置区域
.credentialsProvider(provider)
.overrideConfiguration(ClientOverrideConfiguration.create()
.setEndpointOverride("outboundbot.cn-shanghai.aliyuncs.com")) // 设置服务 endpoint
.build()) {
// 构建创建任务组请求
CreateJobGroupRequest request = CreateJobGroupRequest.builder()
.instanceId("58f1a15a-a1be-4049-9f7e-7f324dd34e2a")
.jobGroupName("打电话")
.jobGroupDescription("测试任务组")
.scriptId("04f54cb7-3eca-456d-97d8-78e54cd8fba9")
.build();
// 异步请求,使用 get() 转为同步等待结果
CompletableFuture<CreateJobGroupResponse> future = client.createJobGroup(request);
CreateJobGroupResponse response = future.get();
// 正确打印结果(避免错误类型转换)
System.out.println(JSON.toJSONString(response.getBody()));
} catch (Exception e) {
System.err.println("创建任务组失败:" + e.getMessage());
e.printStackTrace();
}
}
@Test
void assignJobs() throws ExecutionException, InterruptedException {
StaticCredentialProvider provider = StaticCredentialProvider.create(Credential.builder()
.accessKeyId(accessKeyId)
.accessKeySecret(accessKeySecret)
.build());
try (AsyncClient client = AsyncClient.builder()
.region("cn-shanghai")
.credentialsProvider(provider)
.overrideConfiguration(ClientOverrideConfiguration.create()
.setEndpointOverride("outboundbot.cn-shanghai.aliyuncs.com"))
.build()) {
String jobJson = "{\n" +
" \"extras\": [\n" +
" {\"key\": \"name\", \"value\": \"何伯\"}"+
" ],\n" +
" \"contacts\": [\n" +
" {\n" +
" \"phoneNumber\": \"*****\",\n" +
" \"name\": \"何伯\",\n" +
" \"referenceId\": \"C01\",\n" +
" \"role\": \"132\",\n" +
" \"honorific\": \"何伯\"\n" +
" }\n" +
" ]\n" +
"}";
AssignJobsRequest assignJobsRequest = AssignJobsRequest.builder()
.instanceId("58f1a15a-a1be-4049-9f7e-7f324dd34e2a")
.jobGroupId("7881697e-6064-45e4-aace-a3ad6d3fce29")
.jobsJson(Collections.singletonList(jobJson))
.build();
CompletableFuture<AssignJobsResponse> response = client.assignJobs(assignJobsRequest);
AssignJobsResponse resp = response.get();
System.out.println(JSON.toJSONString(resp.getBody()));
} catch (Exception e) {
System.err.println("分配任务失败: " + e.getMessage());
e.printStackTrace();
}
}
@Test
void QueryJobsWithResult() throws ExecutionException, InterruptedException {
StaticCredentialProvider provider = StaticCredentialProvider.create(Credential.builder()
.accessKeyId(accessKeyId)
.accessKeySecret(accessKeySecret)
.build());
// Configure the Client
AsyncClient client = AsyncClient.builder()
.region("cn-shanghai") // Region ID
.credentialsProvider(provider)
.overrideConfiguration(
ClientOverrideConfiguration.create()
// Endpoint 请参考 https://api.aliyun.com/product/OutboundBot
.setEndpointOverride("outboundbot.cn-shanghai.aliyuncs.com")
//.setConnectTimeout(Duration.ofSeconds(30))
)
.build();
// Parameter settings for API request
QueryJobsWithResultRequest queryJobsWithResultRequest = QueryJobsWithResultRequest.builder()
.jobGroupId("7881697e-6064-45e4-aace-a3ad6d3fce29")
.instanceId("58f1a15a-a1be-4049-9f7e-7f324dd34e2a")
.pageNumber(1)
.pageSize(10)
// Request-level configuration rewrite, can set Http request parameters, etc.
// .requestConfiguration(RequestConfiguration.create().setHttpHeaders(new HttpHeaders()))
.build();
CompletableFuture<QueryJobsWithResultResponse> response = client.queryJobsWithResult(queryJobsWithResultRequest);
QueryJobsWithResultResponse resp = response.get();
System.out.println(JSON.toJSONString(resp.getBody()));
client.close();
}
@Test
void DownloadRecording() throws ExecutionException, InterruptedException {
StaticCredentialProvider provider = StaticCredentialProvider.create(Credential.builder()
.accessKeyId(accessKeyId)
.accessKeySecret(accessKeySecret)
.build());
AsyncClient client = AsyncClient.builder()
.region("cn-shanghai") // Region ID
.credentialsProvider(provider)
.overrideConfiguration(
ClientOverrideConfiguration.create()
.setEndpointOverride("outboundbot.cn-shanghai.aliyuncs.com")
)
.build();
DownloadRecordingRequest downloadRecordingRequest = DownloadRecordingRequest.builder()
.instanceId("58f1a15a-a1be-4049-9f7e-7f324dd34e2a")
.taskId("e2cff230-5aa6-4692-bd0c-7ada00f6c862")
.build();
CompletableFuture<DownloadRecordingResponse> response = client.downloadRecording(downloadRecordingRequest);
DownloadRecordingResponse resp = response.get();
System.out.println(JSON.toJSONString(resp.getBody()));
client.close();
}
@Test
void DescribeJob() throws ExecutionException, InterruptedException {
StaticCredentialProvider provider = StaticCredentialProvider.create(Credential.builder()
.accessKeyId(accessKeyId)
.accessKeySecret(accessKeySecret)
.build());
AsyncClient client = AsyncClient.builder()
.region("cn-shanghai") // Region ID
.credentialsProvider(provider)
.overrideConfiguration(
ClientOverrideConfiguration.create()
// Endpoint 请参考 https://api.aliyun.com/product/OutboundBot
.setEndpointOverride("outboundbot.cn-shanghai.aliyuncs.com")
)
.build();
DescribeJobRequest describeJobRequest = DescribeJobRequest.builder()
.instanceId("58f1a15a-a1be-4049-9f7e-7f324dd34e2a")
.jobId("1753949510090-496a-9b94-eba402b3cd59")
.build();
CompletableFuture<DescribeJobResponse> response = client.describeJob(describeJobRequest);
DescribeJobResponse resp = response.get();
System.out.println(JSON.toJSONString(resp.getBody()));
client.close();
}
大概就是这样,instanceId 就是你创建的场景的id,其他的都是接口调用返回的数据。剩下的就是根据接口返回的数据,存储需要的内容,做自己的业务逻辑了。
所有评论(0)