В первой части мы сделали гороскоп на Python, который выдаёт нам прогноз на день по знаку зодиака. Сегодня пойдём дальше: теперь этот же генератор гороскопов будет встроен в Телеграм в виде бота.

Да. То, что обычно на курсах продают за 50 тысяч рублей, мы вам сейчас расскажем за 15 минут бесплатно.

Как всё будет работать

В этом проекте три звена: наш компьютер с Python, сервер Телеграма и Телеграм-клиент.

На компьютере работает интерпретатор Python, а внутри интерпретатора крутится наша программа на Python. Она отвечает за весь контент: в неё заложены все шаблоны текста, вся логика, всё поведение.

Внутри программы на Python работает библиотека, которая отвечает за общение с сервером Телеграма. В библиотеку мы вшили секретный ключ, чтобы сервер Телеграма понимал, что наша программа связана с определённым ботом.

Когда клиент с Телеграмом запрашивает у бота гороскоп, запрос приходит на сервер, а сервер отправляет его на наш компьютер. Запрос обрабатывается программой на Python, ответ идёт на сервер Телеграма, сервер отдаёт ответ клиенту. Изи:

Сделал бота для РЫБАЛКИ в МАЙНКРАФТ на Python + mineflayer

Телеграм-бот на Python

Обратите внимание, что работать наш бот будет только тогда, когда включён компьютер и на нём запущена программа на Python. Если компьютер выключится, пропадёт интернет или вы отключите интерпретатор, то бот работать перестанет: запросы будут приходить, но никто на них не ответит. В одной из следующих частей мы сделаем так, чтобы это всё работало на удалённом сервере и было всегда доступно.

Что будем делать

Если записать пошагово наш план, то он будет выглядеть так:

  1. Регистрируем бота в Телеграме.
  2. Устанавливаем Python-библиотеку для работы с Телеграмом.
  3. Добавляем библиотеку в программу с гороскопом и учим программу реагировать на сообщения в чате.
  4. Пишем там же код, который покажет кнопки для выбора знаков зодиака.
  5. Сделаем так, чтобы по кнопкам появлялся гороскоп для этого знака.

Теперь по очереди разберём каждый пункт.

1. Регистрация нового бота

Нажимаем Start и пишем команду /newbot. Нас по очереди спросят про название бота и его никнейм (мы придумали только с третьей попытки, потому что остальные были заняты):

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

Есть два основных способа работать с телеграмом в Python: через библиотеку telebot и с помощью Webhook. Мы будем использовать библиотеку — так проще и быстрее.

Чтобы её установить, запускаем командную строку от имени администратора (если у вас Windows) и пишем команду pip install pytelegrambotapi

Подключаем библиотеку и получаем сообщения

Чтобы программа на Python умела управлять Телеграм-ботами, нужно в самое начало кода добавить строки:

Как делать КРУТЫХ БОТОВ для Minecraft на Python + mineflayer

import telebot;
bot = telebot.TeleBot(‘токен’);

# Подключаем модуль случайных чисел import random # Заготовка для первого предложения first = [«Сегодня — идеальный день для новых начинаний.»,»Оптимальный день для того, чтобы решиться на смелый поступок!»,»Будьте осторожны, сегодня звёзды могут повлиять на ваше финансовое состояние.»,»Лучшее время для того, чтобы начать новые отношения или разобраться со старыми.»,»Плодотворный день для того, чтобы разобраться с накопившимися делами.»] second = [«Но помните, что даже в этом случае нужно не забывать про»,»Если поедете за город, заранее подумайте про»,»Те, кто сегодня нацелен выполнить множество дел, должны помнить про»,»Если у вас упадок сил, обратите внимание на»,»Помните, что мысли материальны, а значит вам в течение дня нужно постоянно думать про»] second_add = [«отношения с друзьями и близкими.»,»работу и деловые вопросы, которые могут так некстати помешать планам.»,»себя и своё здоровье, иначе к вечеру возможен полный раздрай.»,»бытовые вопросы — особенно те, которые вы не доделали вчера.»,»отдых, чтобы не превратить себя в загнанную лошадь в конце месяца.»] third = [«Злые языки могут говорить вам обратное, но сегодня их слушать не нужно.»,»Знайте, что успех благоволит только настойчивым, поэтому посвятите этот день воспитанию духа.»,»Даже если вы не сможете уменьшить влияние ретроградного Меркурия, то хотя бы доведите дела до конца.»,»Не нужно бояться одиноких встреч — сегодня то самое время, когда они значат многое.»,»Если встретите незнакомца на пути — проявите участие, и тогда эта встреча посулит вам приятные хлопоты.»] # выводим знаки зодиака print(«1 — Овен») print(«2 — Телец») print(«3 — Близнецы») print(«4 — Рак») print(«5 — Лев») print(«6 — Дева») print(«7 — Весы») print(«8 — Скорпион») print(«9 — Стрелец») print(«10 — Козерог») print(«11 — Водолей») print(«12 — Рыбы») # Спрашиваем у пользователя про его знак zodiac = int(input(«Введите число с номером знака зодиака: «.format(blue=»33[96m», endcolor=»33[0m»))) # Если число введено верно — выдаём гороскоп if 0 < zodiac < 13: print(random.choice(first), random.choice(second), random.choice(second_add), random.choice(third)) else: print(«Вы ошиблись с числом, запустите программу ещё раз»)

