@alexis_berg

Как решить проблему в телеграм-боте ('utf-8' codec can't decode byte 0xca)?

Добрый день!
Может кто-то знает решение проблемы.

Вкратце: я решила создать телеграм-бот (к слову, это мой второй бот на питоне). Пока что, основной функционал бота такой: пользователь после начала работы бота, нажимает на одну из двух кнопок "Совет" либо "Видео". Соответственно, из того что он выберет, ему бот присылает либо совет в текстовом виде (выбранный рандомно из txt файла), либо видео (также рандомно выбранное из готовой базы).

При запуске работы бота вылетает ошибка связанная с кодировкой utf-8 (код ошибки представлен ниже, после основного кода). Я пробовала просто убирать этот пункт с кодировкой, тогда вроде-бы работало, но косячно и через раз. Но при этом не работала кнопка для видео, то есть, просто бот в ответ ничего не присылал. Как это можно решить? Или может эти рандомные ответы текстовом и видео формате можно представить в другом, более простом варианте? Пока что еще была мысль - залить все эти видео в отдельный приватный канал, и когда пользователь запросит видео, то бот будет просто пересылать случайный пост с видео в чат (но пока не знаю как это реализовать, нет такого опыта)

import telebot
import random
from telebot import types

# Загружаем список интересных фактов
f = open('C:/Users/User/PycharmProjects/tgbot//facts.txt', 'r', encoding='UTF-8')
facts = f.read().split('\n')
f.close()

#Загружаем список видео
vid_list = ['C:/Users/User/PycharmProjects/tgbot/1.mp4', 'C:/Users/User/PycharmProjects/tgbot/2.mp4']

# Создаем бота
bot = telebot.TeleBot('ключ бота')

# Команда start
@bot.message_handler(commands=["start"])
def start(m, res=False):
        # Добавляем две кнопки
        markup=types.ReplyKeyboardMarkup(resize_keyboard=True)
        item1=types.KeyboardButton("Совет")
        item2=types.KeyboardButton("Видео")
        markup.add(item1)
        markup.add(item2)
        bot.send_message(m.chat.id, 'Нажми: \nСовет — для получения интересного совета\nВидео — для получения видео ',  reply_markup=markup)

# Получение сообщений от юзера
@bot.message_handler(content_types=["text"])
def handle_text(message):
    # Если юзер прислал 1, выдаем ему случайный совет
    if message.text.strip() == 'Совет' :
            answer = random.choice(facts)
            # Отсылаем юзеру сообщение в его чат
            bot.send_message(message.chat.id, answer)
    # Если юзер прислал 2, выдаём ему случайное видео
    elif message.text == "Видео":
            answer = random.choice(vid_list)
            bot.send_video(message.chat.id, video=open(vid_list, 'rb'))


# Запускаем бота на постоянку
bot.polling(none_stop=True, interval=0)


Код ошибки:
Traceback (most recent call last):
File "C:\Users\User\PycharmProjects\tgbot\main.py", line 7, in
facts = f.read().split('\n')
^^^^^^^^
File "", line 322, in decode
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xca in position 3: invalid continuation byte

Process finished with exit code 1

То есть, по сути тут две проблемы:
с кодировкой 'utf-8' и реализация отправки в ответ видео

Буду рада любой помощи и советам :)
  • Вопрос задан
  • 702 просмотра
Решения вопроса 1
sergey-gornostaev
@sergey-gornostaev Куратор тега Python
Седой и строгий
Судя по ошибке, кодировка файла не utf-8.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@Vegas_Real
Вообще работу с файлом лучше реализовать через контент-менеджер with.

Лучше: bot = telebot.TeleBot('ключ бота', parse_mode='html')

Далее: UnicodeDecodeError: 'utf-8' codec can't decode byte 0xca in position 3: invalid continuation byte
Подобная ошибка как правило выскакивает, когда форматирование строки отличается от допустимого в телеграмм, например из HTML там поддерживается буквально 3 тега.
Прежде чем пытаться выплюнуть строку, посмотрите с помощью print что вы пытаетесь ему скормить.

У Вас пока всего 2 видео, воспользуйтесь для отправки file_id (https://mastergroosha.github.io/telegram-tutorial/...). Да и если их будет больше тоже лучше через file_id. Не забывайте про лимит в 50Мбайт.

И последнее переходите на aiogram - более актуальная и стабильная асинхронная библиотека
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы