java 如何使用Telegram Bot API发送大文件?

hfsqlsce  于 2023-01-07  发布在  Java
关注(0)|答案(3)|浏览(234)

电报机器人有一个文件大小限制发送在50MB。
我需要发送大文件。有什么办法吗?
我知道这个项目https://github.com/pwrtelegram/pwrtelegram,但我不能让它工作。
也许有人已经解决了这样的问题?
有一个选项可以通过Telegram API实现文件上传,然后使用bot通过file_id发送。
我使用https://github.com/rubenlagus/TelegramBots库用Java编写了一个bot

    • 更新**

为了解决这个问题,我使用电报API,它对大文件有1.5 GB的限制。
我更喜欢kotlogram-具有良好文档的完美库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 telegramClientTLInputPeerChannel tlInputPeerChannel可以按照文档中的说明创建。
不要复制粘贴,根据你的需要重写。

vxf3dgd4

vxf3dgd41#

使用本地Telegram Bot API服务器,您可以发送InputStream,文件大小限制为2000Mb,高于默认值50Mb。

wz3gfoph

wz3gfoph2#

如果你想通过电报机器人发送文件,你有三个选择:
1.输入流10 MB限制用于照片,50 MB限制用于其他文件)
1.来自http url(Telegram将下载并发送文件。照片最大大小为5 MB,其他类型的内容最大大小为20 MB。)
1.按缓存文件的file_id发送缓存文件。(对于以这种方式发送的文件,没有限制
所以,我建议你事先存储file_id,然后用这些id发送文件(API docs也推荐这样做)。

zsohkypk

zsohkypk3#

    • 使用本地Bot API服务器,您可以发送高达2GB的大文件。**

源代码:
https://github.com/tdlib/telegram-bot-api
正式文件
https://core.telegram.org/bots/api#using-a-local-bot-api-server
您可以按照此链接https://tdlib.github.io/telegram-bot-api/build.html上的说明将其build and install到您的服务器
基本设置:
1.从https://my.telegram.org/apps生成电报应用程序ID
1.启动服务器./telegram-bot-api --api-id=<your-app-id> --api-hash=<your-app-hash> --verbosity=20
1.默认地址为http://127.0.0.1:8081/,端口为8081。
1.所有的官方API都可以使用这个设置,只需将地址更改为http://127.0.0.1:8081/bot/METHOD_NAME reference:https://core.telegram.org/bots/api
示例代码:

OkHttpClient client = new OkHttpClient().newBuilder()
      .build();
    MediaType mediaType = MediaType.parse("text/plain");
    RequestBody body = new MultipartBody.Builder().setType(MultipartBody.FORM)
      .addFormDataPart("chat_id","your_chat_id_here")
      .addFormDataPart("video","file_location",
        RequestBody.create(MediaType.parse("application/octet-stream"),
        new File("file_location")))
      .addFormDataPart("supports_streaming","true")
      .build();
    // https://127.0.0.1:8081/bot<token>/METHOD_NAME 
    Request request = new Request.Builder()
      .url("http://127.0.0.1:8081/bot<token>/sendVideo")
      .method("POST", body)
      .build();
    Response response = client.newCall(request).execute();

相关问题