Найти - Пользователи
Полная версия: Телеграм Бот - работа с введенным текстом
Начало » Python для новичков » Телеграм Бот - работа с введенным текстом
1 2
indiwiduum
Всем добрый вечер.
Самостоятельно изучаю Python и решил для нашей группы по английскому написать маленький телеграмь бот. Суть - это диктант, то есть комьютер рандомно задаёт цифру от 0 до 100, а пользователь должен написать её на Английском. По итогу бот должен проверить количество правильных ответов
[code python]import telebot
from random import randrange, choice
from num2words import num2words
answer_positive = ['Отлично, ты молоцед', 'Супер, продолжай в том же духе', 'Хорошая работа', 'Отлично', 'Супер', 'Мне нравится, продолжай']
answer_negative = ['Не совсем так', 'Не верно', 'Печально, но нет', 'Ох....', 'No', 'Нет']
text = 'Меня зовут Матадор. Сегодня у нас будет диктант. Я называю тебе цифры, а тебе потребуется написать их прописью на английском языке. Диктант будет состоят из 10 строк. Если готов напиши мне чате: Yes'

bot = telebot.TeleBot('...................')

@bot.message_handler(commands =['start'])
def start(message):
mess = f'Привет {message.from_user.first_name}'
bot.send_message(message.chat.id, mess, parse_mode='html')
bot.send_message(message.chat.id, text, parse_mode='html')

@bot.message_handler()
def get_user_text(message):
if message.text == 'Yes' or message.text == 'yes':
total = 0
for _ in range(10):
number = randrange(0, 101)
bot.send_message(message.chat.id, number, parse_mode='html')
@bot.message_handler(content_types=['text'])
def after_text(message):
after_text = message.text
if after_text.lower() == num2words(number):
g = f'choice(answer_positive)'
bot.send_message(message.chat.id, g, parse_mode='html')
total += 1
else:
h = f'{choice(answer_negative)}. Верный ответ будет: {num2words(number)}'
bot.send_message(message.chat.id, h, parse_mode='html')


bot.polling(none_stop=True)
[/code]

Бот можно найти в телеге Matador_Study_Bot
Проблема в том, что после запуска бота - он с тобой здоровается и просит ввести Yes, если ты готов начать. После ввода Yes запускается цикл рандомный - выводит число, после должен дать шанс ввести пользователю на английском, а по факту выводит весь цикл разом….
indiwiduum
@bot.message_handler()
def get_user_text(message):
if message.text == 'Yes' or message.text == 'yes':
total = 0
for _ in range(10):
number = randrange(0, 101)
bot.send_message(message.chat.id, number, parse_mode='html')
До этого момента все хорошо, а после не выполняется
@bot.message_handler(content_types=['text'])
def after_text(message):
after_text = message.text
if after_text.lower() == num2words(number):
g = f'choice(answer_positive)'
bot.send_message(message.chat.id, g, parse_mode='html')
total += 1
else:
h = f'{choice(answer_negative)}. Верный ответ будет: {num2words(number)}'
bot.send_message(message.chat.id, h, parse_mode='html')
py.user.next
indiwiduum
после должен дать шанс ввести пользователю на английском, а по факту выводит весь цикл разом
Так он же должен ждать ввода пользователя. То есть у бота должны быть состояния. Состояние, когда он пишет приветствие. Состояние, когда он ждёт. Состояние, когда он получил ответ от пользователя. Вот он между ними переходит постоянно. Также там есть проблема двух пользователей одновременных. Одному пользователю он должен отвечать одно, а другому пользователю он должен отвечать другое. Один пользователь может находиться на приветствии, а другой пользователь в это время может уже получать ответ от бота.

indiwiduum
Самостоятельно изучаю Python и решил для нашей группы по английскому написать маленький телеграмь бот.
А, и начал с асинхронных ботов. Начинать надо с того, с чего все начинают. Ты же не начинаешь изучение английского с пьесы Шекспира. Надо начинать с алфавита хотя бы, с простейших конструкций, с простейших слов.
Genabox
я бы сначала сделал регистрацию пользователя
потом привязал sql базу и помечал бы что пользователь уже прошел
и это и будет состояние бота

