AI 表情包生成接口技术解析:异步工作流、轮询查询与多宫格分割实践
一、技术简介
AI 表情包生成接口面向「由单张底图批量产出成套表情」的内容生产场景。调用方提交一张基底素材图(人像照片、卡通立绘或 IP 形象均可),并以文字描述风格、情绪、配色、线条质感与使用场景,服务端在工作流内依次完成底图视觉特征解析、提示词融合、多宫格组合大图生成、内容安全审核与按比例切分,最终返回一张组合大图与一组独立的表情包子图地址。
该接口采用异步工作流模式:提交任务后立即返回任务标识,调用方按间隔轮询任务状态,待状态为成功后读取生成结果。整体以 HTTP POST + JSON 的方式提供,适用于服务端到服务端调用,不依赖专属客户端 SDK,具备跨语言、跨平台接入能力。

二、能力概览
接口的处理链路可以拆为六个可观察的环节:
- 底图视觉解析:对提交的基底素材图做主体识别与视觉特征提取,归纳主体类型、画风倾向与视觉关键词,作为后续生成的参考依据。
- 提示词融合:将调用方输入的设计需求与解析得到的底图特征、构图模板融合,形成用于生图的完整描述。
- 多宫格排版:支持 9 宫格、16 宫格、24 宫格三种排版方案,在一张组合大图内排布多个表情动作。
- 按比例分割:组合大图生成后,按宫格比例切分为独立子图,每个子图对应一个表情。
- 画幅可选:组合大图支持 1:1、3:4、4:3、16:9、9:16 五种宽高比,适配不同展示载体。
- 异步执行与轮询:提交与查询分离,长任务通过任务标识轮询获取进度与结果,链路中内置内容合规校验节点。
返回为统一 JSON 结构,业务数据封装在固定对象中,便于调用方解析、落库与二次处理。

三、适用场景
表情包生成接口适用于需要批量产出成套表情素材的内容生产与运营场景,典型场景包括:
| 场景 | 业务诉求 | 使用方式 |
|---|---|---|
| 个人社交聊天 | 制作带有个人形象的成套表情 | 上传本人照片,描述风格与情绪,生成 9/16 个表情 |
| 社群运营 | 为社群成员提供统一风格的互动素材 | 按品牌色调描述提示词,生成组合大图与子图 |
| IP 形象周边 | 把已有卡通立绘延展为表情系列 | 上传立绘作为底图,保持形象一致性 |
| 品牌活动物料 | 活动期间的图文互动素材补充 | 指定画幅与使用场景,配合活动节奏分批生成 |
| 内容创作者 | 为频道或账号建立表情素材库 | 按情绪维度分批提交,沉淀可复用素材 |
在上述场景中,接口主要承担「把单张底图扩展为成套素材」的角色。实际落地时,建议将生成结果作为素材初稿,经人工挑选与微调后再对外分发。
四、接入流程
接入整体分为六个步骤:
- 获取访问凭证:订购该商品后,在控制台获取 APPCODE 形式的访问凭证(AppCode),用于接口鉴权。凭证属于敏感信息,应存放于服务端环境变量或配置中心,不要写入前端代码、日志或版本库。
- 准备底图:将基底素材图以可访问的 URL 提交,或编码为标准 Base64 字符串。底图主体完整清晰、无大面积遮挡,解析效果更稳定。
- 提交任务:按接口规范组装请求体(宫格数量、设计提示词、底图、画幅),携带鉴权头
Authorization: APPCODE <appcode>,以 POST 方式调用创建任务接口。 - 获取任务标识:提交成功后从返回体业务对象中读取
task_id,该标识用于后续查询。 - 轮询状态:携带
task_id调用查询接口,建议每 1~2 秒查询一次,直到任务状态为成功或失败。 - 读取结果:状态成功后,从返回的输出对象中读取组合大图地址与独立子图地址,按需下载、归档或直接分发。

