web-dev-qa-db-fra.com

Comment envoyer un gros fichier avec l'API Telegram Bot?

Le bot télégramme a une taille limite de fichier pour l'envoi de 50 Mo.

J'ai besoin d'envoyer de gros fichiers. Y a-t-il un moyen de contourner cela?

Je connais ce projet https://github.com/pwrtelegram/pwrtelegram mais je n'ai pas pu le faire fonctionner.

Peut-être que quelqu'un a déjà résolu un tel problème?

Il existe une option pour implémenter le téléchargement de fichiers via l'API Telegram, puis envoyer par file_id avec bot.

J'écris un bot en Java en utilisant la bibliothèque https://github.com/rubenlagus/TelegramBots

[~ # ~] mise à jour [~ # ~]

Pour résoudre ce problème, j'utilise une API de télégramme, qui a une limite de 1,5 Go pour les gros fichiers.

Je préfère kotlogram - la bibliothèque parfaite avec une bonne documentation https://github.com/badoualy/kotlogram

MISE À JOUR 2

Exemple d'utilisation de cette bibliothèque:

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 et TLInputPeerChannel tlInputPeerChannel vous pouvez créer en écriture dans la documentation.

NE PAS COPIER-COLLER, réécrire selon vos besoins.

6
bigspawn

SI vous voulez envoyer un fichier via un télégramme, vous avez trois options :

  1. InputStream ( 10 Mo limite pour les photos, 50 Mo pour les autres fichiers)
  2. De URL http (Telegram téléchargera et enverra le fichier. 5 Mo taille maximale pour les photos et 20 Mo max pour les autres types de contenu.)
  3. Envoyer des fichiers en cache par leur file_id s. (Il n'y a aucune limite pour fichiers envoyés de cette façon)

Donc, je vous recommande de stocker file_ids au préalable et d'envoyer des fichiers par ces identifiants (cela est également recommandé par api docs ).

2
valijon