2、AI能力接入准备:申请AI能力、获取Access Token、配置回调地址

好,咱们接着往下走。上一章我们把抖音小程序的开发环境搭好了,脚手架也跑起来了。但说实话,那只是个空壳子。真正让小程序“智能”起来的,是抖音平台提供的那些AI能力。

这一章,我就带你走一遍接入前的准备工作。说白了,就是三件事:申请能力、拿令牌、配回调。这三步走不对,后面全是白搭。我在项目里见过太多人卡在这一步,代码写完了发现权限没开,那叫一个尴尬。

2.1 申请AI能力——不是所有能力都默认开放

抖音开放平台提供了不少AI能力,比如OCR(文字识别)、语音识别、图像识别等等。但注意,这些能力不是注册了账号就自动有的。你得一个个去申请。

我个人习惯是,先列个清单,看看项目到底需要什么。别一股脑全申请了,审核也慢,管理也乱。

2.1.1 能力清单长什么样?

我整理了一份常用的AI能力表,你参考一下:

能力名称 能力ID 适用场景 申请门槛
通用文字识别 ocr_general 图片文字提取、卡证识别 低(企业认证即可)
语音识别(短语音) asr_short 语音搜索、语音输入 中(需提交场景说明)
语音合成 tts_default 语音播报、有声内容
图像审核 image_censor 内容安全、违规检测 高(需签署合规协议)
人脸检测 face_detect 美颜特效、人脸分析
小提示:申请的时候,能力ID千万别填错。我见过有人把“ocr_general”写成了“ocr_genera”,结果审核来回折腾了两天。复制粘贴最保险。

2.1.2 申请流程

操作路径其实很简单。登录抖音开放平台控制台,找到「AI能力」菜单,点进去就能看到所有可用的能力列表。

点击「申请」按钮,会弹出一个表单。一般需要填:

  • 应用名称:选你当前开发的小程序
  • 能力用途:简单描述一下你打算怎么用这个能力
  • 预估调用量:填个大概的数字就行,不用太精确

提交之后,等着审核。快的几分钟,慢的一两天。嗯,这里要注意,如果审核被拒,通常是因为用途描述写得太模糊。比如你写“用于识别图片”,这就不行。你得写清楚:“用于识别用户上传的身份证照片,提取姓名和身份证号”。越具体,过审越快。

2.2 获取Access Token——你的API通行证

能力申请下来了,接下来就是拿令牌。Access Token,说白了就是你调用AI接口时的身份凭证。每次请求都得带上它,不然平台不认识你。

我记得刚开始做接入时,我犯过一个低级错误——把Token写死在代码里。结果Token过期了,线上服务直接崩了。后来学乖了,必须动态获取、定时刷新。

2.2.1 获取Token的接口

抖音开放平台提供了一个统一的接口来拿Token:

POST https://open.douyin.com/oauth/client_token/
Content-Type: application/json

{
  "client_key": "你的应用的client_key",
  "client_secret": "你的应用的client_secret",
  "grant_type": "client_credential"
}

返回的数据长这样:

{
  "message": "success",
  "data": {
    "access_token": "clt.xxxxxx.xxxxxxxxxxxxxxxxxxxxxxxx",
    "expires_in": 86400,
    "refresh_token": "rft.xxxxxx.xxxxxxxxxxxxxxxxxxxxxxxx"
  }
}
关键点:expires_in 的单位是秒。86400秒就是24小时。也就是说,Token有效期只有一天。过期了就得重新获取。

2.2.2 怎么管理Token?

我建议你在服务端维护一个Token管理模块。大致逻辑是这样的:

  1. 启动时先检查本地有没有缓存的Token
  2. 如果有,检查是否过期(比较当前时间和expires_in)
  3. 如果没过期,直接用
  4. 如果过期了或没有,重新请求新的Token
  5. 把新Token存起来,同时记录获取时间

代码示例(Node.js版):

const axios = require('axios');