Состояние, когда он пишет приветствие. Состояние, когда он ждёт. Состояние, когда он получил ответ от пользователя. Вот он между ними переходит постоянно.
не путайте человека это стандартные функции бото которые есть во всех исходниках их ненужно пистать
а обработывать информацию тут нужно
py.user.next
Genabox
потом привязал sql базу и помечал бы что пользователь уже прошел
и это и будет состояние бота
Можно в базе хранить состояние. Главное, чтобы оно было и бот знал, в каком он состоянии находится в данный момент. Если в состоянии приветствия он не ждёт никакого ввода от пользователя, то что бы пользователь не вводил, бот ему сначала приветствие напишет, а весь его ввод просто отбросит. А если бот приветствие пользователю написал уже, то писать приветствие повторно не надо. И чтобы это определить, нужно ли писать приветствие или не нужно писать приветствие, бот должен переходить между своими состояниями. То же самое касается вопросов пользователю. Бот может ждать введения каких-то команд или каких-то данных, а может ждать ответа на вопрос, который он задал пользователю на предыдущем этапе. Так вот и там и там пользователю нужно что просто ввести и отправить боту, при этом бот должен различить, ему ввели команду или ответ на вопрос. А для этого бот должен знать свои состояния “жду команду” и “жду ответ на вопрос”.

Genabox
не путайте человека это стандартные функции бото которые есть во всех исходниках их ненужно пистать
Ничего нет, ему придётся заново всё делать это. Может, оно и есть где-то готовое в каком-то виде, но взять чужое и написать самому с нуля - это две разные вещи. Это хорошо, пока что-то чужое находится и оно ещё и бесплатное, но как только ты не найдёшь ничего вообще или когда ты напишешь что-то коммерческое, а хозяин этого чужого придёт к тебе и потребует плату с тебя за коммерческое использование его интеллектуальной собственности, то тут-то и окажется, что тебе надо это с нуля самому писать, а писать ты не умеешь ничего, потому что ты всегда чужим пользовался.
Genabox
И чтобы это определить, нужно ли писать приветствие или не нужно писать приветствие, бот должен переходить между своими состояниями.
я это и имел ввиду в базе стоит пометка на чем бот остановился

писать самому
ну вот мануал к nextcord
https://docs.nextcord.dev/en/stable/ext/commands/commands.html#parameters
там реально очень много всего, такое самому писать ну разве что если для своего удовольствия тогда и телеграм или дискорд свой писать
а если для работы как мне понадобился или этому джентельмену то можно готовые сурсы брать и своим функционалом обвешивать

бот и бот-платформа
py.user.next
Genabox
я это и имел ввиду в базе стоит пометка на чем бот остановился
Я понял, но я-то беру выше. Концепция состояний, между которыми переходит бот, даёт возможность очертить их, найти их все, рассмотреть каждое в отдельности и спроектировать всю модель в конечном виде. Когда модель бота построена, тогда можно и выбирать, через что эту модель реализовывать, через СУБД с SQL или через простые файлы, например, для которых дополнительные установки каких-то СУБД не требуются.

Genabox
писать самому
ну вот мануал к nextcord
Прекрасная система. Но вот что я тебе скажу. Сначала я поставил Slack и пользовался им, там я написал несколько ботов. Потом я всем этим пользовался и поставил Telegram. И я подумал “а что, если этих Slack'овских ботов перенести и в Telegram ещё?”, так я практически без изменений перенёс одного бота из Slack в Telegram. Немного на это времени ушло. Сейчас у меня ещё Discord добавился и я думаю “переносить мне этого бота в Discord или нет?”. Потом Heroku накрылся (бесплатный стал платным) и боты, которые запускались на нём, отвалились у меня. Я тогда вообще этого бота переписал полностью на смартфон в виде приложения под Android. С Python на Java переписал с дополнительной обработкой Android'ных нюансов. Так вот бота из Slack в Telegram я переносил практически без изменений. Перенести этого бота из Slack в Discord или из Telegram в Discord тоже можно было бы без изменений. Если бы боты продолжали работать на бесплатном хостинге, я бы так и сделал и приложение для Android не писал бы это, пользовался бы ботами на смартфоне.

Это вот я к чему. Система nextcord хоть и хорошая система, но она работает только с Discord'ом. Если бы я написал бота только для Slack или только для Telegram, я бы не смог его потом переносить быстро в любой другой мессенджер. Мне бы каждый раз приходилось писать этого бота заново, копируя лишь маленькие кусочки из уже существующего бота. Сейчас вот WhatsApp добавит ботов, например, и я уже знаю, что я смогу своего бота из Slack'а поставить в WhatsApp.

Я тебе скажу больше. Если ботов правильно пишешь, то их можно не только между мессенджерами переносить, но и перенести, например, из мессенджера на сайт, чтобы сайт мог этим ботом пользоваться без какого-либо участия мессенджера.

Genabox
то можно готовые сурсы брать и своим функционалом обвешивать
Да, и будешь сто таких вариантов искать и писать под каждый мессенджер. Потом будешь плакать “ой, вот у меня в Discord'е есть такой бот, а в Telegram'е нету; где бы мне взять библиотечку под Telegram, почему её нет? для Discrod'а ведь есть, это несправедливо!”. Так ты и будешь побираться и собирать системы в виде костыль на костыле костылём погоняет, пока не научишься себе сам всё писать сразу в чистом виде с хорошей кроссплатформенностью. У программ должна быть высокая когезия (cohesion) и низкий каплинг (coupling). Ты же, привязываясь кодом к nextcord'у, повышаешь каплинг бота, что потом будет требовать наличия nextcord'а на другом мессенджере. А там его не будет.

