Доброго времени суток!
Подскажите пожалуйста, при старте бота - бот собирает данные всех пользователей:
@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
"