ProHoster > Blog > Pulega > Tusia o se pusa telegram i le R (vaega 4): Fausia se talanoaga faifaipea, talafeagai ma le bot
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.
O tala uma mai le faasologa " Tusia o se telegram bot i le R"
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:
amata o le tulaga masani o le bot, lea e le faʻamoemoeina se faʻamatalaga mai ia te oe
wait_name - o lo'o fa'atali le bot mo se igoa e tu'uina
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:
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.
Matou te fatuina se fesuiaiga o le siosiomaga lea e teu ai le ala i le poloketi ma le bot.
Matou te fatuina le database lava ia, ma le tele o galuega ina ia mafai e le bot ona fegalegaleai ma ia.
Matou te tusia metotia bot, i.e. galuega o le a ia faatinoina.
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.
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.
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
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:
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.