Обзор
@gramio/files
- это встроенный пакет GramIO. Вы также можете использовать его вне этого фреймворка, так как он не зависит от него.
Использование
ts
import { Bot, MediaInput, MediaUpload, InlineKeyboard } from "gramio";
const bot = new Bot(process.env.BOT_BOT_TOKEN as string)
.on("message", async (ctx) => {
ctx.sendMediaGroup([
MediaInput.document(
await MediaUpload.url(
"https://raw.githubusercontent.com/gramiojs/types/main/README.md"
)
),
MediaInput.document(await MediaUpload.path("./package.json")),
]);
})
.onStart(console.log);
bot.start();
Отправка файлов
Существует три способа отправки файлов (фотографий, стикеров, аудио, медиа и т.д.):
- Если файл уже хранится на серверах Telegram, вам не нужно загружать его повторно: каждый файловый объект имеет поле file_id, просто передайте этот file_id в качестве параметра вместо загрузки. Для файлов, отправляемых таким способом, ограничений нет.
TIP
Вам может быть полезно использовать media-cache плагин для кэширования file_id со стороны фреймворка.
- Предоставьте Telegram HTTP URL для отправляемого файла. Telegram загрузит и отправит файл. Максимальный размер 5 МБ для фотографий и 20 МБ для других типов контента.
- Отправьте файл, используя multipart/form-data обычным способом, которым файлы загружаются через браузер. Максимальный размер 10 МБ для фотографий, 50 МБ для других файлов (если TelegramBotAPI =
api.telegram.org
).
Отправка по file_id
- Невозможно изменить тип файла при повторной отправке по file_id. То есть видео нельзя отправить как фото, фото нельзя отправить как документ и т.д.
- Невозможно повторно отправить миниатюры.
- Повторная отправка фотографии по file_id отправит все ее размеры.
- file_id уникален для каждого отдельного бота и не может быть передан от одного бота другому.
- file_id однозначно идентифицирует файл, но файл может иметь разные действительные file_id даже для одного и того же бота.
Чтобы отправить файл по file_id
с помощью GramIO, вы можете указать его как есть
.
ts
ctx.sendPhoto(fileId);
Отправка по URL
- При отправке по URL целевой файл должен иметь правильный MIME-тип (например, audio/mpeg для sendAudio и т.д.).
- В sendDocument отправка по URL в настоящее время работает только для файлов GIF, PDF и ZIP.
- Чтобы использовать sendVoice, файл должен иметь тип audio/ogg и размер не более 1 МБ. Голосовые заметки размером 1-20 МБ будут отправлены как файлы.
Чтобы отправить файл по URL
с помощью GramIO, вы можете указать его как есть
.
ts
ctx.sendPhoto("https://.../cute-cat.png");
Загрузка файлов
Для загрузки и отправки файла вы можете использовать вспомогательный класс Media Upload
, и GramIO сделает всю работу за вас.
ts
ctx.sendPhoto(await MediaUpload.path("../cute-cat.png"));
Использование File
На самом деле, GramIO может принимать Web API File
и Blob
.
Так что вы можете загружать файлы даже так:
ts
import { Elysia } from "elysia";
import { bot } from "./bot";
new Elysia().post(
"/",
({ body: { file } }) => {
bot.api.sendPhoto({
chat_id: 1,
photo: file,
});
},
{
body: t.Object({
file: t.File({
type: "image",
maxSize: "2m",
}), // Elysia проверяет и принимает только тип File
}),
}
);
Или, например, с нативным чтением файлов Bun
ts
bot.api.sendDocument({
chat_id: 1,
document: Bun.file("README.md"),
});