异步链路的时序为:提交(立即返回 task_id)→ 间隔轮询(progress 递增)→ 状态成功 → 读取 original_image 与 emoji_list。调用方无需维护长连接,但需要自行实现轮询循环与终止条件。
五、调用示例与返回结构
5.1 创建任务请求规范
| 项 | 说明 |
|---|---|
| 请求地址 | https://emojides.market.alicloudapi.com/skills_emojiWorks/create |
| 请求方式 | POST |
| 内容类型 | application/json |
| 返回类型 | JSON |
| 鉴权方式 | Header 携带 Authorization: APPCODE <appcode> |
5.2 创建任务请求参数
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
grid_num |
string | 是 | 排版方案,枚举值:9、16、24 |
prompt |
string | 是 | 风格、情绪、配色、线条质感、使用场景、画风等全部设计需求描述 |
reference_image |
string | 是 | 基底素材图,传入可访问 URL 或标准 Base64 编码字符串 |
aspect_ratio |
string | 否 | 画幅宽高比,可选值:1:1、3:4、4:3、16:9、9:16 |
5.3 cURL 示例(创建任务)
curl -X POST "https://emojides.market.alicloudapi.com/skills_emojiWorks/create" \
-H "Authorization: APPCODE your_appcode" \
-H "Content-Type: application/json" \
-d '{
"grid_num": "9",
"prompt": "Q版可爱表情包,软萌手绘风,马卡龙浅色系,圆润线条,聊天使用,配有简短文字",
"reference_image": "https://example.com/base-image.jpg",
"aspect_ratio": "1:1"
}'
5.4 Python 示例(提交 + 轮询)
import time
import requests
BASE = "https://emojides.market.alicloudapi.com"
HEADERS = {
"Authorization": "APPCODE your_appcode",
"Content-Type": "application/json",
}
def create_task(payload: dict) -> str:
resp = requests.post(
f"{BASE}/skills_emojiWorks/create",
headers=HEADERS, json=payload, timeout=15,
)
body = resp.json().get("showapi_res_body", {
})
return body.get("task_id")
def query_task(task_id: str) -> dict:
resp = requests.post(
f"{BASE}/skills_emojiWorks/query",
headers=HEADERS, json={
"task_id": task_id}, timeout=15,
)
return resp.json().get("showapi_res_body", {
})
def wait_result(task_id: str, interval: int = 2, max_attempts: int = 60) -> dict:
for _ in range(max_attempts):
data = query_task(task_id)
if data.get("status") == "SUCCESS":
return data
if data.get("status") == "FAILED":
raise RuntimeError(data.get("remark", "task failed"))
time.sleep(interval)
raise TimeoutError("polling timeout")
payload = {
"grid_num": "9",
"prompt": "Q版可爱表情包,软萌手绘风,马卡龙浅色系,圆润线条,聊天使用,配有简短文字",
"reference_image": "https://example.com/base-image.jpg",
"aspect_ratio": "1:1",
}
task_id = create_task(payload)
result = wait_result(task_id)
output = result.get("flow_result", {
}).get("output", {
})
print(output.get("original_image"))
print(output.get("emoji_list"))
5.5 Java 示例(创建任务片段)
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://emojides.market.alicloudapi.com/skills_emojiWorks/create"))
.header("Authorization", "APPCODE your_appcode")
.header("Content-Type", "application/json")
.POST(HttpRequest.BodyPublishers.ofString("""
{
"grid_num": "9",
"prompt": "Q版可爱表情包,软萌手绘风,马卡龙浅色系",
"reference_image": "https://example.com/base-image.jpg",
"aspect_ratio": "1:1"
}
"""))
.build();
HttpResponse<String> response = HttpClient.newHttpClient()
.send(request, HttpResponse.BodyHandlers.ofString());
5.6 Node.js 示例(创建任务片段)
const axios = require("axios");
async function createTask(payload, appcode) {
const {
data } = await axios.post(
"https://emojides.market.alicloudapi.com/skills_emojiWorks/create",
payload,
{
headers: {
Authorization: `APPCODE ${
appcode}`,
"Content-Type": "application/json",
},
timeout: 15000,
}
);
return data.showapi_res_body.task_id;
}
5.7 查询任务请求规范
| 项 | 说明 |
|---|---|
| 请求地址 | https://emojides.market.alicloudapi.com/skills_emojiWorks/query |
| 请求方式 | POST |
| 内容类型 | application/json |
| 鉴权方式 | Header 携带 Authorization: APPCODE <appcode> |
查询请求参数:
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
task_id |
string | 是 | 创建任务时返回的任务标识 |
5.8 返回结构
所有响应使用统一封装,业务数据嵌套在 showapi_res_body 中:
| 字段 | 类型 | 说明 |
|---|---|---|
showapi_res_code |
int | 系统状态码,0 表示成功 |
showapi_res_error |
string | 错误描述,成功时为空字符串 |
showapi_res_id |
string | 本次请求唯一标识,可用于日志关联 |
showapi_res_body |
object | 业务数据对象 |
创建任务成功时,showapi_res_body 内主要字段:
| 字段 | 类型 | 说明 |
|---|---|---|
task_id |
string | 任务唯一标识,用于轮询查询 |
查询任务成功时,showapi_res_body 内主要字段:
| 字段 | 类型 | 说明 |
|---|---|---|
status |
string | 任务整体状态:SUCCESS、FAILED,执行中为中间态 |
progress |
int | 执行进度百分比 |
used_time |
int | 已耗时(毫秒) |
remark |
string | 备注信息;任务失败时给出错误说明 |
flow_result |
object | 工作流结果对象 |
flow_result.output.original_image |
string | 生成的多宫格组合大图访问地址 |
flow_result.output.emoji_list |
array | 分割后的独立表情包子图地址数组 |
step_status_list |
array | 各步骤状态列表,含 step_name、status、order,可用于展示进度 |
查询返回示例(成功态):
{
"showapi_res_code": 0,
"showapi_res_error": "",
"showapi_res_id": "b21f9c3a7e4d4f0a9c2d1e6b8a0f3c57",
"showapi_res_body": {
"status": "SUCCESS",
"progress": 100,
"used_time": 28600,
"remark": "",
"flow_result": {
"output": {
"original_image": "https://example.com/output/combo-grid.png",
"emoji_list": [
"https://example.com/output/emoji-01.png",
"https://example.com/output/emoji-02.png"
]
}
},
"step_status_list": [
{
"step_name": "合规校验优化", "status": "SUCCESS", "order": 1 },
{
"step_name": "底图视觉解析", "status": "SUCCESS", "order": 2 }
]
}
}
说明:示例中的图片地址为脱敏占位形式。实际返回字段数量与取值以线上接口为准,调用方应依据字段是否存在做兼容处理。

