Как в телеграм боте сделать функцию input
Перейти к содержимому

Как в телеграм боте сделать функцию input

  • автор:

Telebot python как сделать функцию input?

Как можно осуществить функцию input? конкретнее мне нужно получить от пользователя число от 1 до 86, в том случае если число будет меньше 1 или больше 86, то пользователю будет предложено ввести число заново

  • Вопрос задан более года назад
  • 229 просмотров

Комментировать

Решения вопроса 1

donko1

Изучаю python

@bot.message_handler(content_types=['text']) def func1(message): bot.send_message(message.from_user.id, 'Введите текст') bot.register_next_step_handler(message, func2) def func2(message): var = message.text # Текст сообщения от пользователя bot.send_message(message.from_user.id, var) # Вернет сообщение пользователя обартно

Ответ написан более года назад

Комментировать

Нравится Комментировать

Как в телеграм боте сделать функцию input?

Использую библиотеку PyTelegramBotApi Хочу сделать телеграмм бот-калькулятора. Который бы принимал любое число введенное пользователям и выполнял команду. Не могу придумать код. Кто сможет помочь, как реализовать функцию input в телеграм боте? Отрывок с кода. По задумке человек должен вести число, и нажать на стрелку вперед, а бот должен сохранить это число. Так пользователь водит два числа, воспользовавшись стрелкой, а программа должна их прибавить. Не могу придумать код что бы реализовать это.

elif call.data == 'pravo': bot.answer_callback_query(callback_query_id=call.id, show_alert=True, text="Введи свої бали ЗНО, шляхом натискання кнопки ➡️") keybord3 = types.InlineKeyboardMarkup() button = types.InlineKeyboardButton(text="➡", callback_data="zno1") keybord3.add(button) bot.edit_message_text(chat_id=call.message.chat.id, message_id=call.message.message_id, text="Введіть Бали ЗНО з українскьої мови", reply_markup=keybord3) 

Отслеживать
5,412 2 2 золотых знака 10 10 серебряных знаков 26 26 бронзовых знаков
задан 23 авг 2020 в 13:13
39 2 2 серебряных знака 11 11 бронзовых знаков
В чём конкретно проблема? Приведите ваш код
23 авг 2020 в 13:14

И какую библиотеку используете? Если это python-telegram-bot , то в ней для сохранения данных можно использовать удобное встроенное хранилище context.user_data (пример)

23 авг 2020 в 13:27
28 авг 2020 в 10:23

1 ответ 1

Сортировка: Сброс на вариант по умолчанию

Вот уже готовая реализация калькулятора. Единственное — в боте реализовано только сложение (+). В роли input() тут выступает функция bot.register_next_step_handler. Также реализовал а-ля Key-Value хранилище в памяти

import telebot from telebot import types bot = telebot.TeleBot('BOT TOKEN HERE') storage = <> def init_storage(user_id): storage[user_id] = dict(first_number=None, second_number=None) def store_number(user_id, key, value): storage[user_id][key] = dict(value=value) def get_number(user_id, key): return storage[user_id][key].get('value') @bot.message_handler(func=lambda m: True) def start(message): init_storage(message.from_user.id) bot.reply_to(message, "Введите + чтобы прибавить два числа ") bot.register_next_step_handler(message, plus) def plus(message): if message.text == "+": bot.reply_to(message,"Enter number 1: ") bot.register_next_step_handler(message, plus_one) else: bot.reply_to(message, "Введите + чтобы прибавить два числа ") bot.register_next_step_handler(message, plus) def plus_one(message): first_number = message.text if not first_number.isdigit(): msg = bot.reply_to(message, 'Enter only digits!') bot.register_next_step_handler(message, plus_one) return store_number(message.from_user.id, "first_number", first_number) bot.reply_to(message, "Enter number 2: ") bot.register_next_step_handler(message, plus_two) def plus_two(message): second_number = message.text if not second_number.isdigit(): msg = bot.reply_to(message, 'Enter only digits!') bot.register_next_step_handler(message, plus_two) return store_number(message.from_user.id, "second_number", second_number) number_1 = get_number(message.from_user.id, "first_number") number_2 = get_number(message.from_user.id, "second_number") result_plus = int(number_1) + int(number_2) bot.reply_to(message, f"Ответ: ") if __name__ == '__main__': bot.skip_pending = True bot.polling(none_stop=True) #bot.infinity_polling() 