Genabox
а если для работы как мне понадобился или этому джентельмену
Он изучает питон
indiwiduum
Самостоятельно изучаю Python
Это значит, что ему нужно научиться, а не сделать одну прогу какую-то нужную и забыть о языке после этого.

Проблема в том, что он, как и любой новичок, думает, что программирование - это просто. Типа раньше языков не было типа питона, поэтому раньше программирование было сложным, а сейчас питон появился и программирование стало простым вдруг. А это-то не так. Поэтому, имея такое предположение о простоте написания программ, он пытается сходу получить всё и сразу. Он попытался прямо в коде получить разные состояния бота здесь и сейчас, потому что это просто понять. Я же ему хочу сказать, что за каждым простым ботом, которым просто пользоваться, может скрываться пятиэтажка. А чтобы построить пятиэтажку, нужен план строительства. И без плана просто навалить бетонных плит как-то примерно прямоугольно и таким образом настроить кучу этажей и получить пятиэтажку не получится. Хочешь построить пятиэтажку, построй сарай хотя бы, в котором безопасно без каски можно находиться, или даже хотя бы простую табуретку сделай, чтобы на ней сидеть можно было, не качаясь из-за разной длины ножек.
Genabox
да я подумываю переписать его потом на сокет на андроиде
но я в андроиде не 1но приложение еще не создавал
закончу с дискордом перепешу на андроид как приложение, а пока сейчас этот дискорд бот закончить нужно потому что он мне для маркета нужен - отслеживать цены по апи

я на питоне еще совсем теряюсь, раньше на дэлфи писал даже очки с лампочками через ком порт, классно мозг расслабляет, там есть форма есть таймеры все классно а тут нихрена нету но зато море офигенных библиотек. еще в этом gui теряюсь, просто небыло времени на это, пока дос окно меня устроит. даже дос окно закрыть не могу вот пришлось даже новую тему открывать а построение пакетов я так и не понял логики как с 4-5 уровня глубины папок вызывать основной скрипт или соседние если вообще такое можно
py.user.next
Genabox
но я в андроиде не 1но приложение еще не создавал
Я сначала пишу консольную версию на Java, отлаживаю её. Потом уже это идёт в Android, когда оно работает. Но заморочки там всё равно есть. Например, в консольной версии можно загружать страницы из Интернета синхронно, а в Android такой загрузчик вываливает приложение без объяснения причины, потому что там требуется асинхронная загрузка. Приходится вот так переделывать даже консольную программу, написанную на Java, которая работает в консоли прекрасно. Но с опытом всё больше и больше этих моментов знаешь, поэтому уже подолгу не сидишь, пытаясь выяснить причину выпадения приложения.

Genabox
потому что он мне для маркета нужен - отслеживать цены по апи
У меня два приложения. Одно за транспортом в городе следит, другое за банками и другими подобными организациями. Хочу ещё аптечное приложение написать, так как аптечная сеть сильно варьирует цены на лекарства внутри своих же точек. Иногда приходишь в точку той же сети и видишь, что лекарство дешевле на пятьдесят рублей, хотя производитель тот же и лекарство то же самое. Какая-то муть вот такая. Поставил их приложение, которое они навязывали упорно, там вообще цены подменяет оно, вместо реальных цен показывает скидочные, потом продавщицы говорят “мы не знаем, как оно работает, но цена у нас выше сегодня, будете брать?”. А с учётом того, что для просто полечиться немного врач обычно выписывает лекарств тысяч на пять, которые ещё и не помогут вообще никак, так можно сэкономить рублей пятьсот или даже тысячу, просто зная, где и в какой точке самое дешёвое из этих одинаковых лекарств находится сегодня (каждый день ещё цены переписывают). В консоли-то у меня это есть уже, оно на питоне наскоряк написано, а для Android надо время выбрать, так как сначала надо консольное на Java написать, а потом ещё переносить консольное на Android. Консольные сразу напрямую туда не переносятся, надо адаптировать, иначе оно просто выпадает и всё.
Genabox
Одно за транспортом в городе следит, другое за банками и другими подобными организациями
у меня на будущее стоит задачка написать автомобильную операционнцю систему для логистической фуры
- бортовой компьютер с данными gps, температура прицепа очвещение почта интернет и все что нужно водителю фуры - условие загрузка полной оболочки тоесть операционная система для mini pc (полноценный пк)
на чем бы вы писали? какой язык программирования и почему
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB