Как увеличить время работы send_action в telebot?

Как бы я хотел сделать: отправляется действие, потом как оно заканчивается, отправляется файл. Но получается так, что действие длится 5 секунд, а потом еще 5 секунд занимает отправка файла, и это время пользователь не понимает, это бот завис или файл еще отправляется. Как увеличить время действия до непосредственной отправки файла?

import telebot
...
def send_file(m: Message, file):
    bot.send_chat_action(m.chat.id, action='upload_document')
    bot.send_document(m.chat.id, file)

Ответы (3 шт):

Автор решения: D. Violet

А какой у вас размер файла?

Для файла размером 36 байт отправка действия выполняется около 2 секунд, после сразу отправка файла.

bot.send_chat_action(message.chat.id, action='upload_document')

f_bat = open('files/file.bat', 'rb')
bot.send_document(message.chat.id, f_bat, None, 'Caption text')
f_bat.close()

Вы так же можете попробовать посмотреть в сторону asynchronous delivery of messages

import telebot

tb = telebot.AsyncTeleBot("TOKEN")
task = tb.get_me() # Execute an API call
# Do some other operations...
a = 0
for a in range(100):
    a += 10

result = task.wait() # Get the result of the execution

А ещё вы можете загрузить файл на сервера телеграма, получить его id и отправлять файл через id

→ Ссылка
Автор решения: RoyalGoose

Получилось решить проблему с помощью потоков:

from threading import Thread
def send_action(id, ac):
    bot.send_chat_action(id, action=ac)

def send_doc(id, f):
    bot.send_document(id, f)

def send_file(m: Message):
    file = open(...)
    Thread(target=send_action, args=(m.chat.id, 'upload_document')).start()
    Thread(target=send_doc, args=(m.chat.id, file)).start()
...
send_file(m)

Таким образом action и отправка файла происходит одновременно, и как только заканчивается действие файл уже получен клиентом

→ Ссылка
Автор решения: Berkutsoft

Я столкнулся с такой же проблемой и ваши ответы помогли мне найти и улучшить данное решение. Вот как получилось у меня:

from threading import Thread, Timer

def sample_function(m: Message, *args):

    # Запускает длительную функцию, например генерация ответа, загрузка файлов и тп.
    t = Thread(target=long_time_function, args=(*args))
    t.start()

    # функция проверки запущенного потока.
    def check_thread():
        if t.is_alive(): # если поток t ещё активен, то
        # Отправляем действие 'typing' ("Печатает...")
        Thread(target=bot.send_chat_action, args=(m.chat.id, 'typing')).start()
        # запуск проверки через 5 секунд
        Timer(5, check_thread).start()
    check_thread()  # запуск первой проверки

В итоге статус "Печатает..." будет висеть до тех пор, пока не закончится выполняться функция long_time_function

→ Ссылка