Работа с сообщениями¶

В этой главе мы разберёмся, как применять различные типы форматирования к сообщениям и работать с медиафайлами.

Текст¶

Обработка текстовых сообщений — это, пожалуй, одно из важнейших действий у большинства ботов. Текстом можно выразить практически что угодно и при этом подавать информацию хочется красиво. В распоряжении у разработчика имеется три способа разметки текста: HTML, Markdown и MarkdownV2. Наиболее продвинутыми из них считаются HTML и MarkdownV2, «классический» маркдаун оставлен для обеспечения обратной совместимости и поддерживает меньше возможностей.

За выбор форматирования при отправке сообщений отвечает аргумент parse_mode , например:

from aiogram import types # где-то в функции. await message.answer("Hello, world!", parse_mode=types.ParseMode.HTML) # Вместо Enum-а можно задать parse_mode в виде обычной строки: await message.answer("Hello, *world*\!", parse_mode="MarkdownV2") 

Hello world с разным форматированием

Если в боте повсеместно используется определённое форматирование, то каждый раз указывать аргумент parse_mode довольно накладно. К счастью, в aiogram можно передать необходимый тип прямо в объект Bot, а если в каком-то конкретном случае нужно обойтись без этих ваших разметок, то просто укажите parse_mode=»» (пустая строка):

bot = Bot(token="123:abcxyz", parse_mode=types.ParseMode.HTML) # где-то в функции. await message.answer("Сообщение с HTML-разметкой") await message.answer("Сообщение без какой-либо разметки", parse_mode="") 

Настройка типа разметки по умолчанию

Существует и более «программный» или даже «динамический» способ формирования сообщения. Для этого нужно импортировать модуль markdown из aiogram.utils, который, несмотря на название, поддерживает и HTML тоже. Далее вызовите функцию text() , в которую передайте произвольное число таких же вызовов функции text() . Тип форматирования определяется названием функции, а буква «h» в начале означает HTML, т.е. функция hbold() обрамляет переданный ей текст как жирный в HTML-разметке ( текст ). Аргумент sep определяет разделитель между кусками текста.
В общем, смотрите на код и скриншот ниже. Стоит ли использовать такой способ создания текста — решать вам:

import aiogram.utils.markdown as fmt # где-то в функции. await message.answer( fmt.text( fmt.text(fmt.hunderline("Яблоки"), ", вес 1 кг."), fmt.text("Старая цена:", fmt.hstrikethrough(50), "рублей"), fmt.text("Новая цена:", fmt.hbold(25), "рублей"), sep="\n" ), parse_mode="HTML" ) 

Динамическое форматирование

Помимо отправки с форматированием, Aiogram позволяет извлекать входящий текст как простое содержимое (plain text), как HTML и как Markdown. Сравнить можно на скриншоте ниже. Это удобно использовать, например, если вы хотите вернуть отправителю его сообщение с небольшими изменениями:

@dp.message_handler() async def any_text_message(message: types.Message): await message.answer(message.text) await message.answer(message.md_text) await message.answer(message.html_text) # Дополняем исходный текст: await message.answer( f"Ваш текст:\n\nmessage.html_text>", parse_mode="HTML" ) 

Настройка типа разметки по умолчанию

Всё бы ничего, но с использованием форматирования есть проблема: не в меру хитрые пользователи могут использовать спец. символы в именах или сообщениях, ломая бота. Впрочем, в aiogram существуют методы экранирования таких символов: escape_md() и quote_html() . Либо можно использовать упомянутые выше методы (h)bold, (h)italic и прочие:

