Как сделать чтобы бот ждал ответа telegram

Foodband

Как заставить телеграм бота ждать сообщения от пользователя и записывать его в переменную на питоне?

Всем добрый вечер, я делаю бота в телеграмме, вот код:
5d8666d65a75b658519027.png

В чем идея: когда пользователь вводит команду /concrete , бот должен ждать сообщения от пользователя (номер), его записывать в переменную, а потом выводить информацию с текстового файла с этим номером.
На данном этапе, после ввода этой команды мне выдает ошибку: " command = msg[‘text’]
TypeError: string indices must be integers ". Как это исправить? Как заставить бота ждать новое сообщение от пользователя с номером?

Как можно ждать моего Telegram Bot для входящего сообщения?

Как я могу позволить своему Telegram Bot взаимодействовать с пользователями? Например.:

Пользователь: / купить

Бот: Что ты хочешь купить?

Пользователь: Icecream

Бот: Вы успешно купили мороженое!

Так как я могу это сделать?

Решение

Предполагая, что вы используете webhook для получения обновлений, ваш php-скрипт запускается снова при каждом обновлении, которое вы получаете.
В этом случае вам нужно будет сохранить определенный «статус» пользователя, которого вы проверяете каждый раз, когда ваш бот получает сообщение, указывающее, что вам нужно делать дальше.
Примером может быть:

Пишем бота для принятия решений

Представьте, вы работаете на очень ответственной должности в банке: вы принимаете самые важные стратегические решения в компании. Но вы так давно не были в отпуске, ведь каждый день нужно отвечать стольким сотрудникам… Вот бы вас кто-нибудь подменил…

В этом туториале вы напишете телеграм-бота для принятия особо важных стратегических решений:

Перед тем как начать…

Очень советуем не просто читать этот туториал, а проходить его вместе с нами. Копируйте кусочки кода из него и запускайте их по мере прочтения текста. Так вы поймёте происходящее гораздо лучше.

1. Создайте бота

Пользоваться будем библиотекой ptbot . Перейдите в его документацию и следуйте инструкциям в разделе “Как начать пользоваться”.

Если вы всё сделали правильно, то от бота в Telegram прилетит сообщение:

2. Заставьте бота говорить

Сейчас бот сообщает о своём запуске, а после этого замолкает. Какой-то он не слишком разговорчивый, надо его разговорить! Разберёмся что заставляет его отправить сообщение о запуске. Похоже дело в этой строчке:

Давайте её менять:

Круто, похоже, она и правда отвечает за отправку сообщений:

3. Научите бота принимать решения

Бот умеет присылать заготовленный текст. А как сделать так, чтобы он отвечал пользователям разными сообщениями? Для этого пригодится библиотека random . Её устанавливать не нужно, она встроена в Python:

В переменной answers лежит сразу 3 строки. Такой приём называется упаковка. Она передаётся в функцию random.choice , и та случайным образом выбирает одну из них. Случайный ответ складывается в переменную choice . Попробуйте запустить этот код несколько раз и вы будете получать разные результаты:

Хорошо, выбор есть. Теперь его можно отправить пользователю:

Похоже, этот код с ошибкой! Вот что он выводит:

Это ошибка, на которую часто натыкаются начинающие питонисты. Дело в том, что команда print() принимает любое количество аргументов: сколько вы ей передадите, столько она и выведет. Пример:

А вот функция send_message принимает строго два: chat_id и текст сообщения.

Чтобы исправить ошибку, “склейте” свои кусочки сообщения в одну переменную перед отправкой:

Вот что получилось:

4. Соберите код принятия решения в функцию

Теперь ваш бот умеет принимать решения. Но чтобы он это делал, его нужно запускать несколько раз. Жать на зелёную кнопку в Repl – занятие не очень интересное, хорошо бы его автоматизировать. Поможет функция:

choose() – это функция. Такая же, как print() или random.choice() , только здесь вы создаёте её самостоятельно.

После того, как вы объявили функцию, вы можете её вызывать. Так же, как вы делали это с print() , т.е. просто напишите её название и поставьте скобки:

Бот пришлёт сразу 2 сообщения:

Чтобы создать новую функцию, нужно не так-то много действий. Каждая функция начинается со слова def . Это сокращение от define , т.е. “определить”. Так код понимает разницу между созданием функции и её использованием:

Второе правило: весь код функции пишется с отступом в 4 пробела:

Конечно, не обязательно жать 4 раза на клавишу “пробел”. То же самое делает клавиша TAB на левом крае клавиатуры.

Последний нюанс. Всё, что происходит в функции, остаётся внутри неё. Например, все переменные, которые мы создали во время работы функции, окажутся недоступны извне:

То есть всё, что внутри функции, остальному коду недоступно.

Функция – это отдельный кусочек кода, который можно запустить попозже

5. Сделайте выбор неслучайным

Сейчас бот случайным образом выбирает между “да”, “нет” и “возможно”. Позже вы сможете прокачать бота, чтобы он выдавал более осознанные ответы. Но всё равно по коже пробегают мурашки: что он там сейчас наотвечает? И ведь вы даже не можете понять какие из ответов ваши, а какие принадлежат боту! Надо что-то придумать, чтобы бот записывал что и кому он ответил.