Теперь научим бота реагировать на слово «Привет». Для этого добавим после строчек с импортом новый метод и сразу пропишем в нём реакцию на нужное слово. Если не знаете, что такое метод и зачем он нужен, — читайте статью про ООП.

Читайте также:  Как получить нить из шерсти в minecraft

И последнее, что нам осталось сделать до запуска, — добавить после метода такую строчку:

Она скажет программе, чтобы она непрерывно спрашивала у бота, не пришли ли ему какие-то новые сообщения. Запускаем программу и проверяем, как работает наш бот.

Добавляем кнопки

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

Добавляем код с кнопками в раздел, который реагирует на «Привет»:

# Готовим кнопки keyboard = types.InlineKeyboardMarkup() # По очереди готовим текст и обработчик для каждого знака зодиака key_oven = types.InlineKeyboardButton(text=’Овен’, callback_data=’zodiac’) # И добавляем кнопку на экран keyboard.add(key_oven) key_telec = types.InlineKeyboardButton(text=’Телец’, callback_data=’zodiac’) keyboard.add(key_telec) key_bliznecy = types.InlineKeyboardButton(text=’Близнецы’, callback_data=’zodiac’) keyboard.add(key_bliznecy) key_rak = types.InlineKeyboardButton(text=’Рак’, callback_data=’zodiac’) keyboard.add(key_rak) key_lev = types.InlineKeyboardButton(text=’Лев’, callback_data=’zodiac’) keyboard.add(key_lev) key_deva = types.InlineKeyboardButton(text=’Дева’, callback_data=’zodiac’) keyboard.add(key_deva) key_vesy = types.InlineKeyboardButton(text=’Весы’, callback_data=’zodiac’) keyboard.add(key_vesy) key_scorpion = types.InlineKeyboardButton(text=’Скорпион’, callback_data=’zodiac’) keyboard.add(key_scorpion) key_strelec = types.InlineKeyboardButton(text=’Стрелец’, callback_data=’zodiac’) keyboard.add(key_strelec) key_kozerog = types.InlineKeyboardButton(text=’Козерог’, callback_data=’zodiac’) keyboard.add(key_kozerog) key_vodoley = types.InlineKeyboardButton(text=’Водолей’, callback_data=’zodiac’) keyboard.add(key_vodoley) key_ryby = types.InlineKeyboardButton(text=’Рыбы’, callback_data=’zodiac’) keyboard.add(key_ryby) # Показываем все кнопки сразу и пишем сообщение о выборе bot.send_message(message.from_user.id, text=’Выбери свой знак зодиака’, reply_markup=keyboard)

Добавляем обработчик кнопок

Скорее всего, вы заметили, что в каждой кнопке у нас написано callback_data=’zodiac’ . Это значит, что при нажатии на любую кнопку у нас будет вызываться один и тот же метод, который отвечает за гороскоп. Если вы хотите сделать честный гороскоп, придётся в каждой кнопке прописать своё название обработчика, а потом задать его поведение, тоже для каждой кнопки.

Давайте сделаем обработчик кнопок, который будет реагировать на ‘zodiac’ и выдавать случайный текст, как в исходной программе. Для этого добавим новый метод в программу:

Убираем лишнее

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

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

Что дальше

Впереди — безграничные возможности:

  • можно сделать индивидуальный гороскоп для каждого знака;
  • научить бота новым командам;
  • присылать свежий гороскоп каждое утро;
  • наладить непрерывную работу на веб-сервере.