@dp.message_handler() async def any_text_message2(message: types.Message): await message.answer(f"Привет, fmt.quote_html(message.text)> ", parse_mode=types.ParseMode.HTML) # А можно и так: await message.answer(fmt.text("Привет,", fmt.hbold(message.text)), parse_mode=types.ParseMode.HTML) 

Экранирование ввода

Подробнее о различных способах форматирования и поддерживаемых тегах можно узнать в документации Bot API.

Медиафайлы¶

Помимо обычных текстовых сообщений Telegram позволяет обмениваться медиафайлами различных типов: фото, видео, гифки, геолокации, стикеры и т.д. У большинства медиафайлов есть свойства file_id и file_unique_id . Первый можно использовать для повторной отправки одного и того же медиафайла много раз, причём отправка будет мгновенной, т.к. сам файл уже лежит на серверах Telegram. Это самый предпочтительный способ.
К примеру, следующий код заставит бота моментально ответить пользователю той же гифкой, что была прислана:

@dp.message_handler(content_types=[types.ContentType.ANIMATION]) async def echo_document(message: types.Message): await message.reply_animation(message.animation.file_id) 

file_id уникален для каждого бота, т.е. переиспользовать чужой идентификатор нельзя. Однако в Bot API есть ещё file_unique_id . Его нельзя использовать для повторной отправки или скачивания медиафайла, но зато он одинаковый у всех ботов. Нужен file_unique_id обычно тогда, когда нескольким ботам требуется знать, что их собственные file_id относятся к одному и тому же файлу.

Кстати, про скачивание: aiogram предлагает удобный вспомогательный метод download() для загрузки небольших файлов на сервер, где запущен бот:

@dp.message_handler(content_types=[types.ContentType.DOCUMENT]) async def download_doc(message: types.Message): # Скачивание в каталог с ботом с созданием подкаталогов по типу файла await message.document.download() # Типы содержимого тоже можно указывать по-разному. @dp.message_handler(content_types=["photo"]) async def download_photo(message: types.Message): # Убедитесь, что каталог /tmp/somedir существует! await message.photo[-1].download(destination="/tmp/somedir/") 

Работа с изображениями

Обратите внимание на конструкцию message.photo[-1] . Когда пользователь присылает боту изображение, Telegram присылает не один объект, а целый массив с разными размерами одного и того же изображения, отсортированными по возрастанию. В общем случае нас будет интересовать изображение наибольшего размера, стоящее последним (индекс «минус один»).

Скачивание больших файлов

Боты, использующие Telegram Bot API, могут скачивать файлы размером не более 20 мегабайт. Если вы планируете скачивать/заливать большие файлы, лучше рассмотрите библиотеки, взаимодействующие с Telegram Client API, а не с Telegram Bot API, например, Telethon. Немногие знают, но Client API могут использовать не только обычные аккаунты, но ещё и боты.

А начиная с Bot API версии 5.0, можно использовать собственный сервер Bot API для работы с большими файлами.

Бонус¶

Бывают ситуации, когда хочется отправить длинное сообщение с картинкой, но лимит на подписи к медиафайлам составляет всего 1024 символа против 4096 у обычного текстового, а вставлять внизу ссылку на медиа — выглядит некрасиво. Более того, когда Telegram делает предпросмотр ссылок, он берёт первую из них и считывает метатеги, в результате сообщение может отправиться не с тем превью, которое хочется увидеть.
Для решения этой проблемы ещё много лет назад придумали подход со «скрытыми ссылками» в HTML-разметке. Суть в том, что можно поместить ссылку в пробел нулевой ширины и вставить всю эту конструкцию в начало сообщения. Для наблюдателя в сообщении никаких ссылок нет, а сервер Telegram всё видит и честно добавляет предпросмотр.
Разработчики aiogram для этого даже сделали специальный вспомогательный метод hide_link() :

