Всем привет! В данной статье я поделюсь своей реализацией бота для telegram, который может переводить статьи из интернета в mp3-файлы. Для этого я буду использовать python 3.6 и соответствующие библиотеки. Итак, приступим. Для начала надо зарегистрировать своего бота в telegram. На хабре есть статья, в которой это подробно описано. Далее надо установить pip, на всякий случай прикрепляю ссылку на его установку. После установки менеджера пакетов устанавливаем библиотеки, которые помогут осуществить задуманное, выполняем в терминале: Теперь надо создать три основных файла: bot.py parser.py voice.py В них будет реализована логика работы приложения. bot.py отвечает непосредственно за работу бота, основные функции всех модулей вызываются в нем. В parser.py реализован парсинг, того что отправлено боту, в voice.py реализован функционал перевода данных после парсинга в аудиоформат. Смысл таков, боту приходит ссылка на статью из интернета, если она удовлетворяет условию(url-адрес ведет на контент, который написан с использованием тега <article>, а не содержащий просто набор текста), текст статьи парсится с помощью bs4 и средствами библиотеки pyttsx3 записывается в аудиофайл, который в дальнейшем конвертируется в mp3 и отправляется пользователю обратно сообщением. Все просто. Понеслась... Я использую декоратор message_handler, чтобы отвечать юзеру на вызов команды /start и на сообщения Глобальная переменная is_running и ее проверка нужна для того, чтобы не вызывать повторно основные функции бота до тех пор, пока они не закончат работу над предыдущим запросом. То есть, боту необходимо отправить аудиофайл или же дать ответ юзеру, что, что-то пошло не так и только потом принимать новый запрос на обработку. В переменной link я проверяю, что боту пришел действительно url-адрес, а в article_language, что статья была удачно распарсена и ее язык получен. Чтобы проверить, что пользователь действительно отправил ссылку, я использую регулярное выражение в функции get_link. Если функция отработала и вернула url статьи, я иду дальше и получаю её текст, если вернулся False, бот посылает посылает сообщение: "Нет, это не ссылка, попробуй прислать ссылку на статью." Здесь я проверяю код ответа, использую для этого соответствующее исключение, если боту был отправлен несуществующий url. При вызове requests.exceptions.ConnectionError возвращается False, который в дальнейшем не пройдет проверку в get_article_language. Парсинг статьи осуществляется библиотекой BeautifulSoup4 по тегу <article>, с получением всего входящего в тег текста, с разделением через точку с пробелом. Это нужно для того, чтобы разделить слитные части текста, которые могут образоваться при парсинге, в итоге аудиофайл будет прочитан программой с более верной интонацией. get_article_text возвращает строку с содержимым статьи, либо False. Язык статьи я определяю, используя библиотеку langdetect. Я выбрал в своей реализации всего лишь 2 языка: русский и английский, хотя можно было бы и больше. В функции возвращается либо массив, 0-ой элемент которого идет в отправку сообщения юзеру об языке статьи, а 1-й элемент используется в pyttsx3 для выбора языка чтеца, либо False, тогда бот посылает сообщение: "Данная статья не подходит, попробуй прислать другую…". Для создания аудиофайла я использую библиотеку pyttsx3 как указано было ранее, а для конвертации в mp3 библиотеку pydub. Сначала я задаю настройки в engine_settings, выставляю скорость чтения, в зависимости от языка статьи использую русско-говорящего или англо-говорящего чтеца мужского пола и выбираю его голос. В get_mp3_file я применяю настройки из engine_settings, сохраняю полученный текст статьи после парсинга в аудиофайл(в get_file_name указываю mp3, но по факту pyttsx3 дает другой формат и в обычных проигрывателях, полученный файл не воспроизводится, поэтому в дальнейшем его надо конвертировать с помощью AudioSegment). После выполнения engine.runAndWait и дальнейшей конвертации в mp3, файл сохранится в текущей директории проекта. Теперь бот может отправить аудиофайл юзеру. Прикрепляю видео работы бота. Конечно, у меня получился неидеальный парсинг, причем завязанный на тег <article> и голос в pyttsx3 в некоторых моментах может быть неслушабельным, но задумка по моему мнению неплохая и к тому же работающая. Спасибо за внимание. Senior QA