六、在线调试实录
以下记录一次完整的异步调用链路,用于说明从提交到取结果的过程。
准备:选取一张主体完整清晰的素材图,整理一段覆盖风格、情绪与配色的提示词,选择 9 宫格与 1:1 画幅。
第一步,提交任务:
curl -X POST "https://emojides.market.alicloudapi.com/skills_emojiWorks/create" \
-H "Authorization: APPCODE your_appcode" \
-H "Content-Type: application/json" \
-d '{
"grid_num": "9",
"prompt": "Q版可爱表情包,软萌手绘风,马卡龙浅色系,圆润线条,聊天使用,配有简短文字",
"reference_image": "https://example.com/base-image.jpg",
"aspect_ratio": "1:1"
}'
提交成功返回:
{
"showapi_res_code": 0,
"showapi_res_body": {
"task_id": "69ddd187e13823d1d500015b" }
}
第二步,轮询查询:携带 task_id 每 2 秒调用一次查询接口,先看到 status 为执行中、progress 逐步递增,step_status_list 中已完成的步骤标记为成功。
第三步,读取结果:当 status 变为 SUCCESS 时,读取 flow_result.output.original_image(组合大图)与 flow_result.output.emoji_list(独立子图数组),将图片下载到自有对象存储后再分发,避免直接引用临时地址。
结果分析:先判断 showapi_res_code 是否为 0(系统调用成功),再判断 status 是否为 SUCCESS;FAILED 时读取 remark 定位失败原因(如底图无法识别、提示词触发合规校验等),修正输入后重新提交。