import aiogram.utils.markdown as fmt @dp.message_handler(commands="test4") async def with_hidden_link(message: types.Message): await message.answer( f"fmt.hide_link('https://telegram.org/blog/video-calls/ru')>Кто бы мог подумать, что " f"в 2020 году в Telegram появятся видеозвонки!\n\nОбычные голосовые вызовы " f"возникли в Telegram лишь в 2017, заметно позже своих конкурентов. А спустя три года, " f"когда огромное количество людей на планете приучились работать из дома из-за эпидемии " f"коронавируса, команда Павла Дурова не растерялась и сделала качественные " f"видеозвонки на WebRTC!\n\nP.S. а ещё ходят слухи про демонстрацию своего экрана :)", parse_mode=types.ParseMode.HTML) 

Изображение со скрытой ссылкой

На этом всё. До следующих глав!
Ставьте лайки, подписывайтесь, прожимайте колокольчик

Создаем Telegram бота

Телеграм боты — это крутой способ взаимодействия с пользователем прямо в привычном ему мессенджере. Это гораздо быстрее и чаще удобнее, чем писать полноценное мобильное приложение. Сегодня мы с вами разберемся, как они работают, и создадим несколько собственных ботов.

Вспоминая функции

Функция — это часть кода программы, которую можно повторно использовать. У функции есть имя, список параметров и возвращаемое значение.

Возвращаемое значение — это результат работы функции. Рассмотрим простой пример:

def getTwo(): return 2 a = getTwo() print(a)

В данном примере мы определили функцию getTwo , она не принимает параметров и всегда возвращает ( return ) число 2. Написав a = getTwo() , мы вызвали функцию и результат ее работы попал в переменную a . На следующей строчке программа выведет 2 .

Список параметров (или аргументов) — это значения, которые необходимы функции для выполнения задачи. Рассмотрим второй пример:

def sum(a, b): return a + b print(sum(23, 5)) # выведет 28 print(sum(-3, 6)) # выведет 3

Здесь функция принимает два параметра и возвращает их сумму.

Внутри функций мы можем использовать любые переменные и операции с единственным ограничением:

  1. переменные внутри функции недоступны вне этой функции;
  2. переменные извне функции доступны только для чтения (если не испольуется ключевое слово global ).

Телеграм боты

Телеграм бот — это программа, которая запущена на вашем компьютере и общается с серверами телеграма через интернет. Можно представить, что при регистрации бота, телеграм выделяет нам почтовый ящик, через который мы можем получать сообщения от пользователей и отправлять их им.

Чтобы создать собственного бота, сперва его надо зарегистрировать. Для этого в телеграме нужно добавить бота @BotFather и следовать инструкциям.

После того, как мы введем название бота, @BotFather сообщит нам токен — пароль к нашему почтовому ящику.

Далее мы с вами научимся писать программы на питоне, которые, используя этот токен, смогут общаться с пользователями.

Устанавливаем библиотеки

Одно из ключевых преимуществ питона — наличие огромного количества встроенных и сторонних библиотек. Для того, чтобы сделать телеграм-бота, который будет присылать нам статьи из википедии по нашему запросу, нам потребуется установить сразу три библиотеки.

  • pyTelegramBotApi — для создания бота.

Для установки сторонних библиотек вместе с питоном на компьютер устанавливается программа pip.exe , которая умеет автоматически находить и скачивать библиотеки по их названию. Единственный нюанс — она работает только через командную строку (терминал).

Чтобы установить библиотеки нам потребуется открыть командную строку и последовательно ввести три команды.

pip install pytelegrambotapi

PS. Если у вас установлен питон, но компьютер все равно не находит pip, путь к нему нужно добавить в системную переменную PATH.

PS. Если у вас потребуют права администратора, можно поставить библиотеки только для текущего пользователя.

pip install --user pytelegrambotapi

Бот-попугай

Давайте сделаем нашего первого бота — бота-попугая. На все сообщения он будет отвечать повторением.

