VP_Font, выводишь юникодную строку, но почему-то в кодировке вроде windows1251. Перекодируй.
(Я бы перекодировал сам, но тебе хватило ума вставить текст картинкой).
Сергей Горностаев, ну обычного школьника это отпугнёт. А так, понятно что любую защиту можно обойти. Как всегда, вопрос в соотношении ресурсов на защиту и взлом.
> database.add_row
Т.е. дело скорее всего не в socket.io, а в базе данных. Что за движок используется? Есть ли какая-либо библиотека посредник (потому что интерфейс не очень-то похож на типовой питоний интерфейс БД)? Как представлено поле message (тип данных, collate)?
Также можно для надёжности проверить, что json['text'] - это именно строка, через isinstance(json['text'], str). Но я думаю, это условие выполняется. В таком случае дело в том, что БД/обёртка над БД либо не переваривает юникод, либо предпочитает, чтобы ей передавали уже закодированный bytes.
Приведи код, минимально воспроизводящий проблему (не забудь про форматирование).
Также укажи используемые версии ПО, так как до 2.0 у socket.io были известные проблемы с юникодом.
pt3n4ik_3, bot.polling() читает события, приходящие от сервера Телеграм, и вызывает твои обработчики для подходящих событий.
Поэтому любое непойманное исключение в обработчики так или иначе всплывёт в bot.polling().
Александр, как ошибка вам говорит (простым английским), у тебя где-то в запросе косяк. Лишняя закрывающая скобка, похоже.
И да, по видосикам учиться обычно даже сложнее чем по толковому тексту.
Hikanosu, Что насчёт DELETE?
Потому что fetchall() реально имеет смысл только для SELECT.
И честно, я не очень понимаю смысл функции __query(). Она вносит целую кучу неэффективностей: тут и соединение каждый раз, тут и fetchall(), который может аукнуться если выбрано много данных...
Почему не создать соединение единожды в начале работы бота, и не использовать его?
Hikanosu, нет. asyncio.get_event_loop() создаёт loop, если его ещё нет. Если он был создан, она возвращает существующий.
Так что если в нескольких местах кода независимо вызывается get_event_loop(), они всё равно будут использовать один и тот же loop. Так что либо просто передай результат вызова get_event_loop() в aiomysql, либо параметр loop можно просто опустить, и это будет поведение по умолчанию.
loop – is an optional event loop instance, asyncio.get_event_loop() is used if loop is not specified.
Hikanosu, я думаю, aiogram использует loop = asyncio.get_event_loop().
Это логично - в норме в асинхронном приложении только один реактор, и все асинхронные библиотеки должны использовать его.