Напишите в комментариях, что бы вы хотели от такого бота? Что должен уметь идеальный бот с гороскопом?

Источник: thecode.media

Telegram Bot на Python 3

В данной статье мы напишем telegram bot на python, который сможет отвечать на наши сообщения, взаимодействовать с нами, предлагая варианты ответов в виде кнопок и обрабатывать выбранный нами результат, выполняя команды на сервере. Взаимодействовать с Telegram Bot Api мы будем с помощью библиотеки pyTelegramBotAPI (telebot) написанной на Python.

  1. Создание бота
  2. Установка Python и библиотеки pyTelegramBotAPI
  3. Пишем Telegram Bot на Python
  4. Использование прокси в telebot
  5. Ответы бота на сообщения пользователя
  6. Клавиатура в Telegram Bot API
  7. InLine клавиатура
  8. Конечный листинг

Создание бота

Для регистрации нового бота необходимо обратиться к боту BotFather. Для этого в строке поиска наберите BotFather и в показанных результатах найдите интересующего нас бота:

Telegram BotFather

Обратите внимание на его имя, изображение и знак в виде галочки, говорящий о том, что это действительно отец всех ботов.

Выберите его и в диалоговом окне напишите команду /start и бот в ответном сообщение пришлет список всех доступных команд:

telegram botfather start

Нас интересует создание нового бота, поэтому выбираем команду /newbot. Команду можно как напечатать самостоятельно, так и выбрать мышью в сообщении и она автоматически отправится:

telegram newbot

Первым шагом нам предлагают дать имя новому боту, оно может быть произвольным. Мы назовем его PocketAdmin:

telegram name bot

Теперь требуется указать идентификатор бота (username), он должен заканчиваться на _bot и быть уникальным в системе. Мы укажем PocketAdminTech_bot:

telegram token bot

На этом создание бота завершено. В последнем сообщении нам пришла ссылка на нашего нового бота t.me/PocketAdminTech_bot и токен (закрашен), необходимый для взаимодействия с API.

Обязательно сохраните токен и храните его в тайне!

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

Скачать Python можно с официального сайта (как установить пакет на Centos 8 можно ознакомиться в данной заметке) и мы не будем заострять внимание на данном вопросе.

Чтобы установить пакет pyTelegramBotAPI воспользуемся pip:

pip install pytelegrambotapi

На этом подготовительная работа завершена, приступаем непосредственно к написанию нашего бота.

Пишем Telegram Bot на Python

Так как наш бот создается в ознакомительных целях и не будет содержать много кода, то писать я его буду сразу на сервере с установленной Centos 8 используя обычный редактор nano. Создадим файл bot.py, открыв его nano:

nano bot.py

Для начала импортируем библиотеку pyTelegramBotAPI:

import telebot

Затем зададим переменную token равную нашему токену, который мы получили от BotFather для взаимодействия с Telegram Bot Api:

token = ‘ваш token api’
bot = telebot.TeleBot(token)

Далее задается декоратор. Пока наш бот будет обрабатывать только команду start:

Читайте также:  Как сделать печку для руды в Майнкрафт

и в ответ писать нам “Привет!”:

def start_message(message): bot.send_message(message.chat.id, ‘Привет!’)

Чтобы бот постоянно ожидал запрос от пользователя в конце пропишем:

bot.polling()

В итоге мы получим код:

python bot.py

Затем откроем нашего бота (можно найти по имени) и напишем ему команду /start:

telegram bot api start

Поздравлю с первыми словами нашего бота PocketAdmin!

Использование прокси в telebot

При запуске скрипта может появиться ошибка следующего вида:

requests.exceptions.ConnectionError: (‘Connection aborted.’, ConnectionResetError(104, ‘Connection reset by peer’))

Чтобы исправить её, можно попробовать подключиться через прокси:

Если при использовании прокси возникают ошибки, подобные: Not supported proxy scheme socks5 или Missing dependencies for SOCKS support, то необходимо установить модули:

pip install requests[socks] PySocks

Ответы бота на сообщения пользователя

Аналогично хэндлерам для команд, в telegram bot api есть возможность обрабатывать сообщения от пользователя. Для этого используется тип text. Например, мы можем запрограммировать бота отвечать на определенные фразы или слова пользователя:

Думаю тут все понятно. На слово “Привет” бот будет отвечать “Ещё раз привет!”, а на “Пока” – “Пока!”. Весь код нашего telegram bot на python теперь будет выглядеть следующим образом:

Перезапустим скрипт и пообщаемся с ботом:

telegram bot диалог

Таким образом мы можем описывать различные диалоги с ботом.

Клавиатура в Telegram Bot на Python

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

Добавим в обработчик команды /start клавиатуру с кнопками “Привет “и “Пока”:

И запустим измененный скрипт. Как только мы отправим боту команду /start у нас внизу появится наша клавиатура:

telegram bot api keyboard

Теперь для отправки сообщений достаточно лишь нажать на соответствующую кнопку. Это очень удобно в мобильной версии телеграма.

InLine клавиатура

На мой взгляд, наиболее интересной является InLine клавиатура. Она позволяет вместе с сообщением отправлять пользователю интерактивные кнопки, например с вариантами ответов, а после их нажатия обрабатывать результат.

Давайте добавим простой вопрос от бота на команду /test:

Переменная markup объявляет новую переменную с inline keyboard, а markup.add – создает отдельную кнопку. Основные параметры при создании кнопки – text и callback_data: первый отвечает за текст на кнопке, второй – данные, которые будут переданы боту при выборе пользователем определенного варианта ответа.

Запустим скрипт и напишем /test:

telegram bot api inline keyboard

Отлично, бот прислал нам варианты ответов. Но при нажатии на кнопку ничего не произойдет, т.к. мы не описали обработку результатов. Исправим это:

bot.answer_callback_quer – это всплывающее окно, которое будет показано пользователю после нажатия кнопки. А в call.data будет передано значение, которое мы указывали при создании клавиатуры в параметре callback_data. Ответим боту, выбрав один из ответов:

telegram bot api inline keyboard answer

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

bot.edit_message_reply_markup(call.message.chat.id, call.message.message_id)

Это функция редактирования клавиатуры, вызванная без указания объекта клавиатуры. Теперь после ответа пользователя клавиатура будет убрана ботом:

telegram bot api remove inline keyboard

Конечный листинг телеграм бот на питоне

Мы рассмотрели лишь малую часть возможностей telegram bot api, однако, это очень полезные инструменты по работе с ним. В конце приведем полный листинг получившегося у нас telegram bot на python:

Источник: pocketadmin.tech

Как создать простого командного бота в Python

Как создать простого командного бота в Python

Итак, как часто вы узнаете погоду или время у Siri, Алисы или Google? Сейчас на рынке существует несколько видов ботов. Некоторые из них более сложные, способные поддерживать непрерывный диалог, а другие просто выполняют различные предварительно запрограммированные действия.

Skillfactory.ru

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

Итак, создаем набор данных, но сначала определим некоторые понятия.

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

Например, функция приветствия:

intents: — tag: greeting patterns: — Hi (Привет) — How are you (Как вы) — Is anyone there? (Тут кто-нибудь есть?) — Hey (Эй) — Hola (Привет) — Hello (Здравствуй) responses: — Hi (Привет) — Holi (Привет) — Hello, thanks for asking (Привет, спасибо за вопрос) — Good to see you again (Рад снова вас видеть) — Hi there, how can I help? (Привет, чем я могу помочь?) — tag: goodbye patterns: — Bye (Пока) — See you later (Увидимся) — Goodbye (До свидания) — Nice chatting to you, bye (Было приятно пообщаться, пока) — Till next time (До встречи) responses: — See you! (Увидимся!) — Have a nice day (Хорошего дня) — Bye! Come back again soon. (Пока! Приходите еще)

Читайте также:  Где найти красную руду в Майнкрафте

Итак, нам потребуется:

  1. yml-файл со всеми функциями, которые должен выполнять готовый бот. Если вы не знаете, что такое yml-файл, то пройдите по этой ссылке.
  2. Python 3 либо версии выше.
  3. Библиотеки TensorFlow, pickle и nltk.

Разделим все на 3 главные части или класса: считыватель функций бота, модель бота и загрузчик бота. Вот какие данные необходимо будет импортировать:

import os import re import yaml import nltk import random import json import numpy as np import tensorflow as tf import pickle from tensorflow.keras.models import load_model from tensorflow.keras.layers import ( Dense, Activation, Dropout ) from nltk.stem import WordNetLemmatizer from tensorflow.keras.optimizers import SGD

Считыватель функций бота

Этот класс предназначен для чтения yml-файла с функциями. Для данной модели бота понадобится 4 выхода: лемматизатор, слова, классы и функции.