七、调用限制与规范
为保证调用质量与链路可维护性,建议遵守以下规范:
- 底图要求:优先提交主体完整、清晰、无大面积遮挡的素材图;模糊、过曝、强滤镜或主体过小的图片会降低视觉解析的可用性。
- 输入方式:
reference_image可传可访问 URL,也可传标准 Base64 字符串;Base64 体积较大时建议先压缩图片再编码,并注意编码完整性、避免截断。 - 轮询节奏:建议间隔 1~2 秒查询一次,并设置最大轮询次数与总时长上限,避免无限循环;拿到成功或失败状态后立即停止轮询。
- 结果落库:返回的图片地址可能为临时地址,正式使用前应下载并转存到自有存储,记录原始
task_id与结果地址便于回溯。 - 超时与重试:客户端为创建与查询分别设置合理超时;网络异常时采用有限次指数退避重试,避免对同一任务并发重复提交。
- 凭证管理:APPCODE 仅在服务端使用,禁止在前端页面、小程序客户端或公开仓库中暴露。
- 频率控制:业务侧应对提交节奏做本地限流与排队,避免突发集中调用。
八、能力边界与免责
- 生成结果的不确定性:表情成图受底图质量、提示词写法与模型采样影响,同一输入多次提交可能得到不同构图,不能要求与底图在每个细节上完全一致;成图应作为素材初稿,经人工挑选、微调后使用。
- 不替代美术校对:接口输出是辅助生产素材,文字错字、表情动作偏差等问题需要人工复核后再对外分发。
- 肖像与版权:底图涉及他人肖像或第三方 IP 形象时,调用方应自行确认已取得相应授权,不得使用侵权素材提交;服务端的合规校验节点用于拦截违规内容,不免除调用方的素材合规责任。
- 内容合规:提示词与底图不得包含违法违规、低俗或侵犯他人权益的内容;命中合规校验的任务会标记为失败并在
remark中说明。 - 网络与服务异常:网络波动、上游繁忙可能导致超时或失败,调用方应具备异常处理与降级方案,不应将单次调用结果作为唯一决策依据。
九、错误码排查
调用失败时,先看 HTTP 状态码,再看返回体中的 showapi_res_code 与 status,按层级定位。
9.1 网关常见状态码
| 状态码 | 含义 | 排查建议 |
|---|---|---|
| 400 | 请求参数错误 | 检查 JSON 体是否完整、字段名与枚举值是否正确 |
| 401 | 鉴权失败 | 检查 Authorization 头格式是否为 APPCODE <appcode>,凭证是否有效 |
| 403 | 无访问权限 | 确认凭证对应的商品订购状态与权限范围 |
| 404 | 接口路径不存在 | 核对请求地址与路径拼写 |
| 429 | 请求过于频繁 | 降低提交频率,增加间隔或本地排队 |
| 500 | 服务内部错误 | 稍后按退避策略重试,并保留 showapi_res_id 便于追溯 |
| 503 | 服务暂不可用 | 短暂退避后重试,必要时切换备用生产方案 |
9.2 业务状态排查
showapi_res_code非 0:系统级异常,结合showapi_res_error描述定位,并保留showapi_res_id。showapi_res_code=0但status=FAILED:工作流执行失败,读取remark与step_status_list定位失败步骤(如底图解析失败、合规校验未通过、生图环节异常),修正输入后重新提交。- 轮询超时未达终态:检查轮询间隔与最大次数设置,确认
task_id未被截断;必要时用同一task_id继续查询。
9.3 常见故障速查
| 现象 | 可能原因 | 处理方式 |
|---|---|---|
| 报 401 | APPCODE 错误或未携带 | 重新核对凭证与 Header 拼写 |
| 报 400 | JSON 体缺失字段或枚举错误 | 校验 grid_num、prompt、reference_image 是否齐全 |
| 任务一直执行中 | 轮询提前终止或任务排队 | 延长最大轮询次数,按 task_id 继续查询 |
status=FAILED |
底图无法识别或触发合规校验 | 更换清晰底图,调整提示词后重新提交 |
| 图片地址打不开 | 临时地址过期 | 成功后立即下载并转存自有存储 |
十、技术 FAQ
Q1:这个接口是同步返回结果吗?
不是。创建任务后立即返回 task_id,需要携带 task_id 轮询查询接口,直到 status 为 SUCCESS 或 FAILED。
Q2:轮询间隔设多少合适?
建议 1~2 秒一次,同时设置最大轮询次数与总时长上限,达到上限仍未到终态时按超时处理,避免无限等待。
Q3:reference_image 传 URL 还是 Base64?
两种都支持。线上可访问的 URL 更省传输体积;需要离线素材或 URL 不可用时改用标准 Base64 编码字符串。
Q4:grid_num 的 9、16、24 怎么选?
按素材用途选择:快速出一组常用表情选 9 宫格;需要更丰富的动作覆盖选 16 或 24 宫格。宫格越多,单图承载的表情数量越多,生成耗时也相应增加。
Q5:emoji_list 里的图片地址可以长期引用吗?
不建议长期直接引用。返回地址可能为临时地址,正式使用前应下载并转存到自有对象存储。
Q6:如何判断任务成功?
先看 showapi_res_code=0,再看 status=SUCCESS,然后读取 flow_result.output 中的组合大图与 emoji_list,两层条件缺一不可。
Q7:提示词里写的文字会直接出现在表情上吗?
提示词用于描述风格与需求,部分排版会附带简短文字;成图中的具体文字以实际返回为准,正式使用前需人工核对文字内容。
十一、内容小结
本文围绕 AI 表情包生成接口,介绍了其能力范围、适用场景、异步接入流程、调用示例、返回结构、调用规范与错误排查方法:
- 接口以 POST + JSON 提供,通过
Authorization: APPCODE鉴权,采用「创建任务 + 轮询查询」的异步模式; - 核心输入为宫格数量、设计提示词、基底素材图与画幅,成功后返回组合大图与独立子图数组;
- 接入重点在于轮询循环设计、结果及时转存、超时重试与凭证安全管理;
- 生成结果作为素材初稿使用,调用方需承担肖像、版权与内容合规责任。
实际业务落地时,建议将接口接入自有素材生产流水线,配合人工挑选与微调形成完整的表情素材产出链路。接入前以线上接口文档为准,做好参数与返回结构的兼容处理。
