贴纸是Telegram聊天中极具个性化的表达方式,而通过机器人API自动创建贴纸包,则能让开发者或普通用户批量生成、管理自己的贴纸集合。本文将详细讲解Telegram机器人通过API创建贴纸包的每个步骤,从前期准备到最终发布,并附上实用的代码示例与排错技巧。
一、创建贴纸包前的准备工作
在调用API之前,你需要完成以下几项准备:
- 获取Bot Token:通过 @BotFather 创建机器人并获取API Token,这是所有调用的凭证。
- 了解贴纸包命名规则:贴纸包的
name必须以机器人的用户名结尾,例如my_stickers_by_MyBot,并且只能包含拉丁字母、数字和下划线。 - 准备贴纸素材:静态贴纸必须是PNG或WEBP格式,且尺寸不超过512x512像素(推荐512边长);动画贴纸为TGS格式;视频贴纸为WEBM格式。所有贴纸必须带有透明背景(静态)或符合Telegram规范。
- 确认Bot权限:创建贴纸包不需要特殊权限,但机器人必须能够发送贴纸(通常不需要额外开启,但建议在BotFather中确保未禁用相关功能)。
二、创建贴纸包的核心接口:createNewStickerSet
创建贴纸包的主要API方法是 createNewStickerSet,它一次只能创建一个包含多个贴纸的贴纸集。以下是关键参数:
user_id:贴纸包所有者的用户ID(通常是发起创建命令的用户,也可以是机器人自己,但建议使用用户ID以方便后续管理)。name:贴纸包的唯一名称,必须符合上述规则。title:贴纸包的显示标题,长度为1-64个字符,可包含表情。stickers:一个JSON数组,每个元素代表一个贴纸,包含sticker(文件或文件ID)、emoji_list(关联的表情符号)、mask_position(可选)等字段。sticker_type:可选,默认为普通贴纸,可指定为default、mask或custom_emoji。
注意:Telegram Bot API从2022年起支持在stickers数组中直接上传多个贴纸,而无需逐个添加。但老版本API也常用addStickerToSet单独添加。
三、上传贴纸的两种方式:文件上传与文件ID
创建贴纸包时,每个贴纸的sticker字段可以是以下两种形式之一:
- 文件上传:使用
multipart/form-data上传图片文件,例如PNG或WEBM。适合首次创建。 - 文件ID:使用已上传到Telegram服务器的文件ID(通过
getFile或其他方式获得)。适合重复使用或之后添加。
对于静态贴纸,使用png_sticker参数(在新版API中已合并到stickers数组);动画贴纸使用tgs_sticker;视频贴纸使用webm_sticker。不过在实际调用中,只需要在数组元素中指定对应字段即可。
四、完整代码示例:Python实现创建贴纸包
以下使用requests库直接调用API,先上传贴纸图片,再创建贴纸包。若要上传多个贴纸,可以循环上传获取file_id,最后统一创建。
import requests
# 配置
BOT_TOKEN = "123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11"
OWNER_ID = 123456789
PACK_NAME = "my_cool_stickers_by_MyBot"
PACK_TITLE = "My Cool Stickers"
# 上传贴纸函数
def upload_sticker(image_path):
url = f"https://api.telegram.org/bot/uploadStickerFile"
files = {"png_sticker": open(image_path, "rb")}
data = {"user_id": OWNER_ID, "png_sticker": image_path} # 这里实际不生效,仅示例
# 注意:uploadStickerFile只接收文件,不需要额外参数
resp = requests.post(url, files=files)
return resp.json()["result"]["file_id"]
# 准备贴纸列表
sticker_list = [
{"sticker": upload_sticker("sticker1.png"), "emoji_list": ["😀"]},
{"sticker": upload_sticker("sticker2.png"), "emoji_list": ["😂"]}
]
# 创建贴纸包
url = f"https://api.telegram.org/bot/createNewStickerSet"
payload = {
"user_id": OWNER_ID,
"name": PACK_NAME,
"title": PACK_TITLE,
"stickers": sticker_list,
"sticker_type": "default"
}
resp = requests.post(url, json=payload)
print(resp.json())注意:上述代码中uploadStickerFile的调用方式需遵循官方最新API,实际应直接上传文件而不带其他参数。更推荐使用python-telegram-bot库,封装了这些细节。
使用python-telegram-bot库更简洁:
from telegram import Bot, InputSticker
from telegram.error import TelegramError
bot = Bot(token="123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11")
def create_pack():
# 打开图片文件
with open("sticker1.png", "rb") as f1, open("sticker2.png", "rb") as f2:
stickers = [
InputSticker(f1.read(), emoji_list=["😀"]),
InputSticker(f2.read(), emoji_list=["😂"])
]
try:
result = bot.create_new_sticker_set(
user_id=123456789,
name="my_cool_stickers_by_MyBot",
title="My Cool Stickers",
stickers=stickers
)
print("贴纸包创建成功:", result)
except TelegramError as e:
print("错误:", e.message)
create_pack()五、Node.js实现创建贴纸包
在Node.js中,可以使用node-telegram-bot-api或直接暴露的HTTP接口。以下是使用node-fetch实现文件上传的示例:
const fetch = require('node-fetch');
const FormData = require('form-data');
const fs = require('fs');
const BOT_TOKEN = '123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11';
const OWNER_ID = 123456789;
const PACK_NAME = 'my_cool_stickers_by_MyBot';
const PACK_TITLE = 'My Cool Stickers';
async function createStickerPack() {
let stickers = [];
// 上传第一个贴纸
const form1 = new FormData();
form1.append('user_id', OWNER_ID);
form1.append('png_sticker', fs.createReadStream('sticker1.png'));
const up1 = await fetch(`https://api.telegram.org/bot$/uploadStickerFile`, { method: 'POST', body: form1 });
const json1 = await up1.json();
stickers.push({ sticker: json1.result.file_id, emoji_list: ['😀'] });
// 上传第二个贴纸
const form2 = new FormData();
form2.append('user_id', OWNER_ID);
form2.append('png_sticker', fs.createReadStream('sticker2.png'));
const up2 = await fetch(`https://api.telegram.org/bot$/uploadStickerFile`, { method: 'POST', body: form2 });
const json2 = await up2.json();
stickers.push({ sticker: json2.result.file_id, emoji_list: ['😂'] });
// 创建贴纸包
const payload = {
user_id: OWNER_ID,
name: PACK_NAME,
title: PACK_TITLE,
stickers: stickers,
sticker_type: 'default'
};
const resp = await fetch(`https://api.telegram.org/bot$/createNewStickerSet`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(payload)
});
const result = await resp.json();
console.log(result);
}
createStickerPack();六、处理常见错误与调试技巧
创建贴纸包过程中常遇到以下错误,这里给出解决方案:
- 400 Bad Request: STICKERSET_INVALID:贴纸包名称不符合规则,或已被占用。确认以
_by_结尾(必须包含机器人用户名),并检查是否与已有包重名。 - 400 Bad Request: STICKER_PNG_NODIMENSIONS:上传的静态贴纸不是PNG格式或尺寸不对。请使用适配的PNG/WEBP,且边长不超过512。
- 400 Bad Request: STICKER_TGS_NOT_VALID:动画贴纸TGS文件损坏或不符合规范,重新用官方工具生成。
- 403 Forbidden:机器人没有权限,确认
user_id是真实用户且机器人未被禁止。 - 429 Too Many Requests:请求过于频繁,需等待后重试,可参考
retry_after字段。
调试时,建议先使用getStickerSet检查现有贴纸包,或创建测试用的小型贴纸包(1-2个贴纸)验证流程。
七、发布与管理你的贴纸包
创建成功后,用户可以直接通过链接访问贴纸包,也可以通过@Stickers机器人管理。作为开发者,你还可以:
- 使用
addStickerToSet和deleteStickerFromSet动态增删贴纸。 - 使用
setStickerPositionInSet调整贴纸顺序。 - 通过
getStickerSet读取贴纸包信息。 - 发布时,建议附上一个使用说明,让用户知道如何将贴纸包添加到Telegram。
发布后,你可以通过Telegram内置的贴纸面板查看效果,或分享贴纸包短链接(如 https://t.me/addstickers/包名)。
总结
通过Telegram Bot API创建贴纸包并不复杂,关键掌握createNewStickerSet和uploadStickerFile的用法,以及贴纸格式规范。本文提供了Python和Node.js两种实现方式,并列举了常见错误。现在你可以利用机器人自动化创建属于自己和社群的专属贴纸包了。