Как отправить большой файл с Telegram Bot API? - PullRequest
0 голосов
/ 12 сентября 2018

Бот Telegram имеет ограничение размера файла для отправки в 50 МБ.

Мне нужно отправить большие файлы.Есть ли способ обойти это?

Я знаю об этом проекте https://github.com/pwrtelegram/pwrtelegram, но я не смог заставить его работать.

Может быть, кто-то уже решил такую ​​проблему?

Существует возможность осуществить загрузку файла через Telegram API, а затем отправить по file_id с ботом.

Я пишу бота на Java с использованием библиотеки https://github.com/rubenlagus/TelegramBots

ОБНОВЛЕНИЕ

Для решения этой проблемы я использую telegram api, который имеет ограничение в 1,5 ГБ для больших файлов.

Я предпочитаю kotlogram - идеальный lib схорошая документация https://github.com/badoualy/kotlogram

ОБНОВЛЕНИЕ 2

Пример использования этой библиотеки:

private void uploadToServer(TelegramClient telegramClient, TLInputPeerChannel tlInputPeerChannel, Path pathToFile, int partSize) {
    File file = pathToFile.toFile();
    long fileId = getRandomId();
    int totalParts = Math.toIntExact(file.length() / partSize + 1);
    int filePart = 0;
    int offset = filePart * partSize;
    try (InputStream is = new FileInputStream(file)) {

        byte[] buffer = new byte[partSize];
        int read;
        while ((read = is.read(buffer, offset, partSize)) != -1) {
            TLBytes bytes = new TLBytes(buffer, 0, read);
            TLBool tlBool = telegramClient.uploadSaveBigFilePart(fileId, filePart, totalParts, bytes);
            telegramClient.clearSentMessageList();
            filePart++;
        }
    } catch (Exception e) {
        log.error("Error uploading file to server", e);
    } finally {
        telegramClient.close();
    }
    sendToChannel(telegramClient, tlInputPeerChannel, "FILE_NAME.zip", fileId, totalParts)
}


private void sendToChannel(TelegramClient telegramClient, TLInputPeerChannel tlInputPeerChannel, String name, long fileId, int totalParts) {
    try {
        String mimeType = name.substring(name.indexOf(".") + 1);

        TLVector<TLAbsDocumentAttribute> attributes = new TLVector<>();
        attributes.add(new TLDocumentAttributeFilename(name));

        TLInputFileBig inputFileBig = new TLInputFileBig(fileId, totalParts, name);
        TLInputMediaUploadedDocument document = new TLInputMediaUploadedDocument(inputFileBig, mimeType, attributes, "", null);
        TLAbsUpdates tlAbsUpdates = telegramClient.messagesSendMedia(false, false, false,
                tlInputPeerChannel, null, document, getRandomId(), null);
    } catch (Exception e) {
        log.error("Error sending file by id into channel", e);
    } finally {
        telegramClient.close();
    }
}

где TelegramClient telegramClient и TLInputPeerChannel tlInputPeerChannel вы можете создать как написано в документации.

НЕ КОПИРОВАТЬ, переписать под ваши нужды.

1 Ответ

0 голосов
/ 13 сентября 2018

Если вы хотите отправить файл через бота Telegram, у вас есть три варианта :

  1. InputStream ( 10 МБ ограничениедля фотографий 50 МБ для других файлов)
  2. С http url (Telegram загрузит и отправит файл. 5 МБ максимальный размер дляфотографии и 20 МБ макс. для других типов контента.)
  3. Отправка кэшированных файлов по их file_id с. ( без ограничений дляфайлы, отправленные таким образом)

Итак, я рекомендую заранее сохранять file_ids и отправлять файлы по этим идентификаторам (рекомендуется также api docs ).

...