Telegram Bot上传贴纸到贴纸包的完整流程:从创建包到发布

本文详细讲解如何使用Telegram Bot API创建贴纸包、上传贴纸、设置封面并发布的完整流程,包含参数说明、代码示例和常见错误排查。

阅读提示建议先浏览小标题,再根据需要深入阅读具体段落。

引言:为什么用Bot管理贴纸包

Telegram贴纸包是用户表达个性的重要方式,而通过Bot API创建和上传贴纸,可以自动化整个流程,极大提升效率。无论是个人制作个性化贴纸包,还是面向社群运营批量发布主题贴纸,掌握Telegram Bot上传贴纸到贴纸包的完整流程都是开发者必备技能。本文将从零开始,详细讲解从创建贴纸包到最终发布的每一个步骤,并提供可运行的代码示例。

前置条件:准备你的机器人

开始之前,你需要满足以下条件:

  • 一个由@BotFather创建的Bot Token。
  • Bot已通过@BotFather成功关闭隐私模式,以便处理群组中的命令(如果需要在群内管理贴纸包)。
  • 用于制作贴纸的PNG或WEBP图片(静态贴纸)或TGS/LOTTIE文件(动态贴纸),尺寸和格式必须符合Telegram要求。
官方要求:静态贴纸尺寸需为512x512像素,且为PNG(带透明背景)或WEBP格式;动态贴纸需为LOTTIE格式(TGS文件),且画布尺寸同样为512x512。

第一步:创建新贴纸包(createNewStickerSet)

上传第一张贴纸之前,你需要先创建一个贴纸包。调用createNewStickerSet方法,请求参数如下:

  • user_id:贴纸包所有者的Telegram用户ID(整数)。
  • name:贴纸包名称,必须是英文、数字和下划线,以_by_<bot_username>结尾。
  • title:贴纸包标题,将显示在贴纸面板中,长度1-64字符。
  • sticker:包含首张贴纸的JSON对象,字段包括sticker(文件)、emoji_list(关联表情)、format(格式:static/ video/ animated)等。

以下为Python(使用requests库)示例,上传一张PNG格式的静态贴纸:

import requests

BOT_TOKEN = 'YOUR_BOT_TOKEN'
API_URL = f'https://api.telegram.org/bot/'

# 准备贴纸(multipart/form-data 上传)
files = {
    'sticker': ('sticker.png', open('sticker.png', 'rb'), 'image/png')
}
data = {
    'user_id': 123456789,  # 替换为目标用户ID
    'name': 'my_stickers_by_MyBot',
    'title': 'My Stickers',
    'sticker': json.dumps({
        'emoji_list': ['😀'],
        'format': 'static'
    }),
    'sticker_format': 'static',
    'sticker_type': 'regular',
    'needs_repainting': True
}
response = requests.post(API_URL + 'createNewStickerSet', data=data, files=files)
print(response.json())
注意:user_id必须是Bot可以发消息的用户。通常你可以先让用户发送任意消息给Bot,再通过getUpdates获取其ID。

第二步:上传后续贴纸(addStickerToSet)

如果贴纸包中包含多张贴纸,通过addStickerToSet方法逐张添加。参数包括:user_id(必须与创建者一致)、name(贴纸包名称)、sticker(新贴纸的JSON对象)。示例:

import requests, json, glob

# 假设目录下有多张PNG图片
for file_path in glob.glob('stickers/*.png'):
    files = {'sticker': (file_path.split('/')[-1], open(file_path, 'rb'), 'image/png')}
    data = {
        'user_id': 123456789,
        'name': 'my_stickers_by_MyBot',
        'sticker': json.dumps({'emoji_list': ['🎉'], 'format': 'static'})
    }
    r = requests.post(API_URL + 'addStickerToSet', data=data, files=files)
    print(file_path, r.status_code, r.json())

每成功添加一张,返回的JSON中ok字段为true。请控制请求频率,避免触发限流(429错误)。

第三步:设置贴纸包封面(可跳过)

默认封面是第一张贴纸。若要更换,调用setStickerSetThumb方法,参数为nameuser_id,以及thumb(PNG或WEBP图片,方形,建议512x512)。

files = {'thumb': ('thumb.png', open('thumb.png', 'rb'), 'image/png')}
data = {'name': 'my_stickers_by_MyBot', 'user_id': 123456789}
requests.post(API_URL + 'setStickerSetThumb', data=data, files=files)

