Telegram机器人通过API创建贴纸包的完整步骤:从零到发布

本文详细介绍如何通过Telegram Bot API创建自己的贴纸包,涵盖准备工作、核心接口调用、上传静态/动画/视频贴纸、代码示例以及常见错误处理,帮助你快速掌握自动化创建贴纸包的技巧。

阅读提示涉及账号和安全设置时,请边阅读边核对当前设备界面。

贴纸是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:可选,默认为普通贴纸,可指定为defaultmaskcustom_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机器人管理。作为开发者,你还可以:

  • 使用addStickerToSetdeleteStickerFromSet动态增删贴纸。
  • 使用setStickerPositionInSet调整贴纸顺序。
  • 通过getStickerSet读取贴纸包信息。
  • 发布时,建议附上一个使用说明,让用户知道如何将贴纸包添加到Telegram。

发布后,你可以通过Telegram内置的贴纸面板查看效果,或分享贴纸包短链接(如 https://t.me/addstickers/包名)。

总结

通过Telegram Bot API创建贴纸包并不复杂,关键掌握createNewStickerSetuploadStickerFile的用法,以及贴纸格式规范。本文提供了Python和Node.js两种实现方式,并列举了常见错误。现在你可以利用机器人自动化创建属于自己和社群的专属贴纸包了。

FAQ

下载与安装

常见问题

创建贴纸包时贴纸图片有哪些格式和尺寸要求?

静态贴纸必须是PNG或WEBP格式,建议边长512x512像素,且需透明背景;动画贴纸为TGS格式;视频贴纸为WEBM格式。所有贴纸文件大小不能超过512KB(静态)/ 256KB(动画)。

贴纸包名称有什么限制?

贴纸包的name属性必须以机器人用户名结尾,格式为`your_pack_name_by_YourBot`,只能包含拉丁字母、数字和下划线,且整个名称长度不超过64个字符。

创建贴纸包需要机器人是群组管理员吗?

不需要。创建贴纸包只要拥有机器人Token即可,与群组管理权限无关。但用户必须通过机器人发送过消息或通过验证(实际上不需要,只要user_id有效即可)。

如何将贴纸包发布给用户使用?

贴纸包创建后会自动出现在用户的贴纸列表中(如果用户ID是所有者)。你也可以直接分享链接`https://t.me/addstickers/包名`,用户点击即可添加。

常见错误`STICKERSET_INVALID`如何解决?

该错误通常表示贴纸包名称不符合规则,或已被占用。请检查name是否以`_by_`加机器人用户名结尾,并确保没有重复。你可以在Telegram中搜索贴纸包名来确认是否已存在。