class TokenManager {
  constructor(clientKey, clientSecret) {
    this.clientKey = clientKey;
    this.clientSecret = clientSecret;
    this.token = null;
    this.expireTime = 0;
  }

  async getToken() {
    // 如果Token还在有效期内,直接返回
    if (this.token && Date.now() < this.expireTime) {
      return this.token;
    }

    // 否则重新获取
    const res = await axios.post('https://open.douyin.com/oauth/client_token/', {
      client_key: this.clientKey,
      client_secret: this.clientSecret,
      grant_type: 'client_credential'
    });

    const data = res.data.data;
    this.token = data.access_token;
    // 提前5分钟过期,留点余量
    this.expireTime = Date.now() + (data.expires_in - 300) * 1000;

    return this.token;
  }
}

// 使用
const tokenMgr = new TokenManager('你的client_key', '你的client_secret');
const token = await tokenMgr.getToken();
警告:千万不要把client_secret暴露到前端代码里!这玩意儿是服务端密钥,泄露了别人就能冒充你的应用调用API。我曾经见过一个项目,把密钥写在小程序代码里,结果被人扒出来刷了几十万次接口,账单直接爆炸。

2.3 配置回调地址——让AI主动找你

有些AI能力是异步的。比如语音识别长音频、视频审核这些,你提交任务后,平台处理需要时间。处理完了,它会通过回调地址通知你结果。

说白了,回调就是平台主动给你打电话,告诉你“活干完了,来拿结果吧”。

2.3.1 回调地址怎么配?

在抖音开放平台控制台,找到你的应用,进入「能力配置」页面。每个AI能力下面,基本都有一个「回调地址」的配置项。

填什么?填你服务端的一个HTTP接口地址。比如:

https://你的域名.com/api/ai/callback/ocr

注意,必须是公网可访问的地址。本地调试时,你可以用内网穿透工具(比如ngrok)临时搞一个公网地址来测试。

2.3.2 回调接口怎么写?

回调接口需要接收POST请求,数据格式一般是JSON。以OCR为例,回调数据长这样:

{
  "event": "ocr_result",
  "task_id": "task_xxxxxxxxxxxx",
  "data": {
    "status": "success",
    "result": {
      "text": "识别的文字内容",
      "confidence": 0.98
    }
  }
}

你的接口要做的事很简单:

  • 校验签名(防止伪造回调)
  • 根据task_id找到对应的任务
  • 把结果存起来或者推送给前端
  • 返回200状态码,告诉平台“我收到了”

代码示例:

// Express.js 示例
app.post('/api/ai/callback/ocr', async (req, res) => {
  const body = req.body;

  // 1. 校验签名(这里省略具体实现)
  if (!verifySignature(body)) {
    return res.status(401).send('Invalid signature');
  }

  // 2. 处理结果
  const { task_id, data } = body;
  if (data.status === 'success') {
    // 把结果存到数据库
    await saveResult(task_id, data.result);
    // 通知前端(比如通过WebSocket)
    notifyClient(task_id, data.result);
  }

  // 3. 告诉平台已收到
  res.status(200).send('ok');
});
避坑指南:我曾经遇到过回调接口返回非200状态码,结果平台以为没送达,疯狂重试。一小时内重试了十几次,我的数据库被写入了十几条重复数据。所以,回调接口一定要保证幂等性——同一个回调来了多次,处理结果也要一样。

2.4 小结

这一章的内容其实不复杂,但很重要。你想想看,AI能力申请不下来,后面代码写得再漂亮也没用。Token拿不到,接口调不通。回调配不对,异步任务收不到结果。

我个人的经验是,这三步最好在项目启动第一天就搞定。别等到写代码了才发现权限没开,那节奏就全乱了。

下一章,我们就要真正动手调接口了。我会拿OCR和语音识别这两个最常用的能力,带你走一遍完整的调用流程。到时候你会发现,准备工作做扎实了,后面就是一马平川。