@ddgryaz

Почему сбрасывается соединение с MySQL в боте pytelegrambotapi?

Доброго времени суток!
Подскажите пожалуйста, при старте бота - бот собирает данные всех пользователей:
@bot.message_handler(commands=['start'])
        def first(message):
            global user_id
            global nickname
            global fn
            global sn
            user_id = message.from_user.id
            nickname = message.from_user.username
            fn = message.from_user.first_name
            sn = message.from_user.last_name
            cursor.execute(f'SELECT * FROM allusers WHERE telegram_id = {user_id}')
            if cursor.fetchall() == []:
                add_allusers = (
                    'INSERT INTO allusers (nickname, name, second_name, telegram_id, dt) VALUES (%(nn)s, %(fn)s, %(sn)s, %(t_id)s, %(dtn)s)')
                data_allusers = {
                    'nn': nickname,
                    'fn': fn,
                    'sn': sn,
                    't_id': user_id,
                    'dtn': datetime.datetime.now(),
                }
                cursor.execute(add_allusers, data_allusers)
                conn.commit()
                print('Новый пользователь БОТА: ', message.from_user.id)
            else:
                pass


Соответственно в админ панели реализована кнопка вывода этой статистики:
elif message.text == ' Статистика бота':
                if message.chat.id == айдиадмина:
                    p = ('SELECT * FROM allusers')
                    cursor.execute(p)
                    with open('allusers.txt', 'w', encoding='utf-8') as g:
                        print('Общая статистика по пользователям бота: ', file=g)
                    for p in cursor:
                        with open('allusers.txt', 'a', encoding='utf-8') as f:
                            print(p, file=f)
                    statistiksall = open('allusers.txt', 'r', encoding='utf-8')
                    datax = statistiksall.read()
                    statistiksall.close()
                    nazad_button = types.ReplyKeyboardMarkup(True, False)
                    nazad_button.row('Назад в админ панель')
                    bot.send_message(айдиадмина, datax, reply_markup=nazad_button)


Вопрос такой: все это дело работает корректно и хорошо - бот записывает всех, кто еще не записан. А по кнопке - админ получает статистику, и ошибок никаких нет.
Но, если не запрашивать какое то время эту статистику, (например часов 15), а после запросить - бот умирает и выдает ошибки.
Полазив на форумах, мне рекомендовали завернуть бота в бесконечный цикл:
sys.setrecursionlimit(10000)
While True:
     try:
         Сюда бота
     except:
           os.system('python "bot.py"')

После этого дела, если долго не запрашивать статистику, бот все равно отключается, но сразу запускается и присылает статистику. Я так понимаю это костыль, а не решение проблемы, так в чем же дело?

Ошибки:
Microsoft Windows [Version 6.3.9600]
(c) Корпорация Майкрософт (Microsoft Corporation), 2013. Все права защищены.

C:\Users\Administrator\Desktop\ботнасервер>python bot.py
Новый пользователь БОТА: 524265756
2020-11-17 15:00:52,742 (util.py:75 WorkerThread2) ERROR - TeleBot: "Operational
Error occurred, args=(2055, "2055: Lost connection to MySQL server at 'localhost
:3306', system error: 10053 Программа на вашем хост-компьютере разорвала установ
ленное подключение", None)
Traceback (most recent call last):
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python37\lib\site-p
ackages\mysql\connector\network.py", line 164, in send_plain
self.sock.sendall(packet)
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python37\lib\ssl.py
", line 1034, in sendall
v = self.send(byte_view[count:])
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python37\lib\ssl.py
", line 1003, in send
return self._sslobj.write(data)
ConnectionAbortedError: [WinError 10053] Программа на вашем хост-компьютере разо
рвала установленное подключение

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python37\lib\site-p
ackages\telebot\util.py", line 69, in run
task(*args, **kwargs)
File "bot.py", line 111, in main
cursor.execute(p)
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python37\lib\site-p
ackages\mysql\connector\cursor.py", line 569, in execute
self._handle_result(self._connection.cmd_query(stmt))
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python37\lib\site-p
ackages\mysql\connector\connection.py", line 651, in cmd_query
result = self._handle_result(self._send_cmd(ServerCmd.QUERY, query))
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python37\lib\site-p
ackages\mysql\connector\connection.py", line 369, in _send_cmd
packet_number, compressed_packet_number)
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python37\lib\site-p
ackages\mysql\connector\network.py", line 167, in send_plain
errno=2055, values=(self.get_address(), _strioerror(err)))
mysql.connector.errors.OperationalError: 2055: Lost connection to MySQL server a
t 'localhost:3306', system error: 10053 Программа на вашем хост-компьютере разор
вала установленное подключение
"
2020-11-17 15:00:54,586 (util.py:75 PollingThread) ERROR - TeleBot: "ApiTelegram
Exception occurred, args=('A request to the Telegram API was unsuccessful. Error
code: 409 Description: Conflict: terminated by other getUpdates request; make s
ure that only one bot instance is running',)
Traceback (most recent call last):
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python37\lib\site-p
ackages\telebot\util.py", line 69, in run
task(*args, **kwargs)
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python37\lib\site-p
ackages\telebot\__init__.py", line 285, in __retrieve_updates
updates = self.get_updates(offset=(self.last_update_id + 1), timeout=timeout
)
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python37\lib\site-p
ackages\telebot\__init__.py", line 255, in get_updates
json_updates = apihelper.get_updates(self.token, offset, limit, timeout, all
owed_updates)
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python37\lib\site-p
ackages\telebot\apihelper.py", line 241, in get_updates
return _make_request(token, method_url, params=payload)
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python37\lib\site-p
ackages\telebot\apihelper.py", line 108, in _make_request
json_result = _check_result(method_name, result)
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python37\lib\site-p
ackages\telebot\apihelper.py", line 135, in _check_result
raise ApiTelegramException(method_name, result, result_json)
telebot.apihelper.ApiTelegramException: A request to the Telegram API was unsucc
essful. Error code: 409 Description: Conflict: terminated by other getUpdates re
quest; make sure that only one bot instance is running
"
  • Вопрос задан
  • 164 просмотра
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы