Как увеличить время работы 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 шт):
А какой у вас размер файла?
Для файла размером 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
Получилось решить проблему с помощью потоков:
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 и отправка файла происходит одновременно, и как только заканчивается действие файл уже получен клиентом
Я столкнулся с такой же проблемой и ваши ответы помогли мне найти и улучшить данное решение. Вот как получилось у меня:
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