Бот органайзер в Телеграмме написать код

Пошаговое руководство написания чат-бота на языке Python.

  • Установим Python и библиотеки;
  • Получим вопросы и ответы из БД PostgreSQL;
  • Подключим морфологию;
  • Подключим чат-бот к каналу Telegram.

Colaboratory от Google

Изучение Python можно начать используя сервис Colaboratory от Google, или просто Colab. Сервис позволяет писать и выполнять код Python в браузере, не требуя собственного сервера.

Пример кода. Вопросы и ответы для чат-бота подгрузим с https://drive.google.com из текстового файла

# Однократно после запуска виртуальной машины устанавливаем библиотеки pymorphy2 и numpy !pip install pymorphy2 numpy # —————————- # подключим библиотеки import csv import pymorphy2 import re morph = pymorphy2.MorphAnalyzer(lang=’ru’) # Массив вопросов questions=[] # Массив ответов answer=[] # Подключаем файл с Google диска, содержащий вопросы/ответы # Есть ли жизнь на марсе;Есть with open(«/content/drive/MyDrive/robo-bot/question.txt», «r») as f_obj: reader = csv.reader(f_obj) for row in reader: r=s.split(‘;’) questions.append(r[0]) answer.append(r[1]) # выведем список вопросов и ответов print (questions) print (answer)

Запуск в Production

Наигравшись с кодом в Colaboratory и освоив Python развернем систему на боевом сервере Debian

Пишем TELEGRAM бота на Python

Установим Python и PIP (установщик пакетов).

Так как Debian не самый новый, устанавливается версия 3.5

aptitude install python3 python3-pip # обновим пакеты если они были установлены ранее pip3 install —upgrade setuptools pip

Установим необходимые пакеты Python

# Из за устаревшей версии Debian установить psycopg2 не удалось, поставлен скомпилированный psycopg2-binary # Библиотека psycopg2 нужна для подключения к базе данных PostgreSQL # pip3 install psycopg2 pip3 install psycopg2-binary scikit-learn numpy pymorphy2

Пишем код в файле Chat_bot.py

# Импортируем библиотеки import pymorphy2 import re import psycopg2 import sklearn import numpy as np # Подключаемся к PostgreSQL conn = psycopg2.connect(dbname=’energy’, user=’mao’, password=’darin’, host=’localhost’) cursor = conn.cursor() # Настраиваем язык для библиотеки морфологии morph = pymorphy2.MorphAnalyzer(lang=’ru’) # объявляем массив кодов ответов и ответов answer_id=[] answer = dict() # получаем из PostgreSQL список ответов и проиндексируем их. # Работая с PostgreSQL обращаемся к схеме app, в которой находятся таблицы с данными cursor.execute(‘SELECT id, answer FROM app.chats_answer;’) records = cursor.fetchall() for row in records: answer[row[0]]=row[1]

Структура таблицы ответов chats_answer, формат SQL

CREATE TABLE app.chats_answer ( id SERIAL, answer VARCHAR(512), CONSTRAINT chats_answer_pkey PRIMARY KEY(id) ) WITH (oids = false); ALTER TABLE app.chats_answer OWNER TO mao;

Да, я готов об этом поговорить

Я тоже хочу спать

Продолжаем код в файле Chat_bot.py

# объявляем массив вопросов questions=[] # загрузим вопросы и коды ответов cursor.execute(‘SELECT question, answer_id FROM app.chats_question;’) records = cursor.fetchall() # посчитаем количество вопросов transform=0 for row in records: # Если текст вопроса не пустой if row[0]>»»: # Если в БД есть код ответа на вопрос if row[1]>0: phrases=row[0] # разбираем вопрос на слова words=phrases.split(‘ ‘) phrase=»» for word in words: # каждое слово из вопроса приводим в нормальную словоформу word = morph.parse(word)[0].normal_form # составляем фразу из нормализованных слов phrase = phrase + word + » » # Если длинна полученной фразы больше 0 добавляем ей в массив вопросов и массив кодов ответов if (len(phrase)>0): questions.append(phrase.strip()) answer_id.append(row[1]) transform=transform+1 # выведем на экран вопросы, ответы и коды ответов print (questions) print (answer) print (answer_id) # Закроем подключение к PostgreSQL cursor.close() conn.close()

Векторизация и трансформация

# Векторизируем вопросы в огромную матрицу # Перемножив фразы на слова из которых они состоят получим числовые значения from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.decomposition import TruncatedSVD vectorizer_q = TfidfVectorizer() vectorizer_q.fit(questions) matrix_big_q = vectorizer_q.transform(questions) print («Размер матрицы: «) print (matrix_big_q.shape) # Трансформируем матрицу вопросов в меньший размер для уменьшения объема данных # Трансформировать будем в 200 мерное пространство, если вопросов больше 200 # Размерность подбирается индивидуально в зависимости от базы вопросов, которая может содержать 1 млн. или 1к вопросов и 1 # Без трансформации большая матрицу будет приводить к потерям памяти и снижению производительности if transform>200: transform=200 svd_q = TruncatedSVD(n_components=transform) svd_q.fit(matrix_big_q) # получим трансформированную матрицу matrix_small_q = svd_q.transform(matrix_big_q) print («Коэффициент уменьшения матрицы: «) print ( svd_q.explained_variance_ratio_.sum())

Функция поиска ответа

Еще по теме:  Восстановить переписку в Телеграмме если другой пользователь удалил

# Тело программы поиска ответов from sklearn.neighbors import BallTree from sklearn.base import BaseEstimator def softmax(x): #создание вероятностного распределения proba = np.exp(-x) return proba / sum(proba) class NeighborSampler(BaseEstimator): def __init__(self, k=5, temperature=10.0): self.k=k self.temperature = temperature def fit(self, X, y): self.tree_ = BallTree(X) self.y_ = np.array(y) def predict(self, X, random_state=None): distances, indices = self.tree_.query(X, return_distance=True, k=self.k) result = [] for distance, index in zip(distances, indices): result.append(np.random.choice(index, p=softmax(distance * self.temperature))) return self.y_[result] from sklearn.pipeline import make_pipeline ns_q = NeighborSampler() # answer_id — код ответа в массиве, который получается при поиске ближайшего ответа ns_q.fit(matrix_small_q, answer_id) pipe_q = make_pipeline(vectorizer_q, svd_q, ns_q)

Проверка из консоли

# код для проверки работы из консоли print(«Пишите ваш вопрос, слова exit или выход для выхода») request=»» while request not in [‘exit’, ‘выход’]: # получим текст от ввода request=input() # разберем фразу на слова words= re.split(‘W’,request) phrase=»» for word in words: word = morph.parse(word)[0].normal_form # морфируем слово вопроса в нормальную словоформу # Нормализуем словоформу каждого слова и соберем обратно фразу phrase = phrase + word + » » # запустим функцию и получим код ответа reply_id = int(pipe_q.predict([phrase.strip()])) # выведем текст ответа print (answer[reply_id])

Запустим и проверим

python3 Chat_bot.py

Подключим Telegram

# установим не самую последнюю версию для валидности дальнейшего кода #pip3 install PyTelegramBotAPI pip3 install PyTelegramBotAPI==3.6.7

Все просто, зарегистрируем нового бота и получим token.

В целом все готово. Вопросы в базу данных добавляются автоматически от службы тех. поддержки. Остаётся маркетологу в админ панели на YII назначать ответы вопросам. Раз в сутки cron перезапускает скрипт чат-бота, новые фразы поступают в работу.

Весь код чат бота

В теле программы есть переменные k=5 и temperature=10.0. Их можно менять, что будет влиять на поиск, делая его более мягким или более жестким.

P.S. Умышленно привожу весь код для практики. Теорию машинного обучения с картинками можно почитать, например, в другой статье.

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

Как написать чат — бота для telegram на с++?

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

Шаг 1. Получение токена Telegram

Для получения API Key необходимо:

После получения API Key для вашего чат-бота, вам нужно создать приложение, которое может использовать Telegram API.

Шаг 2. Установка библиотеки Telegram Bot API

Для работы с Telegram API в С++ есть несколько библиотек, однако наиболее популярной является библиотека Telegram Bot API. Она обеспечивает достаточный охват функций для создания и управления чат-ботами.

Чтобы установить библиотеку Telegram Bot API, вам нужно:

1. Скачайте и установите библиотеку на свой компьютер. Библиотека предоставляет файлы для работы с Telegram API в С++.
2. Подключите библиотеку к своему проекту в своей среде разработки. Для этого в Visual Studio, например, нужно нажать правой кнопкой мыши на проекте в Solution Explorer и открыть свойства проекта. Затем вы должны добавить путь к файлам библиотеки в ваш проект.

Шаг 3. Создание класса, управляющего чат-ботом

Чтобы создать объект, который может управлять вашим чат-ботом, вам нужно написать код, который использует библиотеку Telegram Bot API.

Ниже приведен пример кода, который может стартовать бота и отправлять ему сообщения:

#include #include #include using namespace std; int main() < TgBot::Bot bot(«API Key Here»); // Подставьте свой ключ API bot.getApi().deleteWebhook(); TgBot::Message::Ptr message; int update_id = 0; while (true) < vectorgt updates = bot.getApi().getUpdates(update_id); for (const auto if (update.message) < message = update.message; cout lt «Message from » lt message-gtfirstNamelt «: » lt message-lt bot.getApi().sendMessage(message-gtid, «I’m here to help!»); >update_id = update.updateId + 1; > > return 0; >

Это базовый код, который стартует бота и отправляет сообщения в ответ на полученные.

Шаг 4. Создание основных функций

Чтобы разработать более сложного чат-бота, вам нужно создать функции, которые могут обрабатывать различные типы сообщений и задач.

Примеры функций могут включать:

void handleCommand(const TgBot::Message::Ptr // Обработчик команд if (message-/start») < bot.getApi().sendMessage(message-gtid, «Hello, welcome!»); >else if (message-/help») < bot.getApi().sendMessage(message-gtid, «How can I help you today?»); >else < string response = «Sorry, I don’t understand that command.»; bot.getApi().sendMessage(message-gtid, response); >> void handleText(const TgBot::Message::Ptr // Обработчик текстовых сообщений if (message-Hi») < bot.getApi().sendMessage(message-gtid, «Hello there!»); >else if (message-What’s up?») < bot.getApi().sendMessage(message-gtid, «Not much, how about you?»); >else < string response = «Sorry, I don’t understand that message.»; bot.getApi().sendMessage(message-gtid, response); >> void handlePhoto(const TgBot::Message::Ptr // Обработчик фотографий bot.getApi().sendMessage(message-gtid, «Nice photo!»); >void handleLocation(const TgBot::Message::Ptr // Обработчик местоположения bot.getApi().sendMessage(message-gtid, «You’re at » + to_string(message-gtlatitude) + «, » + to_string(message-gtlongitude)); >

Еще по теме:  Как можно восстановить свой ТГ канал на Новую стрвницу Телеграмма

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

Шаг 5. Обработка входящих сообщений

Для того, чтобы обрабатывать все входящие сообщения от пользователей, вам нужно переопределить метод бота getUpdates, который используется для получения всех доступных обновлений из Telegram API.

В приведенном ниже коде мы вызываем свои функции для обработки входящих сообщений:

while (true) < vectorgt updates = bot.getApi().getUpdates(update_id); for (const auto if (update.message) < message = update.message; if (message-gt 0) < handleText(message); >else if (message-gt 0) < handlePhoto(message); >else if (message- handleLocation(message); >else if (message-gt 0 amp message-gttype == TgBot::MessageEntity::Type::BotCommand) < handleCommand(message); >else < string response = «Sorry, I don’t understand that message.»; bot.getApi().sendMessage(message-gtid, response); >> update_id = update.updateId + 1; > >

Этот код обрабатывает все доступные входящие сообщения и вызывает соответствующие функции, которые мы создали ранее.

Шаг 6. Деплоймент на сервер

Для работы чат-бота на постоянной основе, вы должны задеплоить ваш код на сервер. Наиболее популярными платформами для деплоя являются Heroku или AWS.

Шаг 7. Тестирование бота

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

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

Источник: qaa-engineer.ru

Склад мемов или Бот для Telegram — Часть 1

В этой статье для новичков, я покажу вам, как легко и просто создать своего бота для Telegram. Писать будем на языке C#. Бот будет коллекционировать картинки, и выдавать их по первому требованию пользователя. Мой вариант бота будет хранить картинки мемов и название у него будет соответствующее.

Кому стало интересно, прошу пожаловать под кат.

Рождение бота

Запускаем мессенджер Telegram и в поисковую строку вводим «botfather». В переводе с английского «отец ботов».

Нажимаем кнопку Start. Отец ботов сразу вывел список доступных команд.

Нам нужна команда для создания бота «/newbot».

Отец ботов просит придумать прозвище для нового бота. Я назову его «Склад мемов».

Теперь нужно придумать его username. Оно обязательно должно оканчиваться, словом bot. Username я придумал заранее, перебрав до этого сотни комбинаций.

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

Установим аватарку для бота командой «/setuserpic».

Командой «/setinline» зададим текст подсказки, которая появится, когда мы обратимся к боту в режиме inline.

А вот так будет выглядеть результат обращения в этом режиме:

Для удобства пользователя перечислим команды, которые бот будет понимать. Делается это через команду «/setcommands». Подсказка со списком команд будет появляться после ввода символа «/».

Вот так выглядят подсказки на практике:

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

Для работы с Telegram API нам нужна библиотека. Можно конечно пойти по хардкору и написать её самому, но мы же ведь идём по простому пути. В интернете есть несколько разновидностей таких библиотек для C#. Мой выбор пал на проект с названием «Telegram.Bot». На момент написания статьи, эта библиотека была самой популярной.

Что бы не заморачиваться с установкой, я воспользовался консолью диспетчера пакетов NuGet. С помощью этого диспетчера, можно с лёгкостью скачать и подключить к проекту большинство существующих библиотек. К тому же он докачает все необходимые зависимости. Обновление уже подключенной библиотеки происходит так же просто. Ммм… звучало как реклама…

Еще по теме:  Контент мейкер для Телеграмм

Команда установки библиотеки через консоль диспетчера пакетов NuGet:
Install-Package Telegram.Bot

Если вы никогда не пользовались консолью NuGet в Visual Studio, то открыть её очень просто.

Вводим команду и жмём Enter. Всё остальное NuGet сделает за вас.


Пишем код

Все условия созданы, приступаем к написанию кода. Переходим в класс «Program».
Объявим приватную статическую переменную только для чтения с типом TelegramBotClient и с именем bot.
Ей присвоим новый объект этого же типа. В аргументах конструктора нужно указать токен. Его нам выдал отец ботов при создании бота.

private static readonly TelegramBotClient bot = new TelegramBotClient(«»);

В точке входа в программу, вешаем на бота обработчик событий OnMessage.

bot.OnMessage += Bot_OnMessage;

Это событие возникает, когда пользователь что-то отправил боту. Будь это текст, изображение, файл и т.д. В обработчике обрабатываем полученное сообщение.

private static async void Bot_OnMessage(object sender, Telegram.Bot.Args.MessageEventArgs e) < Message msg = e.Message; if (msg == null) return; //. >

Если сообщение пустое, то выходим из метода. Введём условие срабатывающее, если сообщение содержит текст.

if (msg.Type == MessageType.TextMessage) < //. >

Бот будет отправлять сообщения асинхронно, т.е. отправка запроса, не будет замораживать текущий поток, а будет создавать новый. Иными словами, программа не будет виснуть. По этой причине, методу обработки события нужно присвоить модификатор async. А там где будет происходить вызов асинхронного метода, нужно будет вначале поставить ключевое слово await.

await bot.SendTextMessageAsync(msg.Chat.Id, «Hello, » + msg.From.FirstName + «!»);

Асинхронно отправляем текстовое сообщение пользователю. Первым аргументом метода указывается идентификатор чата адресата. Вторым – сам текст сообщения. Для проверки работы бота, мы написали свой HelloWorld с блекджеком и плюшками. Бот будет приветствовать пользователя, обращаясь к нему по имени.
Вот так выглядит код метода Bot_OnMessage:

private static async void Bot_OnMessage(object sender, Telegram.Bot.Args.MessageEventArgs e) < Message msg = e.Message; if (msg == null) return; // Если сообщение текстовое if (msg.Type == MessageType.TextMessage) < await bot.SendTextMessageAsync(msg.Chat.Id, «Hello, » + msg.From.FirstName + «!»); >>

Перед запуском нужно ещё написать пару строк кода в точке входа в программу.

. bot.SetWebhookAsync(); .

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

var me = bot.GetMeAsync().Result; Console.Title = me.Username;

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

bot.StartReceiving(); Console.ReadLine(); bot.StopReceiving();

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

Весь код класса Program
using System; using Telegram.Bot; using Telegram.Bot.Types; namespace TelegramBotYoutube < class Program < private static readonly TelegramBotClient bot = new TelegramBotClient(«»); static void Main(string[] args) < bot.OnMessage += Bot_OnMessage; bot.SetWebhookAsync(); var me = bot.GetMeAsync().Result; Console.Title = me.Username; bot.StartReceiving(); Console.ReadLine(); bot.StopReceiving(); >private static async void Bot_OnMessage(object sender, Telegram.Bot.Args.MessageEventArgs e) < Message msg = e.Message; if (msg == null) return; // Если сообщение текстовое if (msg.Type == MessageType.TextMessage) < await bot.SendTextMessageAsync(msg.Chat.Id, «Hello, » + msg.From.FirstName + «!»); >> > >

Первый запуск

Окно консоли сменило название на имя бота. Отлично. Теперь отправим боту сообщение через Telegram. Правда, сперва его нужно найти.

Нашёлся, нажимаем кнопку Start. И сразу же бот приветствует нас. Но мы же ничего не писали? Это не так. При нажатии кнопки старт, боту оправляется текст «/start». А на любое текстовое сообщение бот приветствует пользователя.

И это всё… что он пока умеет.
Спасибо за внимание! Конец первой части.

Для большей наглядности можно посмотреть видеоурок:

Источник: savepearlharbor.com

Рейтинг
( Пока оценок нет )
Загрузка ...