Tusia o se pusa telegram i le R (vaega 4): Fausia se talanoaga faifaipea, talafeagai ma le bot

Afai ua uma ona e faitauina muamua tolu mataupu mai lenei fa'asologa, ona e iloa lea pe fa'afefea ona tusi fa'ato'aga telegram bots ma se piano.

I lenei tusiga, o le a tatou aʻoaʻoina pe faʻapefea ona tusia se bot e faʻatumauina ai se talanoaga faifaipea. O na. O le a fesiligia oe e le bot ma faʻatali mo oe e te ulufale i nisi faʻamatalaga. Faʻalagolago i faʻamatalaga e te ulufale ai, o le a faia e le bot ni gaioiga.

I totonu foi o lenei tusiga o le a tatou aʻoaʻoina ai pe faʻapefea ona faʻaogaina se faʻamaumauga i lalo o le pulou o le bot, i la tatou faʻataʻitaʻiga o le SQLite, ae mafai ona e faʻaogaina soʻo se isi DBMS. Na ou tusia atili auiliiliga e uiga i le fegalegaleai ma database i le gagana R i lenei tusiga.

Tusia o se pusa telegram i le R (vaega 4): Fausia se talanoaga faifaipea, talafeagai ma le bot

O tala uma mai le faasologa " Tusia o se telegram bot i le R"

  1. Matou te fatuina se bot ma faʻaaogaina e lafo ai feʻau i le telegram
  2. Fa'aopoopoina le fa'atonuga lagolago ma fe'au filiga i le bot
  3. Faʻafefea ona faʻaopoopo le lagolago keyboard i se bot
  4. Fausia se talanoaga faifaipea, talafeagai ma le bot

Mataupu

Afai e te fiafia i suʻesuʻega faʻamatalaga, atonu e te fiafia i laʻu telefoni и YouTube alavai. O le tele o mea o lo'o tu'uina atu i le gagana R.

  1. Faatomuaga
  2. Fa'agasologa o le fausiaina o bot
  3. Fa'atonuga o galuega bot
  4. Bot config
  5. Fausia se fesuiaiga o le siosiomaga
  6. Fausia se fa'amaumauga
  7. O galuega tusitusi e galue ai ma le database
  8. Metotia bot
  9. Filifiliga savali
  10. Taulima
  11. Fa'ailoga fa'ailoga bot
  12. iʻuga

Faatomuaga

Ina ia mafai e le bot ona talosagaina faʻamatalaga mai ia te oe ma faʻatali mo oe e ulufale i soʻo se faʻamatalaga, e tatau ona e faʻamaumau le tulaga o loʻo i ai nei o le talanoaga. O le auala sili e fai ai lenei mea o le faʻaaogaina lea o se ituaiga o faʻamaumauga tuʻufaʻatasia, pei ole SQLite.

O na. O le a fa'apea. Matou te taʻua le auala bot, ma o le bot sequentially talosagaina ni faʻamatalaga mai ia i matou, ma i laasaga taʻitasi e faʻatali mo lenei faʻamatalaga e tuʻuina atu ma mafai ona siaki.

O le a matou tusia le bot sili ona faigofie, muamua o le a fesili mo lou igoa, sosoo ai ma lou matua, ma o le a faʻasaoina faʻamatalaga maua i le database. Pe a fesili mo le matua, o le a siaki o faʻamaumauga na tuʻuina atu o se numera ae le o tusitusiga.

O sea talanoaga faigofie o le a na o le tolu setete:

  1. amata o le tulaga masani o le bot, lea e le faʻamoemoeina se faʻamatalaga mai ia te oe
  2. wait_name - o lo'o fa'atali le bot mo se igoa e tu'uina
  3. wait_age o le setete o loʻo faʻatali ai le bot mo lou matua e ulufale, le numera o tausaga atoa.

Fa'agasologa o le fausiaina o bot

I le taimi o le tusiga, o le a matou fausia se bot i lea laasaga ma lea laasaga; o le faagasologa atoa e mafai ona faʻaalia i lalo:
Tusia o se pusa telegram i le R (vaega 4): Fausia se talanoaga faifaipea, talafeagai ma le bot

  1. Matou te fatuina se bot config lea o le a matou teuina ai ni faʻatulagaga. I la matou tulaga, o le bot token, ma le ala i le faila faila.
  2. Matou te fatuina se fesuiaiga o le siosiomaga lea e teu ai le ala i le poloketi ma le bot.
  3. Matou te fatuina le database lava ia, ma le tele o galuega ina ia mafai e le bot ona fegalegaleai ma ia.
  4. Matou te tusia metotia bot, i.e. galuega o le a ia faatinoina.
  5. Fa'aopoopoina o fe'au filiga. Faatasi ai ma le fesoasoani lea o le a maua ai e le bot auala talafeagai, e faʻatatau i le tulaga o loʻo i ai nei o le talatalanoaga.
  6. Matou te faʻaopoopoina tagata faʻapipiʻi o le a faʻafesoʻotaʻi tulafono ma feʻau faʻatasi ma auala talafeagai bot.
  7. Se'i tatou fa'alauiloa le bot.

Fa'atonuga o galuega bot

Mo le faʻafaigofie, matou te vaevaeina le code o la matou bot, ma isi faila e fesoʻotaʻi, i le fausaga o loʻo mulimuli mai.

  • bot.R - o le numera autu o la matou bot
  • db_bot_function.R - se poloka o code ma galuega tauave mo le galulue faatasi ma le database
  • bot_methods.R - code o metotia bot
  • message_filters.R — filiga savali
  • taulima.R - tagata fa'atau
  • config.cfg - bot config
  • create_db_data.sql - SQL script mo le fatuina o se laulau ma faʻamatalaga talatalanoa i totonu o faʻamaumauga
  • create_db_state.sql - SQL script mo le fatuina o se laulau o le tulaga o talatalanoaga o loʻo i ai nei i totonu o faʻamaumauga
  • bot.db - pusa fa'amaumauga

E mafai ona e vaʻai i le poloketi bot atoa, poʻo скачать mai lo'u fale teu oloa ile GitHub.

Bot config

O le a matou faʻaogaina le masani e fai ma config ini faila, le fomu nei:

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

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

I le config matou te tusia le faailoga bot ma le ala i le database, i.e. i le faila bot.db, matou te fatuina le faila lava ia i le isi laasaga.

Mo bots sili atu lavelave, e mafai ona e fatuina ni configs sili atu ona faigata, e le gata i lea, e le tatau ona tusia se ini config, e mafai ona e faʻaogaina soʻo se isi faatulagaga e aofia ai le JSON.

Fausia se fesuiaiga o le siosiomaga

I luga o PC taʻitasi, o le faila o loʻo i ai le poloketi bot e mafai ona tuʻuina i totonu o lisi eseese ma i luga o taʻavale eseese, o lea i totonu o le faʻailoga o le ala i le faila o le poloketi o le a seti e ala i se fesuiaiga o le siosiomaga. TG_BOT_PATH.

E tele auala e fatuina ai se fesuiaiga o le siosiomaga, o le sili ona faigofie o le tusia i totonu o se faila .Renviron.

E mafai ona e fatuina pe faʻasaʻo lenei faila e faʻaaoga ai le poloaiga file.edit(path.expand(file.path("~", ".Renviron"))). Faʻatino ma faʻaopoopo se laina se tasi i le faila:

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

Sosoo ai sefe le faila .Renviron ma toe amata le RStudio.

Fausia se fa'amaumauga

O le isi laasaga o le fatuina o se database. Matou te manaʻomia 2 laulau:

  • chat_data - faʻamatalaga na talosagaina e le bot mai le tagata faʻaoga
  • chat_state - tulaga oi ai nei o talatalanoaga uma

E mafai ona e fatuina nei laulau e faʻaaoga ai le fesili SQL nei:

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
);

Afai na e siiina mai le poloketi bot mai GitHub, ona fatuina lea o le database e mafai ona e faʻaogaina le code lea i le 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'))

O galuega tusitusi e galue ai ma le database

Ua uma ona matou saunia se faila faʻatulagaina ma faia se database. Ole taimi nei e mana'omia lou tusiaina o galuega e faitau ma tusi ai fa'amaumauga i lenei fa'amaumauga.

Afai na e siiina mai le poloketi mai GitHub, ona mafai lea ona e mauaina galuega i le faila db_bot_function.R.

Fuafuaga code mo le galulue faatasi ma le database

# ###########################################################
# 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]])

}

Na matou faia ni galuega faigofie se 4:

  • get_state() - maua le tulaga o talatalanoaga nei mai le database
  • set_state() — tusi le tulaga o talatalanoaga o loo i ai nei i le database
  • get_chat_data() - maua faʻamatalaga na lafoina e le tagata faʻaoga
  • set_chat_data() - fa'amaumauga fa'amaumauga maua mai le tagata fa'aoga

O galuega uma e fai si faigofie, latou te faitau faʻamaumauga mai le database e faʻaaoga ai le poloaiga dbGetQuery(), po o le tautino UPSERT fa'agaioiga (suia o fa'amaumauga o lo'o i ai po'o le tusiaina o fa'amatalaga fou i le fa'amaumauga), fa'aaoga le galuega dbExecute().

Ole syntax mo le fa'agaioiga UPSERT e fa'apea:

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

O na. i totonu o matou laulau fanua chat_id ei ai se fa'alavelave fa'apitoa ma o le ki autu o laulau. I le taimi muamua, matou te taumafai e faʻaopoopo faʻamatalaga i luga o le laulau, ma matou maua se mea sese pe a fai o faʻamatalaga mo le talatalanoaga o loʻo i ai nei, o le mea lea matou te faʻafouina le faʻamatalaga mo lenei talatalanoaga.

Le isi, o le a matou faʻaogaina nei galuega i auala ma filiga a le bot.

Metotia bot

O le isi laasaga i le fausiaina o la tatou bot o le fatuina lea o metotia. Afai na e siiina mai le poloketi mai GitHub, ona i ai lea o auala uma ile faila bot_methods.R.

Code metotia 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')
  }

}

Na matou faia auala 5:

  • amata — Amata se talanoaga
  • setete - Maua le tulaga o talatalanoaga nei
  • toe setiina - Toe setiina le tulaga o talatalanoaga o iai nei
  • enter_name - E fesili le bot mo lou igoa
  • enter_age - E fesili le bot mo lou matua

Metotia start fesili mo lou igoa, ma suia le tulaga o talatalanoaga i faatalitali_igoa, i.e. e tu i luma mo le fa'aofiina o lou igoa.

O le isi, e te lafoina le igoa ma faʻatautaia e le metotia enter_name, faʻafeiloaʻi oe e le bot, tusi le igoa na maua i totonu o faʻamaumauga, ma sui le talatalanoaga i le setete faatalitali_tausaga.

I lenei laʻasaga, o loʻo faʻamoemoe le bot e te ulufale i lou matua. E te lafoina lou tausaga, e siaki e le bot le savali, afai na e lafoina ni tusitusiga nai lo se numera, o le a fai mai: Ты ввёл некорректные данные, введи число, ma o le a fa'atali mo oe e toe fa'aofi lau fa'amaumauga. Afai na e lafoina se numera, o le a lipotia e le bot ua talia lou matua, tusi faʻamaumauga na maua i luga o faʻamaumauga, lipoti uma faʻamatalaga na maua mai ia te oe ma toe faʻafoʻi le talatalanoaga i lona tulaga muamua, i.e. V start.

E ala i le valaʻau i le auala state e mafai ona e talosagaina le tulaga o talatalanoaga o loʻo i ai nei i soo se taimi, ma faʻaaoga le reset toe faafoi le talatalanoaga i lona tulaga muamua.

Filifiliga savali

I la matou tulaga, o se tasi lea o vaega sili ona taua i le fausiaina o se bot. Fa'atasi ai ma le fesoasoani o fa'amama savali o le a malamalama ai le bot po'o a fa'amatalaga o lo'o fa'amoemoeina mai ia te oe ma pe fa'apefea ona fa'agasolo.

I le poloketi i luga GitHub ua resitalaina filiga i le faila message_filters.R.

Fa'ailoga fa'ailoga savali:

# ###########################################################
# 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"
}
)

I totonu o filiga matou te faʻaaogaina le galuega na tusia muamua get_state(), ina ia talosagaina le tulaga oi ai nei o le talatalanoaga. O lenei galuega e manaʻomia naʻo le 1 finauga, chat id.

Sosi filiga faatalitali_igoa fa'agasolo fe'au pe a iai le talatalanoaga i se setete wait_name, ma e tusa ai ma le faamama faatalitali_tausaga fa'agasolo fe'au pe a iai le talatalanoaga i se setete wait_age.

Taulima

O le faila o loʻo i ai faʻatonu e taʻua taulima.R, ma e iai le code lea:

# ###########################################################
# 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)

Muamua matou te faia ni pule faʻatonu e faʻatagaina oe e faʻataʻitaʻiina auala e amata ai se talanoaga, toe setiina, ma fesiligia le tulaga o iai nei.

Ma le isi, matou te fatuina 2 feʻau feʻau e faʻaaoga ai filiga na faia i le laasaga muamua, ma faʻaopoopo se faamama ia i latou !MessageFilters$command, ina ia mafai ona tatou faʻaogaina faʻatonuga i soʻo se setete talatalanoaga.

Fa'ailoga fa'ailoga bot

O lea ua matou saunia mea uma e faʻalauiloa, o le tulafono autu mo le faʻalauiloaina o le bot o loʻo i totonu o le faila 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()

O se taunuuga, na matou maua lenei bot:
Tusia o se pusa telegram i le R (vaega 4): Fausia se talanoaga faifaipea, talafeagai ma le bot

I soo se taimi e faʻaaoga ai le faʻatonuga /state e mafai ona matou fesiligia le tulaga o talatalanoaga o loʻo iai nei, ma faʻaaoga le poloaiga /reset toe faafoi le talatalanoaga i lona tulaga muamua ma toe amata le talanoaga.

iʻuga

I totonu o lenei tusiga, matou te iloa pe faʻapefea ona faʻaogaina se faʻamaumauga i totonu o se bot, ma pe faʻafefea ona fausia faʻasologa faʻatalanoaga talafeagai e ala i le pueina o le tulaga o talatalanoaga.

I lenei tulaga, na matou vaʻavaʻai i le faʻataʻitaʻiga sili ona faʻatupu, ina ia faigofie ai ona e malamalama i le manatu o le fausiaina o ia bots; i le faʻataʻitaʻiga, e mafai ona e fausia ni talanoaga sili atu ona faigata.

I le isi tala i lenei faasologa, o le a tatou aʻoaʻoina pe faʻafefea ona faʻatapulaʻaina aia tatau a tagata faʻaoga bot e faʻaaoga ai ana metotia eseese.

puna: www.habr.com

Faaopoopo i ai se faamatalaga