web-dev-qa-db-ja.com

Telegram Bot APIで大きなファイルを送信する方法は?

テレグラムボットには、50MBで送信するためのファイルサイズ制限があります。

大きなファイルを送信する必要があります。これを回避する方法はありますか?

私はこのプロジェクトについて知っています https://github.com/pwrtelegram/pwrtelegram が、それを機能させることができませんでした。

たぶん誰かがすでにそのような問題を解決していますか?

Telegram APIを介してファイルのアップロードを実装し、ボットを使用してfile_idで送信するオプションがあります。

Javaライブラリを使用してボットを作成します https://github.com/rubenlagus/TelegramBots

[〜#〜]更新[〜#〜]

この問題を解決するために、私はテレグラムAPIを使用しますが、大きなファイルには1.5 GBの制限があります。

私はkotlogramを好む-優れたドキュメントを備えた完璧なlib https://github.com/badoualy/kotlogram

更新2

このlibの使用方法の例:

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ドキュメントに書いて作成することができます。

コピーして貼り付けないでください。必要に応じて書き換えてください。

6
bigspawn

電報ボットを介してファイルを送信する場合は、 つのオプション があります。

  1. InputStream10 MB写真の制限、50 MB他のファイル)
  2. Fromhttp url(Telegramがファイルをダウンロードして送信します。5 MB写真の最大サイズおよび20 MB他のタイプのコンテンツの最大サイズ。)
  3. キャッシュされたファイルをfile_idで送信します(には制限がありませんこの方法で送信されたファイル)

ですから、あらかじめfile_idを保存し、これらのIDでファイルを送信することをお勧めします(これは api docs でも推奨されています)。

2
valijon