Ide bot telegram na R (akụkụ 4): Iwulite mkparịta ụka na-agbanwe agbanwe, ezi uche na bot

Ọ bụrụ na ị gụọla nke gara aga isiokwu atọ site na usoro isiokwu a, ị maralarị ka esi ede bots telegram zuru oke na keyboard.

N'isiokwu a, anyị ga-amụta otú e si ede bot nke ga-ejigide mkparịta ụka na-agbanwe agbanwe. Ndị ahụ. Bot ahụ ga-ajụ gị ajụjụ wee chere ka itinye ụfọdụ ozi. Dabere na data ị banyere, bot ga-eme ụfọdụ omume.

Ọzọkwa n'isiokwu a, anyị ga-amụta otú e si eji nchekwa data n'okpuru mkpuchi nke bot, na ihe atụ anyị ọ ga-abụ SQLite, ma ị nwere ike iji DBMS ọ bụla ọzọ. Edere m nkọwa nke ọma gbasara imekọrịta na ọdụ data dị n'asụsụ R n'ime isiokwu a.

Ide bot telegram na R (akụkụ 4): Iwulite mkparịta ụka na-agbanwe agbanwe, ezi uche na bot

Akụkọ niile sitere na usoro "Ide bot telegram na R"

  1. Anyị na-emepụta bot ma jiri ya zipu ozi na telegram
  2. Tinye nkwado iwu na nzacha ozi na bot
  3. Otu esi etinye nkwado ahụigodo na bot
  4. Iwulite mkparịta ụka na-agbanwe agbanwe, ezi uche na bot

Ihe

Ọ bụrụ na ị nwere mmasị na nyocha data, ị nwere ike ịmasị m telegram и youtube ọwa. A na-arara ọtụtụ ọdịnaya maka asụsụ R.

  1. Okwu Mmalite
  2. Bot-ewu usoro
  3. Bot oru ngo Ọdịdị
  4. Nhazi Bot
  5. Mepụta mgbanwe gburugburu ebe obibi
  6. Ịmepụta nchekwa data
  7. Ọrụ ide iji rụọ ọrụ na nchekwa data
  8. Ụzọ bot
  9. Ihe nzacha ozi
  10. Ndị njikwa
  11. Koodu mmalite bot
  12. nkwubi

Okwu Mmalite

Ka bot wee rịọ data n'aka gị wee chere ka ị tinye ozi ọ bụla, ị ga-achọ ịdekọ ọnọdụ mkparịta ụka ugbu a. Ụzọ kachasị mma isi mee nke a bụ iji ụfọdụ ụdị nchekwa data agbakwunyere, dị ka SQLite.

Ndị ahụ. The mgbagha ga-adị ka ndị a. Anyị na-akpọ usoro bot, bot na-arịọkwa anyị ozi ụfọdụ, na nzọụkwụ ọ bụla ọ na-eche ka abanye na ozi a ma nwee ike ịlele ya.

Anyị ga-ede bot kachasị mfe, nke mbụ ọ ga-ajụ maka aha gị, mgbe ahụ afọ gị, ma chekwaa data natara na nchekwa data. Mgbe ị na-arịọ maka afọ, ọ ga-elele na data etinyere bụ nọmba ọ bụghị ederede.

Mkparịta ụka dị mfe dị otú a ga-enwe naanị steeti atọ:

  1. mmalite bụ ọnọdụ nkịtị nke bot, nke ọ naghị atụ anya ozi ọ bụla n'aka gị
  2. wait_name - steeti nke bot na-eche ka abanye aha
  3. wait_age bụ steeti ebe bot na-echere ka abanye afọ gị, ọnụọgụ nke afọ zuru oke.

Bot-ewu usoro

N'oge akụkọ ahụ, anyị ga-ewu bot nzọụkwụ site na nzọụkwụ; enwere ike ịkọwa usoro ahụ dum dị ka ndị a:
Ide bot telegram na R (akụkụ 4): Iwulite mkparịta ụka na-agbanwe agbanwe, ezi uche na bot

  1. Anyị na-emepụta bot config nke anyị ga-echekwa ụfọdụ ntọala. N'ọnọdụ anyị, bot token, na ụzọ na faịlụ nchekwa data.
  2. Anyị na-emepụta mgbanwe gburugburu ebe obibi nke a ga-echekwa ụzọ ọrụ ahụ na bot.
  3. Anyị na-emepụta nchekwa data n'onwe ya, na ọtụtụ ọrụ ka bot wee nwee ike ịmekọrịta ya.
  4. Anyị na-ede ụzọ bot, i.e. ọrụ ọ ga-arụ.
  5. Na-agbakwụnye nzacha ozi. Site n'enyemaka nke bot ga-enweta ụzọ ndị dị mkpa, dabere na ọnọdụ nkata ugbu a.
  6. Anyị na-agbakwunye ndị njikwa ga-ejikọta iwu na ozi na ụzọ bot dị mkpa.
  7. Ka anyị malite bot.

Bot oru ngo Ọdịdị

Maka ịdị mma, anyị ga-ekewa koodu nke bot anyị, yana faịlụ ndị ọzọ metụtara, n'ime usoro a.

  • bot.R - koodu isi nke bot anyị
  • db_bot_ọrụ.R - ngọngọ koodu nwere ọrụ maka ịrụ ọrụ na nchekwa data
  • usoro bot.R - koodu nke ụzọ bot
  • ozi_filters.R - ozi nzacha
  • ndị njikwa.R - ndị njikwa
  • nhazi.cfg - bot config
  • mepụta_db_data.sql - SQL script maka ịmepụta tebụl nwere data nkata na nchekwa data
  • mepụta_db_state.sql - SQL script maka ịmepụta tebụl nke ọnọdụ nkata dị ugbu a na nchekwa data
  • bot.db - bot nchekwa data

Ị nwere ike ịlele ọrụ bot dum, ma ọ bụ скачать site na m ebe nchekwa na GitHub.

Nhazi Bot

Anyị ga-eji nke mbụ dị ka nhazi ini file, ụdị a:

[bot_settings]
bot_token=ТОКЕН_ВАШЕГО_БОТА

[db_settings]
db_path=C:/ПУТЬ/К/ПАПКЕ/ПРОЕКТА/bot.db

Na nhazi ahụ anyị na-ede akara bot na ụzọ na nchekwa data, i.e. na faịlụ bot.db; anyị ga-emepụta faịlụ ahụ n'onwe ya na nzọụkwụ ọzọ.

Maka bots ndị ọzọ dị mgbagwoju anya, ị nwere ike ịmepụta nhazi mgbagwoju anya, e wezụga, ọ dịghị mkpa ide ihe nhazi ini, ị nwere ike iji usoro ọ bụla ọzọ gụnyere JSON.

Mepụta mgbanwe gburugburu ebe obibi

Na PC ọ bụla, folda nwere ọrụ bot nwere ike ịdị na akwụkwọ ndekọ aha dị iche iche yana na draịva dị iche iche, yabụ na koodu ahụ, a ga-edobe ụzọ na folda ọrụ ahụ site na mgbanwe gburugburu ebe obibi. TG_BOT_PATH.

Enwere ụzọ dị iche iche iji mepụta mgbanwe gburugburu ebe obibi, nke kachasị mfe bụ ide ya na faịlụ .Renviron.

Ị nwere ike ịmepụta ma ọ bụ dezie faịlụ a site na iji iwu ahụ file.edit(path.expand(file.path("~", ".Renviron"))). Mezue ya ma tinye otu ahịrị na faịlụ:

TG_BOT_PATH=C:/ПУТЬ/К/ВАШЕМУ/ПРОЕКТУ

Ọzọ chekwaa faịlụ ahụ .Renviron ma malitegharịa RStudio.

Ịmepụta nchekwa data

Nzọụkwụ ọzọ bụ ịmepụta nchekwa data. Anyị ga-achọ 2 tables:

  • chat_data - data nke bot rịọrọ n'aka onye ọrụ
  • chat_state - ọnọdụ nkata niile ugbu a

Ị nwere ike ịmepụta tebụl ndị a site na iji ajụjụ SQL ndị a:

CREATE TABLE chat_data (
    chat_id BIGINT  PRIMARY KEY
                    UNIQUE,
    name    TEXT,
    age     INTEGER
);

CREATE TABLE chat_state (
    chat_id BIGINT PRIMARY KEY
                   UNIQUE,
    state   TEXT
);

Ọ bụrụ na ibudatara bot oru ngo si GitHub, wee mepụta nchekwa data ị nwere ike iji koodu na-esonụ na R.

# Скрипт создания базы данных
library(DBI)     # интерфейс для работы с СУБД
library(configr) # чтение конфига
library(readr)   # чтение текстовых SQL файлов
library(RSQLite) # драйвер для подключения к SQLite

# директория проекта
setwd(Sys.getenv('TG_BOT_PATH'))

# чтение конфига
cfg <- read.config('config.cfg')

# подключение к SQLite
con <- dbConnect(SQLite(), cfg$db_settings$db_path)

# Создание таблиц в базе
dbExecute(con, statement = read_file('create_db_data.sql'))
dbExecute(con, statement = read_file('create_db_state.sql'))

Ọrụ ide iji rụọ ọrụ na nchekwa data

Anyị enweelarị faịlụ nhazi dị njikere yana nchekwa data emepụtara. Ugbu a ịkwesịrị ide ọrụ iji gụọ na dee data na nchekwa data a.

Ọ bụrụ na ị budata oru ngo site na GitHub, mgbe ahụ ị nwere ike ịchọta ọrụ na faịlụ ahụ db_bot_ọrụ.R.

Koodu ọrụ maka ịrụ ọrụ na nchekwa data

# ###########################################################
# Function for work bot with database

# получить текущее состояние чата
get_state <- function(chat_id) {

  con <- dbConnect(SQLite(), cfg$db_settings$db_path)

  chat_state <- dbGetQuery(con, str_interp("SELECT state FROM chat_state WHERE chat_id == ${chat_id}"))$state

  return(unlist(chat_state))

  dbDisconnect(con)
}

# установить текущее состояние чата
set_state <- function(chat_id, state) {

  con <- dbConnect(SQLite(), cfg$db_settings$db_path)

  # upsert состояние чата
  dbExecute(con, 
            str_interp("
            INSERT INTO chat_state (chat_id, state)
                VALUES(${chat_id}, '${state}') 
                ON CONFLICT(chat_id) 
                DO UPDATE SET state='${state}';
            ")
  )

  dbDisconnect(con)

}

# запись полученных данных в базу
set_chat_data <- function(chat_id, field, value) {

  con <- dbConnect(SQLite(), cfg$db_settings$db_path)

  # upsert состояние чата
  dbExecute(con, 
            str_interp("
            INSERT INTO chat_data (chat_id, ${field})
                VALUES(${chat_id}, '${value}') 
                ON CONFLICT(chat_id) 
                DO UPDATE SET ${field}='${value}';
            ")
  )

  dbDisconnect(con)

}

# read chat data
get_chat_data <- function(chat_id, field) {

  con <- dbConnect(SQLite(), cfg$db_settings$db_path)

  # upsert состояние чата
  data <- dbGetQuery(con, 
                     str_interp("
            SELECT ${field}
            FROM chat_data
            WHERE chat_id = ${chat_id};
            ")
  )

  dbDisconnect(con)

  return(data[[field]])

}

Anyị mepụtara ọrụ 4 dị mfe:

  • get_state() - nweta ọnọdụ nkata dị ugbu a site na nchekwa data
  • set_state() - dee ọnọdụ nkata dị ugbu a na nchekwa data
  • get_chat_data() - nweta data nke onye ọrụ zitere
  • set_chat_data() - ndekọ data natara n'aka onye ọrụ

Ọrụ niile dị nnọọ mfe, ha na-agụ data sitere na nchekwa data site na iji iwu ahụ dbGetQuery(), ma ọ bụ mee UPSERT arụ ọrụ (ịgbanwe data dị ugbu a ma ọ bụ dee data ọhụrụ na nchekwa data), na-eji ọrụ ahụ dbExecute().

Okwu syntax maka ọrụ UPSERT bụ nke a:

INSERT INTO chat_data (chat_id, ${field})
VALUES(${chat_id}, '${value}') 
ON CONFLICT(chat_id) 
DO UPDATE SET ${field}='${value}';

Ndị ahụ. na tebụl anyị ubi nkata_id nwere ihe mgbochi pụrụ iche ma bụrụ isi igodo nke tebụl. Na mbụ, anyị na-agbalị itinye ozi na tebụl, anyị na-enwetakwa njehie ma ọ bụrụ na data maka nkata ugbu a dị ugbu a, na nke a, anyị na-emelite ozi maka nkata a.

Ọzọ, anyị ga-eji ọrụ ndị a na ụzọ bot na nzacha.

Ụzọ bot

Nzọụkwụ ọzọ iji wuo bot anyị bụ ịmepụta ụzọ. Ọ bụrụ na ị budata oru ngo site na GitHub, mgbe ahụ, usoro niile dị na faịlụ usoro bot.R.

Koodu usoro Bot

# ###########################################################
# bot methods

# start dialog
start <- function(bot, update) {

  # 

  # Send query
  bot$sendMessage(update$message$chat_id, 
                  text = "Введи своё имя")

  # переключаем состояние диалога в режим ожидания ввода имени
  set_state(chat_id = update$message$chat_id, state = 'wait_name')

}

# get current chat state
state <- function(bot, update) {

  chat_state <- get_state(update$message$chat_id)

  # Send state
  bot$sendMessage(update$message$chat_id, 
                  text = unlist(chat_state))

}

# reset dialog state
reset <- function(bot, update) {

  set_state(chat_id = update$message$chat_id, state = 'start')

}

# enter username
enter_name <- function(bot, update) {

  uname <- update$message$text

  # Send message with name
  bot$sendMessage(update$message$chat_id, 
                  text = paste0(uname, ", приятно познакомится, я бот!"))

  # Записываем имя в глобальную переменную
  #username <<- uname
  set_chat_data(update$message$chat_id, 'name', uname) 

  # Справшиваем возраст
  bot$sendMessage(update$message$chat_id, 
                  text = "Сколько тебе лет?")

  # Меняем состояние на ожидание ввода имени
  set_state(chat_id = update$message$chat_id, state = 'wait_age')

}

# enter user age
enter_age <- function(bot, update) {

  uage <- as.numeric(update$message$text)

  # проверяем было введено число или нет
  if ( is.na(uage) ) {

    # если введено не число то переспрашиваем возраст
    bot$sendMessage(update$message$chat_id, 
                    text = "Ты ввёл некорректные данные, введи число")

  } else {

    # если введено число сообщаем что возраст принят
    bot$sendMessage(update$message$chat_id, 
                    text = "ОК, возраст принят")

    # записываем глобальную переменную с возрастом
    #userage <<- uage
    set_chat_data(update$message$chat_id, 'age', uage) 

    # сообщаем какие данные были собраны
    username <- get_chat_data(update$message$chat_id, 'name')
    userage  <- get_chat_data(update$message$chat_id, 'age')

    bot$sendMessage(update$message$chat_id, 
                    text = paste0("Тебя зовут ", username, " и тебе ", userage, " лет. Будем знакомы"))

    # возвращаем диалог в исходное состояние
    set_state(chat_id = update$message$chat_id, state = 'start')
  }

}

Anyị mepụtara ụzọ 5:

  • malite - Malite mkparịta ụka
  • steeti - Nweta ọnọdụ nkata dị ugbu a
  • nrụpụta - Tọgharịa ọnọdụ nkata dị ugbu a
  • enter_name - Bot ahụ na-ajụ aha gị
  • enter_age - Bot ahụ na-ajụ afọ gị

.Zọ start na-arịọ aha gị, ma gbanwee ọnọdụ nkata ka ọ bụrụ aha nchere, i.e. ka nọrọ na njikere maka itinye aha gị.

Na-esote, ị na-eziga aha na-edozi ya site na usoro enter_name, bot na-ekele gị, dee aha nnata na nchekwa data, ma gbanwee nkata ahụ na steeti chere_afọ.

N'oge a, bot na-atụ anya ka ị banye afọ gị. Ị na-eziga afọ gị, bot na-enyocha ozi ahụ, ọ bụrụ na izipu ụfọdụ ederede kama nọmba, ọ ga-ekwu: Ты ввёл некорректные данные, введи число, ga-echere gị ka ịtinye data gị ọzọ. Ọ bụrụ na izipu nọmba, bot ga-akọ na ọ nabatara afọ gị, dee data enwetara na nchekwa data, kọọ data niile enwetara n'aka gị wee weghachi ọnọdụ nkata ahụ n'ọnọdụ mbụ ya, ya bụ. V start.

Site na ịkpọ usoro state ị nwere ike ịrịọ ọkwa nkata ugbu a n'oge ọ bụla, yana iji ya reset weghachi nkata ahụ na ọnọdụ izizi ya.

Ihe nzacha ozi

N'ọnọdụ anyị, nke a bụ otu n'ime akụkụ kachasị mkpa n'ịrụ bot. Ọ bụ site n'enyemaka nke nzacha ozi ka bot ga-aghọta ozi ọ na-atụ anya n'aka gị yana otu esi edozi ya.

Na oru ngo na GitHub edebanye aha nzacha na faịlụ ozi_filters.R.

Koodu nzacha ozi:

# ###########################################################
# message state filters

# фильтр сообщений в состоянии ожидания имени
MessageFilters$wait_name <- BaseFilter(function(message) {
  get_state( message$chat_id )  == "wait_name"
}
)

# фильтр сообщений в состоянии ожидания возраста
MessageFilters$wait_age <- BaseFilter(function(message) {
  get_state( message$chat_id )   == "wait_age"
}
)

Na nzacha anyị na-eji ọrụ edere na mbụ get_state(), iji rịọ ọnọdụ nkata ugbu a. Ọrụ a chọrọ naanị otu arụmụka, id nkata.

Na-esote nyo aha nchere na-ahazi ozi mgbe nkata dị na steeti wait_name, na ya mere nzacha chere_afọ na-ahazi ozi mgbe nkata dị na steeti wait_age.

Ndị njikwa

A na-akpọ faịlụ nwere ndị njikwa ndị njikwa.R, ma nwee koodu a:

# ###########################################################
# handlers

# command handlers
start_h <- CommandHandler('start', start)
state_h <- CommandHandler('state', state)
reset_h <- CommandHandler('reset', reset)

# message handlers
## !MessageFilters$command - означает что команды данные обработчики не обрабатывают, 
## только текстовые сообщения
wait_age_h  <- MessageHandler(enter_age,  MessageFilters$wait_age  & !MessageFilters$command)
wait_name_h <- MessageHandler(enter_name, MessageFilters$wait_name & !MessageFilters$command)

Nke mbụ anyị na-emepụta ndị na-ahụ maka iwu ga-enye gị ohere ịme usoro iji malite mkparịta ụka, tọgharịa ya, wee jụọ ọnọdụ dị ugbu a.

Na-esote, anyị na-emepụta ndị na-ahụ maka ozi 2 na-eji nzacha emepụtara na nzọụkwụ gara aga, ma tinye ha nzacha !MessageFilters$command, ka anyị nwee ike iji iwu na steeti nkata ọ bụla.

Koodu mmalite bot

Ugbu a, anyị nwere ihe niile dị njikere ịmalite, koodu bụ isi maka ịmalite bot dị na faịlụ ahụ bot.R.

library(telegram.bot)
library(tidyverse)
library(RSQLite)
library(DBI)
library(configr)

# переходим в папку проекта
setwd(Sys.getenv('TG_BOT_PATH'))

# читаем конфиг
cfg <- read.config('config.cfg')

# создаём экземпляр бота
updater <- Updater(cfg$bot_settings$bot_token)

# Загрузка компонентов бота
source('db_bot_function.R') # функции для работы с БД
source('bot_methods.R')     # методы бота
source('message_filters.R') # фильтры сообщений
source('handlers.R') # обработчики сообщений

# Добавляем обработчики в диспетчер
updater <- updater +
  start_h +
  wait_age_h +
  wait_name_h +
  state_h +
  reset_h

# Запускаем бота
updater$start_polling()

N'ihi ya, anyị nwetara bot a:
Ide bot telegram na R (akụkụ 4): Iwulite mkparịta ụka na-agbanwe agbanwe, ezi uche na bot

Mgbe ọ bụla na-eji iwu /state anyị nwere ike jụọ ọnọdụ nkata dị ugbu a, yana iji iwu ahụ /reset weghachi nkata ahụ na ọnọdụ izizi ya wee malite mkparịta ụka ahụ ọzọ.

nkwubi

N'isiokwu a, anyị achọpụtala otu esi eji nchekwa data n'ime bot, yana otu esi ewulite mkparịta ụka ezi uche dị n'usoro site na ịdekọ ọnọdụ nkata.

N'okwu a, anyị lere anya ihe atụ kachasị ochie, ka ọ dịrị gị mfe ịghọta echiche nke ịmepụta ụdị bots; na omume, ị nwere ike ịmepụta mkparịta ụka ndị dị mgbagwoju anya.

N'isiokwu na-esonụ n'usoro isiokwu a, anyị ga-amụta otú e si egbochi ikike ndị ọrụ bot iji ụzọ dị iche iche.

isi: www.habr.com

Tinye a comment