Ну давайте поступим по-простому: пусть функция выводит в консоль кто и что спрашивал у бота:

print() понятно, а дальше что. Что в него писать. В функции нет таких переменных… Чтобы они появились, нужно добавить функции аргументы:

Foodband

Теперь функция получает 2 аргумента: ID пользователя в Telegram и его вопрос. А вот как функцией теперь пользоваться:

Если сделать вот так, по-старинке:

Вы получите ошибку:

Знакомая ошибка! Вы сталкивались с ней в пункте 3 этого туториала. Только теперь вы недодаёте функции аргументов, ведь теперь она принимает сразу 2!

Последний тюнинг: разрешим боту общаться с другими пользователями. Для этого в методе send_message заменим TG_CHAT_ID на chat_id. TG_CHAT_ID – это ваш id, поэтому бот мог писать только вам. Вместо него мы передадим методу chat_id , это id любого, кто пишет боту. Этот id мы передаем при обращении к функции choose:

6. Подключите функцию к боту

У нас есть функция, которая принимает решения. Но бот всё ещё не реагирует на сообщения в чате и отвечает только вам. Просто пишет всякие сообщения, когда вы жмёте на кропку Run . Как заставить его ждать сообщений, а уже после этого отвечать?

Такая функция есть в ptbot :

Это новый способ пользоваться функциями, вы наверняка так ещё не делали. Вы передали функцию как аргумент другой функции:

Чтобы лучше понимать что произошло, давайте посмотрим на такой код:

Выведется что-то новенькое: <built-in function print> . Вы вывели саму функцию принт! Так можно делать с любыми функциями:

Теперь выведется вот такое колдунство:

Название функции – это переменная, в которой лежит функция

Этой переменной можно орудовать как любой другой. Передавать как аргумент в другие функции, или класть в другие переменные:

Теперь в переменной a лежит функция print() и она может делать то же самое, что и print() , стоит лишь подставить круглые скобки справа от неё.

Так вот, вернёмся к нашему коду:

Здесь вы передаёте в метод bot.reply_on_message вашу функцию choose :

Метод reply_on_message будет ждать до тех пор, пока боту кто-нибудь не напишет. Как только боту напишет человек, reply_on_message запустит вашу функцию choose , вот так: choose(chat_id, question) . То есть теперь функцию запустят за вас, вам самим её вызывать не нужно.

На гифке ниже можно посмотреть как теперь работает бот. Теперь он отвечает только после того, как вы ему написали:

7. Создайте иллюзию раздумий

Бот отвечает мгновенно, не задумываясь. Люди так не делают, все сразу поймут, что отвечает бот. Пусть бот немного ждёт перед ответом, чтобы все думали, что это вы alt="&#128578;" />

В ptbot есть метод, отвечающий за таймеры, с помощью таймера можно сделать эту задержку:

Если запустить такой код, то таймер запустится сразу же, как только вы нажали Run . Когда пройдёт 5 секунд, запустится функция notify . Она выведет в консоль, что 5 секунд прошло.

Вам нужен другой алгоритм:

  1. В самом начале бот ждёт сообщений от пользователя.
  2. Если боту написали, он ставит таймер на 5 секунд
  3. Когда таймер прошёл, бот запустит функцию choose

А вот как это сделать:

Когда боту пишут, он запускает функцию wait . Она ничего никому не пишет, а ставит таймер на 5 секунд.

Когда таймер пройдёт, запустится функция choose . Она запустится потому что мы передали её в метод bot.create_timer(5, choose) .

Эта функция сделает то же самое, что и раньше: выберет случайный вариант ответа и отправит сообщение пользователю.

Запускаем… Опа, ошибка!

Знакомый TypeError , снова функция хотела меньше аргументов, чем получила.

Когда вы передали функцию wait в reply_on_message , он подсунул в неё 2 аргумента: chat_id, question . Нужно указать их при объявлении def wait(): :

Запускаем ещё раз… Теперь бот подождал 5 секунд и снова выдал TypeError :

На этот раз ситуация обратная, у choose есть 2 аргумента, chat_id и question , но их ему никто не передал.

Для этого нужно воспользоваться фичей библиотеки и заставить функцию wait “поделиться” аргументами:

Теперь бот наконец работает!

Напоследок стоит навести красоту, чтобы вас на смущало question=question . Эти аргументы можно переименовать как угодно, вот например:

Называйте аргументы как хотите. Главное, чтобы было понятно

Это было интересно… а что дальше?

Теперь вы можете писать простых ботов. Вы можете реализовать ещё несколько идей с использованием ptbot . Для них нужно знать конструкции if и for , но в остальном они очень простые и потребуют не больше сотни строк:

  • Бот, который каждый год поздравляет вас с Новым годом/Днём рождения или напоминает о годовщине свадьбы.
  • Бот для крестиков-ноликов
  • Бот для игры виселицу

Когда вы перерастёте возможности библиотеки ptbot , можно осваивать её старшего брата: python-telegram-bot. Эта библиотека умеет более крутые фичи и на ней можно писать более сложных ботов. Обращению с ней мы учим в модуле Чат-боты на Python.

Попробуйте бесплатные уроки по Python

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

Foodband

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

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