import telebot token = "ВСТАВЬТЕ СЮДА ТОКЕН" # подключаемся к телеграму bot = telebot.TeleBot(token=token) # content_types=['text'] - сработает, если нам прислали текстовое сообщение @bot.message_handler(content_types=['text']) def echo(message): # message - входящее сообщение # message.text - это его текст # message.chat.id - это номер его автора text = message.text user = message.chat.id #отправляем картинку с попугаем bot.send_photo(user, "https://i.ytimg.com/vi/R-RbmqzRC9c/maxresdefault.jpg") #отправляем сообщение тому же пользователю с тем же текстом bot.send_message(user, text) # поллинг - вечный цикл с обновлением входящих сообщений bot.polling(none_stop=True)

Помимо текстовых сообщений, в телеграме есть команды, они начинаются со слэша, например, /start или /help . Их тоже можно обрабатывать.

Давайте добавим пояснение к нашему боту, которое объяснит пользователю, что он делает.

import telebot token = "ВСТАВЬ СЮДА ТОКЕН" # подключаемся к телеграму bot = telebot.TeleBot(token=token) # реагируем на команды /start и /help @bot.message_handler(commands=['start', 'help']) def help(message): user = message.chat.id bot.send_message(user, "Это бот попугай! Просто пришли и я повторю.") # content_types=['text'] - сработает, если нам прислали текстовое сообщение @bot.message_handler(content_types=['text']) def echo(message): # message - входящее сообщение # message.text - это его текст # message.chat.id - это номер его автора text = message.text user = message.chat.id #отправляем картинку с попугаем bot.send_photo(user, "https://i.ytimg.com/vi/R-RbmqzRC9c/maxresdefault.jpg") #отправляем сообщение тому же пользователю с тем же текстом bot.send_message(user, text) # поллинг - вечный цикл с обновлением входящих сообщений bot.polling(none_stop=True)

Стикеры

Еще пример: бот, которому можно прислать стикер и получить стикер в ответ (он запоминает ранее присланные стикеры от всех пользователей).

import telebot import random token = "ТОКЕН" bot = telebot.TeleBot(token=token) stickers = [] @bot.message_handler(content_types=['sticker']) def echo(message): user = message.chat.id sticker = message.sticker.file_id stickers.append(sticker) bot.send_sticker(user,random.choice(stickers)) bot.polling(none_stop=True) 

Что такое словарь?

Списки — это очень круто! Можно хранить много данных и не придумывать имя каждому элементу. Но.

Рассмотрим другую задачу: нам нужно сделать базу клиентов для магазина комиксов. Магазин хочет помнить имя, возраст и любимые комиксы каждого клиента. Мы можем попробовать складывать это в список, но получится примерно так:

clients = ["Петька", 23, ["Майор гром", "Супермен"], "Чапаев", 43, ["Бэтмен"]]

Получаются тройки элементов, где первый элемент это имя, второй — возраст, а дальше список любимых комиксов. Жить, конечно, можно. Но ведь явно должен быть способ лучше. Да, и это — словари.

Вспомним коридор отеля, в котором на дверях написаны номера. Можно провести модернизацию и повесить на двери имя жильца вместо номера. Такой номер будет называться ключем, а сам жилец — значением.

Более естественный пример — это обычный бумажный словарь. Это книга, в которой перечислены слова и их определения. Слова — это ключи, а определения — значения.

Словарь — множество пар ключ-значение.

В примере выше весь список клиентов — это и правда список, а вот отдельный клиент тянет на словарь.

Один клиент будет выглядеть так:

client = # это словарь

А весь список клиентов:

clients = [ , ] # это список словарей

Как работать со словарями?

Работа со словарями очень похожа на работу со списками, только вместо номера элемента используется его ключ (имя).