Бот, которого мы создаем, — простой классификатор. В нем каждый тег является классом, а токенизированные и лемматизированные слова — вводимыми данными.

Наконец, необходимо узнать, какую из всех команд или действий должен выполнить бот. Итак, классы — это теги. Затем нужны токенизированные и приведенные к начальной форме слова. Для этого понадобится лемматизатор и токенизатор слов — они есть в библиотеке nltk. Сначала создаем имя класса BotIntentsReader .

Мы добавили дополнительный вывод под названием documents , который представляет собой только объединение токенизированных слов (до лемматизации) и тегов. Эта переменная будет повторяться для обучения модели.

Модель бота

Вводимыми данными для модели бота будет список токенизированных слов для шаблона. Мы лемматизируем каждое слово, чтобы привести его к начальной форме и составить список связанных с ним слов. Затем создадим массив из слов с обозначением 1, если в текущем шаблоне найдено либо не найдено совпадение между словами. Для вывода создадим двоичную матрицу для репрезентации каждого тега. Все это сделаем с помощью алгоритма order_data (внутри класса BotModelCreator ), который будет выполняться в рамках инициализации (при создании класса).

Вторая и самая интересная часть — это построение модели. На входе модели бота будет список слов. В случае приветствия функция будет равна 23 (всего разных слов). Затем — вывод возможных тегов (в данном случае 2), которые были заданы.

Для этой модели мы будем использовать простую нейронную сеть, но вы можете попробовать более продвинутую или сеть с другой архитектурой по вашему выбору. Архитектура представляет собой два плотных слоя 32 и 16 с функцией активации RELU и выдачей 0,5.

Skillfactory.ru

Теперь, когда у нас есть все — от последовательности ввода до алгоритмов обучения, остается только натренировать бота. Сначала нужно загрузить все модели и создать данные для бота, а затем и саму модель. Можно оставить сообщение по умолчанию равным 0 (если вы хотите регистрировать в логе информацию об обучении, измените его на 1 или 2).

Теперь нам нужно сохранить все файлы модели, которые необходимы для использования бота.

bot_data = BotIntentsReader(«intents.yml») bot_model = BotModelCreator( bot_data=bot_data, ) bot_model.train_model() bot_model.save_models()

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

Также нужен метод, который использует для ввода текст и возвращает ответ от бота. Можно добавить и защиту от незнакомых команд: если пользователь отправит предложение, в котором нет нужного слова из созданного выше списка слов, бот ответит: «Я вас не понимаю, пожалуйста, повторите».

class BotLoader(): def __init__(self, bot_model, threshold=0.25): self.threshold = threshold if type(bot_model)==dict: self.lemmatizer = pickle.load(open(bot_model[«lemmatizer»], ‘rb’)) self.model = load_model(bot_model[‘model’]) self.intents = json.loads(open(bot_model[‘intents’]).read()) self.words = pickle.load(open(bot_model[‘words’],’rb’)) self.classes = pickle.load(open(bot_model[‘classes’],’rb’)) else: self.model = bot_model.model self.intents = bot_model.intents self.words = bot_model.words self.classes = bot_model.classes self.lemmatizer = bot_model.lemmatizer def clean_up_sentence(self, sentence): sentence_words = nltk.word_tokenize(sentence) sentence_words = [self.lemmatizer(word.lower()) for word in sentence_words] return sentence_words def bow(self, sentence): sentence_words = self.clean_up_sentence(sentence) bag = [0]*len(self.words) for s in sentence_words: for i, w in enumerate(self.words): if w == s: bag[i] = 1 return (np.array(bag)) def predict_class(self, sentence): tokens = self.bow(sentence) if tokens.sum() > 0: predictions = self.model.predict(np.array([tokens]))[0] results = [[i, r] for i, r in enumerate(predictions) if r > self.threshold] results.sort(key=lambda x: x[1], reverse=True) return_list = [] for result in results: return_list.append( ) else: return_list = None return return_list def getResponse(self, ints): tag = ints[0][‘intent’] for i in self.intents: if(i[‘tag’]== tag): result = random.choice(i[‘responses’]) break return result def chatbot_response(self, msg): ints = self.predict_class(msg) if ints is not None: res = self.getResponse(ints) else: res = «I don’t understand you, can you repeat» return res

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

  • 22 сниппета на Python для повседневных задач
  • Как скрывают секретные ключи и пароли в Python
  • Создаем собственную Alexa в 20 строках Python

Источник: nuancesprog.ru