第四步:发布与分享

创建并添加完所有贴纸后,用户可以通过以下方式访问贴纸包:

  • 在Telegram中直接点击贴纸包专属链接,格式为https://t.me/addstickers/<sticker_set_name>
  • Bot可以发送一个StickerSet链接给用户,或通过内联键盘引导用户点击。

你可以使用sendMessage发送链接,或使用sendSticker发送其中一张贴纸,用户点击后即可看到整个贴纸包。

常见错误与排查

  1. 400 Bad Request: STICKER_PNG_DIMENSIONS — 图片尺寸不是512x512,请使用图像处理工具调整。
  2. 401 Unauthorized — Token错误或已失效,重新向@BotFather获取。
  3. 403 Forbidden — Bot不能向该用户发送消息,请确保用户先主动启动Bot。
  4. 409 Conflict — 重复调用创建同名贴纸包,检查name唯一性。
  5. Sticker set name is already occupied — 换一个名称,确保以_by_<bot_username>结尾。

另外,若上传带透明通道的PNG,建议使用sticker_formatsticker_type明确指定格式,避免默认按静态处理。

完整代码整合

以下是一个简单的Python脚本,一次性创建贴纸包并添加所有贴纸:

import requests, json, os, glob

TOKEN = 'YOUR_BOT_TOKEN'
API = f'https://api.telegram.org/bot/'
USER_ID = 123456789
SET_NAME = 'cool_stickers_by_MyBot'
SET_TITLE = 'Cool Stickers'
EMOJI = '😎'  # 全部使用同一表情,也可为每张贴纸指定不同表情

# 创建贴纸包
files = {'sticker': (os.path.basename(stickers_dir_list[0]), open(stickers_dir_list[0], 'rb'), 'image/png')}
data = {
    'user_id': USER_ID,
    'name': SET_NAME,
    'title': SET_TITLE,
    'sticker': json.dumps({'emoji_list': [EMOJI]}),
    'sticker_format': 'static'
}
r = requests.post(API + 'createNewStickerSet', data=data, files=files)
if r.json().get('ok'):
    print('贴纸包创建成功')
else:
    print('创建失败:', r.json())

# 添加后续贴纸
for i, file_path in enumerate(stickers_dir_list[1:], start=2):
    with open(file_path, 'rb') as f:
        files = {'sticker': (os.path.basename(file_path), f, 'image/png')}
        data = {'user_id': USER_ID, 'name': SET_NAME,
                'sticker': json.dumps({'emoji_list': [EMOJI]})}
        r = requests.post(API + 'addStickerToSet', data=data, files=files)
        print(f'第张贴纸:', r.json()['description'] if not r.json()['ok'] else '成功')

请确保stickers_dir_list变量正确指向你的贴纸文件列表。

总结

通过createNewStickerSetaddStickerToSet方法,你可以轻松实现Telegram Bot上传贴纸到贴纸包的完整流程。关键在于理解API参数格式、遵守图片尺寸和命名规范,以及处理常见网络错误。掌握这些后,你还可以进一步开发自动贴纸制作、批量上传等高级功能,为用户提供更丰富的个性化体验。

如果你在开发中遇到其他问题,欢迎参考Telegram官方Bot API文档,或在本站开发者资源栏目中搜索更多API教程。

FAQ

多平台客户端选择

常见问题

Telegram Bot创建贴纸包时,name字段必须用什么格式?

name必须是由英文小写字母、数字和下划线组成,且必须以下划线加上Bot用户名(_by_<bot_username>)结尾,例如my_stickers_by_MyBot。

上传静态贴纸对图片有什么要求?

静态贴纸必须是PNG或WEBP格式,尺寸为512x512像素,且必须包含透明背景(PNG)或为无损WEBP。动态贴纸需使用LOTTIE TGS文件。

为什么我无法添加贴纸,返回STICKER_PNG_DIMENSIONS错误?

该错误表示您上传的图片尺寸不是512x512。请使用图片工具裁剪或缩放至512x512,并重新上传。

如何让用户通过链接访问贴纸包?

贴纸包创建成功后,会自动生成链接:https://t.me/addstickers/<sticker_set_name>,例如https://t.me/addstickers/my_stickers_by_MyBot。您可以通过Bot发送这个链接,或发送一张贴纸让用户点击进入。