client = print("Как зовут клиента?") print(client["name"]) print('-' * 15) print("Сколько ему лет?") print(client["age"]) print('-' * 15) print("А можно вывести всю информацию о нем?") print(client) # print('-' * 15) print("А в столбик?") for key in client: print("<> - <>".format(key, client[key])) # словарь это много пар ключ-значение. Чтобы посмотреть на все элементы надо перебрать все ключи print('-' * 15) print("Он любит кошек или собак?") if "pet" in client: print(client["pet"]) else: print("Мы не знаем") # так можно проверить, есть ли ключ в словаре print('-' * 15) print("Он любит кошек, запишите это!") client["pets"] = "кошка" print(client) # так можно добавить в словарь новый элемент # print('-' * 15) print("Возраст не нужен, удалите!") del client["age"] print(client) # удаляем элемент и словаря # print('-' * 15) # кстати, можно вывести все ключи: print(list(client.keys())) # ['name', 'favorites', 'pets'] print('-' * 15) # и отдельно все значения print(list(client.values())) # ['Петька', ['Майор гром', 'Супермен'], 'кошка'] print('-' * 15) # а еще из словаря можно сделать список пар, вот так: print(list(client.items())) # [('name', 'Петька'), ('favorites', ['Майор гром', 'Супермен']), ('pets', 'кошка')] print('-' * 15) print("Ксати, он говорил, что бэтмен тоже ничего.") client["favorites"].append("Бэтмен") print(client) #

Привязка данных к пользователю

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

Если мы будем использовать переменную, то сможем сохранить сообщение только одного пользователя. Например, Вася попросил запомнить слово kitten . Мы положим эту строку в переменную note . А затем Петя, попросить запомнить слово puppy , и мы снова положим это переменную note . Когда Вася попросит нам напомнить его последнее сообщение, мы напишем ему puppy вместо kitten . Совершенно не годится!

Удобнее всего хранить все данные, которые привязаны к конкретному пользователю в словаре. Ключем в этом словаре будет id пользователя, а значением — произвольные данные.

Предположим, что наш словарь называется notes — заметки. Теперь, когда Вася (id88000) пришлет слово kitten мы положим его в notes[88000] , а слово puppy от Пети (id5300) — в notes[5300] . Посколько теперь мы используем разные переменные для хранения слова, сообщения от разных пользователей не будут путаться.

Реализация:

import telebot # Обходим блокировку с помощью прокси telebot.apihelper.proxy = token = "ВАШ ТОКЕН" bot = telebot.TeleBot(token=token) notes = <> @bot.message_handler(commands=['remind']) def remind(message): user_id = message.chat.id if user_id not in notes: bot.send_message(user_id, "Вы мне еще не писали.") else: bot.send_message(user_id, notes[user_id]) @bot.message_handler(content_types=['text']) def remember(message): user_id = message.chat.id notes[user_id] = message.text bot.send_message(user_id, "Я запомнил") bot.polling(none_stop=True)

Запланированный ответ на конкретное сообщение

Иногда нам приходиться проводить пользователя через конкретную цепочку вопросов, и проще всего сделать это с помощью функции bot.register_next_step_handler . Она позволит нам создать сразу много функций (как и в обычном квесте) и в ответ на сообщения от пользователя последовательно вызывать нужную.

Попробуем с ее помощью провексти квест.

import telebot bot = telebot.TeleBot(token="ВСТАВЬ СЮДА ТОКЕН") @bot.message_handler(commands=['start']) def start(message): # кто нам написал? узнаем id чата! chat_id = message.chat.id # отправляем приветствие answer = bot.send_message(chat_id, "Добро пожаловать в квест. Первое задание. ") # в ответ на приветствие просим вызвать функцию point1 bot.register_next_step_handler(answer, point1) # название функции мы придумали сами, но параметр message обязателен def point1(message): # кто нам написал? узнаем id чата! chat_id = message.chat.id # что написали? узнаем текст входящего сообщения # по сути это замена input text = message.text # если ответ верен if text == "Ответ 1": # пишем об этом пользвоателю и задаем следующие вопрос answer = bot.send_message(chat_id, "Правильный ответ. Второе задание. ") # в ответ на сообщение просим вызвать функцию point2 bot.register_next_step_handler(answer, point2) else: # пишем, что ответ неверен answer = bot.send_message(chat_id, "Нет, попробуйте еще раз. ") # в ответ на сообщение просим вызвать функцию point1 bot.register_next_step_handler(answer, point1) # все по аналогии с point1 def point2(message): chat_id = message.chat.id text = message.text if text == "Ответ 2": answer = bot.send_message(chat_id, "Правильный ответ. Вы прошли квест!\nЧтобы повторить напишите /start.") else: answer = bot.send_message(chat_id, "Нет, попробуйте еще раз. ") bot.register_next_step_handler(answer, point2) bot.polling(none_stop=True) 

