Телеграм бот сам выключается, выходит из строя linux сервер ubuntu. Telebot
Начнем с того что после запуска .service файла на облачном linux сервере, с установленной операционной системой ubuntu бот прекрасно работает, день, два, рекорд неделю работал. Но как то случается то что бот сам по себе выключается, перестает отвечать на сообщения и прочее. Лечится это перезагрузкой. Я должен запустить бота на своем пк, подождать пока он ответит на все накопившиеся сообщения и только тогда он запускается на сервере. Я так полагаю, что для того что бы он вновь перезапустился нужно выполнить подключение к апи телеграм с другого устройства.
Что я пробовал для решения этой задачи. В начале, я подумал что поможет цикл while, который при ошибке выведет мне ошибку и заново перезапустит бота, но это вызывало ошибку с кодом python 'source':
if __name__ == '__main__':
while True:
try:
bot.polling(none_stop=True)
except Exception as e:
file_name = 'error_log.txt'
with open(file_name, 'a') as file:
file.write(f'{str(e)}\n')
file.write(traceback.format_exc())
time.sleep(30)
print(e)
далее я прибегнул к ограничению запросов к апи телеграм,
def limit_calls(func):
def wrapper(message):
chat_id = message.chat.id
current_time = time.time()
if chat_id not in call_count:
call_count[chat_id] = 0
if chat_id not in last_call_time or current_time - last_call_time[chat_id] >= 1:
call_count[chat_id] = 0
last_call_time[chat_id] = current_time
if call_count[chat_id] >= 5:
time.sleep(1)
func(message)
else:
call_count[chat_id] += 1
func(message)
return wrapper
@bot.message_handler(content_types=["text"])
@limit_calls
def commands(message):
pass
Но тут опять получил ошибку. Я облазил весь интернет, обратился к друзьям, к чат gpt . Но ничего не нашел.Что делать? Как заставить бота работать бесперебойно? Можете дать решение данной проблемы или советы для того что бы я переписал код.
Примечание код очень большой на 400 строк, сюда прикреплять не вижу смысла, выделил только основные части, они ниже
Весть код.
import telebot
import time
from telebot import apihelper
bot = telebot.TeleBot(TOKEN)
call_count = {}
last_call_time = {}
def limit_calls(func):
def wrapper(message):
chat_id = message.chat.id
current_time = time.time()
if chat_id not in call_count:
call_count[chat_id] = 0
if chat_id not in last_call_time or current_time - last_call_time[chat_id] >= 1:
call_count[chat_id] = 0
last_call_time[chat_id] = current_time
if call_count[chat_id] >= 5:
time.sleep(1)
func(message)
else:
call_count[chat_id] += 1
func(message)
return wrapper
@bot.message_handler(content_types=["text"])
@limit_calls
def commands(message):
pass
**#Тут содержится вызов всех функций, но я посчитал не нужным их вставлять сюда.**
if __name__ == '__main__':
while True:
try:
bot.polling(none_stop=True)
except Exception as e:
file_name = 'error_log.txt'
with open(file_name, 'a') as file:
file.write(f'{str(e)}\n')
file.write(traceback.format_exc())
time.sleep(30)
print(e)
Текст ошибок прикреплю ниже.
HTTPSConnectionPool(host='api.telegram.org', port=443): Read timed out. (read timeout=25)
Traceback (most recent call last):
File "/usr/lib/python3/dist-packages/urllib3/connectionpool.py", line 421, in _make_request
six.raise_from(e, None)
File "<string>", line 3, in raise_from
File "/usr/lib/python3/dist-packages/urllib3/connectionpool.py", line 416, in _make_request
httplib_response = conn.getresponse()
File "/usr/lib/python3.8/http/client.py", line 1348, in getresponse
response.begin()
File "/usr/lib/python3.8/http/client.py", line 316, in begin
version, status, reason = self._read_status()
File "/usr/lib/python3.8/http/client.py", line 277, in _read_status
line = str(self.fp.readline(_MAXLINE + 1), "iso-8859-1")
File "/usr/lib/python3.8/socket.py", line 669, in readinto
return self._sock.recv_into(b)
File "/usr/lib/python3.8/ssl.py", line 1270, in recv_into
return self.read(nbytes, buffer)
File "/usr/lib/python3.8/ssl.py", line 1128, in read
return self._sslobj.read(len, buffer)
socket.timeout: The read operation timed out
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/usr/lib/python3/dist-packages/requests/adapters.py", line 439, in send
resp = conn.urlopen(
File "/usr/lib/python3/dist-packages/urllib3/connectionpool.py", line 719, in urlopen
retries = retries.increment(
File "/usr/lib/python3/dist-packages/urllib3/util/retry.py", line 400, in increment
raise six.reraise(type(error), error, _stacktrace)
File "/usr/lib/python3/dist-packages/six.py", line 703, in reraise
raise value
File "/usr/lib/python3/dist-packages/urllib3/connectionpool.py", line 665, in urlopen
httplib_response = self._make_request(
File "/usr/lib/python3/dist-packages/urllib3/connectionpool.py", line 423, in _make_request
self._raise_timeout(err=e, url=url, timeout_value=read_timeout)
File "/usr/lib/python3/dist-packages/urllib3/connectionpool.py", line 330, in _raise_timeout
raise ReadTimeoutError(
urllib3.exceptions.ReadTimeoutError: HTTPSConnectionPool(host='api.telegram.org', port=443): Read timed out. (read timeout=25)
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "main.py", line 381, in <module>
bot.polling(none_stop=True)
File "/usr/local/lib/python3.8/dist-packages/telebot/__init__.py", line 1104, in polling
self.__threaded_polling(non_stop=non_stop, interval=interval, timeout=timeout, long_polling_timeout=long_polling_timeout,
File "/usr/local/lib/python3.8/dist-packages/telebot/__init__.py", line 1179, in __threaded_polling
raise e
File "/usr/local/lib/python3.8/dist-packages/telebot/__init__.py", line 1140, in __threaded_polling
polling_thread.raise_exceptions()
File "/usr/local/lib/python3.8/dist-packages/telebot/util.py", line 110, in raise_exceptions
raise self.exception_info
File "/usr/local/lib/python3.8/dist-packages/telebot/util.py", line 92, in run
task(*args, **kwargs)
File "/usr/local/lib/python3.8/dist-packages/telebot/__init__.py", line 661, in __retrieve_updates
updates = self.get_updates(offset=(self.last_update_id + 1),
File "/usr/local/lib/python3.8/dist-packages/telebot/__init__.py", line 633, in get_updates
json_updates = apihelper.get_updates(
File "/usr/local/lib/python3.8/dist-packages/telebot/apihelper.py", line 321, in get_updates
return _make_request(token, method_url, params=payload)
File "/usr/local/lib/python3.8/dist-packages/telebot/apihelper.py", line 158, in _make_request
result = _get_req_session().request(
File "/usr/lib/python3/dist-packages/requests/sessions.py", line 533, in request
resp = self.send(prep, **send_kwargs)
File "/usr/lib/python3/dist-packages/requests/sessions.py", line 646, in send
r = adapter.send(request, **kwargs)
File "/usr/lib/python3/dist-packages/requests/adapters.py", line 529, in send
raise ReadTimeout(e, request=request)
requests.exceptions.ReadTimeout: HTTPSConnectionPool(host='api.telegram.org', port=443): Read timed out. (read timeout=25)
'source'
Traceback (most recent call last):
File "main.py", line 381, in <module>
bot.polling(none_stop=True)
File "/usr/local/lib/python3.8/dist-packages/telebot/__init__.py", line 1104, in polling
self.__threaded_polling(non_stop=non_stop, interval=interval, timeout=timeout, long_polling_timeout=long_polling_timeout,
File "/usr/local/lib/python3.8/dist-packages/telebot/__init__.py", line 1179, in __threaded_polling
raise e
File "/usr/local/lib/python3.8/dist-packages/telebot/__init__.py", line 1140, in __threaded_polling
polling_thread.raise_exceptions()
File "/usr/local/lib/python3.8/dist-packages/telebot/util.py", line 110, in raise_exceptions
raise self.exception_info
File "/usr/local/lib/python3.8/dist-packages/telebot/util.py", line 92, in run
task(*args, **kwargs)
File "/usr/local/lib/python3.8/dist-packages/telebot/__init__.py", line 661, in __retrieve_updates
updates = self.get_updates(offset=(self.last_update_id + 1),
File "/usr/local/lib/python3.8/dist-packages/telebot/__init__.py", line 636, in get_updates
return [types.Update.de_json(ju) for ju in json_updates]
File "/usr/local/lib/python3.8/dist-packages/telebot/__init__.py", line 636, in <listcomp>
return [types.Update.de_json(ju) for ju in json_updates]
File "/usr/local/lib/python3.8/dist-packages/telebot/types.py", line 207, in de_json
chat_boost = ChatBoost.de_json(obj.get('chat_boost'))
File "/usr/local/lib/python3.8/dist-packages/telebot/types.py", line 9152, in de_json
obj['source'] = ChatBoostSource.de_json(obj['source'])
KeyError: 'source'
'source'