Получение фотографий

Следующий пример показывает, как скачать и сохранить картинку, которую прислал пользователь. Не забудьте создать папку images, в которую мы будем сохранять полученные картинки.

import uuid import telebot from PIL import Image token = "ВАШ ТОКЕН" bot = telebot.TeleBot(token=token) def process(filename): # обработка фотографии pass @bot.message_handler(content_types=['photo']) def photo(message): # скачивание файла file_id = message.photo[-1].file_id path = bot.get_file(file_id) downloaded_file = bot.download_file(path.file_path) # узнаем расширение и случайное придумываем имя extn = '.' + str(path.file_path).split('.')[-1] name = 'images/' + str(uuid.uuid4()) + extn # создаем файл и записываем туда данные with open(name, 'wb') as new_file: new_file.write(downloaded_file) # обрабатываем картинку фильтром process(name) # открываем файл и отправляем его пользователю with open(name, 'rb') as new_file: bot.send_photo(message.chat.id, new_file.read()) bot.polling(none_stop=True) 

Отправка сообщений в произвольное время

Ваш телеграм бот может писать пользователю в произвольное время, если пользователь хоть раз с ним контактировал и вы запомнили id чата с ним.

В примере ниже после команды /spam бот будет отправлять пользователю сообщение каждые несколько секунд. Для этого используется многопоточность — в одном потоке осуществляется обновление сообщений с сервера телеграма, а во втором — отправка сообщений всем пользователям каждые несколько секунд.

import telebot import time from threading import Thread token = "ТОКЕН" bot = telebot.TeleBot(token=token) users = [] @bot.message_handler(commands=['start', 'help']) def start(message): user = message.chat.id bot.send_message(user, "https://www.youtube.com/watch?v=rdg4lkgsQ04") @bot.message_handler(commands=['spam']) def add_user(message): global user user = message.chat.id if user not in users: users.append(user) bot.send_message(user, "Берем сироп вишневый!") @bot.message_handler(commands=['stop']) def remove_user(message): user = message.chat.id users.remove(user) bot.send_message(user, "Все, все.") def spam(): global users while True: for user in users: bot.send_message(user, "Затем сироп вишневый!") time.sleep(2) # запускаем цикл спама в отдельном потоке spam_thread = Thread(target=spam) spam_thread.start() bot.polling(none_stop=True)

Получаем аудиосообщения

import struct import telebot import uuid bot = telebot.TeleBot("ВСТАВЬ ТОКЕН СЮДА") def download_audio(message): voice_id = message.voice.file_id file_description = bot.get_file(voice_id) downloaded_file = bot.download_file(file_description.file_path) filename = 'audio/' + str(uuid.uuid4()) + '.oga' with open(filename, 'wb') as file: file.write(downloaded_file) return filename def convert_audio(path): import subprocess src_filename = path dest_filename = path + '.wav' subprocess.run(['ffmpeg', '-i', src_filename, dest_filename]) return dest_filename def speed_up(path): import wave audio = wave.open(path) data = audio.readframes(audio.getnframes()) values = struct.unpack(f'h', data) values2 = [] for i in range(0, len(values), 2): values2.append(values[i]) data = struct.pack(f'h', *values2) audio2 = wave.open(path + '.2.wav', 'wb') audio2.setnchannels(audio.getnchannels()) audio2.setframerate(audio.getframerate()) audio2.setsampwidth(audio.getsampwidth()) audio2.writeframes(data) return path + '.2.wav' @bot.message_handler(content_types=['voice']) def voice(message): path = download_audio(message) path = convert_audio(path) path = speed_up(path) bot.send_audio(message.chat.id, open(path, 'rb').read()) print(path) bot.polling(none_stop=True)

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *